diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 318754f..93f049a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,20 +8,8 @@ # Combined with branch protection (require PR reviews), this prevents # unauthorized modifications to workflows, configs, and governance files. -# ── Synced workflows (managed by MokoStandards — do not edit manually) ──── -/.github/workflows/deploy-dev.yml @jmiller-moko -/.github/workflows/deploy-demo.yml @jmiller-moko -/.github/workflows/deploy-rs.yml @jmiller-moko -/.github/workflows/auto-release.yml @jmiller-moko -/.github/workflows/auto-dev-issue.yml @jmiller-moko -/.github/workflows/auto-assign.yml @jmiller-moko -/.github/workflows/sync-version-on-merge.yml @jmiller-moko -/.github/workflows/enterprise-firewall-setup.yml @jmiller-moko -/.github/workflows/repository-cleanup.yml @jmiller-moko -/.github/workflows/standards-compliance.yml @jmiller-moko -/.github/workflows/codeql-analysis.yml @jmiller-moko -/.github/workflows/repo_health.yml @jmiller-moko -# Custom workflows in .github/workflows/ not listed above are repo-owned. +# ── Workflows (synced from MokoStandards — must not be manually edited) ── +/.github/workflows/ @jmiller-moko # ── GitHub configuration ───────────────────────────────────────────────── /.github/ISSUE_TEMPLATE/ @jmiller-moko @@ -35,7 +23,7 @@ /composer.json @jmiller-moko /phpstan.neon @jmiller-moko /Makefile @jmiller-moko -/.ftpignore @jmiller-moko +/.ftp_ignore @jmiller-moko /.gitignore @jmiller-moko /.gitattributes @jmiller-moko /.editorconfig @jmiller-moko diff --git a/.github/workflows/auto-dev-issue.yml b/.github/workflows/auto-dev-issue.yml index 38730ab..c167000 100644 --- a/.github/workflows/auto-dev-issue.yml +++ b/.github/workflows/auto-dev-issue.yml @@ -9,22 +9,14 @@ # INGROUP: MokoStandards.Automation # REPO: https://github.com/mokoconsulting-tech/MokoStandards # PATH: /templates/workflows/shared/auto-dev-issue.yml.template -# VERSION: 04.05.13 -# BRIEF: Auto-create tracking issue with sub-issues for dev/rc branch workflow +# VERSION: 04.05.00 +# BRIEF: Auto-create tracking issue when a dev/** or rc/** branch is pushed # NOTE: Synced via bulk-repo-sync to .github/workflows/auto-dev-issue.yml in all governed repos. -name: Dev/RC Branch Issue +name: Auto Dev Branch Issue on: - # Auto-create on RC branch creation create: - # Manual trigger for dev branches - workflow_dispatch: - inputs: - branch: - description: 'Branch name (e.g., dev/my-feature or dev/04.06)' - required: true - type: string env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true @@ -38,20 +30,15 @@ jobs: name: Create version tracking issue runs-on: ubuntu-latest if: >- - (github.event_name == 'workflow_dispatch') || - (github.event.ref_type == 'branch' && startsWith(github.event.ref, 'rc/')) + github.event.ref_type == 'branch' && + (startsWith(github.event.ref, 'dev/') || startsWith(github.event.ref, 'rc/')) steps: - - name: Create tracking issue and sub-issues + - name: Create tracking issue env: GH_TOKEN: ${{ secrets.GH_TOKEN || github.token }} run: | - # For manual dispatch, use input; for auto, use event ref - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - BRANCH="${{ inputs.branch }}" - else - BRANCH="${{ github.event.ref }}" - fi + BRANCH="${{ github.event.ref }}" REPO="${{ github.repository }}" ACTOR="${{ github.actor }}" NOW=$(date -u '+%Y-%m-%d %H:%M UTC') @@ -71,122 +58,45 @@ jobs: TITLE="${TITLE_PREFIX}(${VERSION}): ${BRANCH_TYPE} tracking for ${BRANCH}" + BODY="## ${BRANCH_TYPE} Branch Created + + | Field | Value | + |-------|-------| + | **Branch** | \`${BRANCH}\` | + | **Version** | \`${VERSION}\` | + | **Type** | ${BRANCH_TYPE} | + | **Created by** | @${ACTOR} | + | **Created at** | ${NOW} | + | **Repository** | \`${REPO}\` | + + ## Checklist + + - [ ] Feature development complete + - [ ] Tests passing + - [ ] README.md version bumped to \`${VERSION}\` + - [ ] CHANGELOG.md updated + - [ ] PR created targeting \`main\` + - [ ] Code reviewed and approved + - [ ] Merged to \`main\` + + --- + *Auto-created by [auto-dev-issue.yml](.github/workflows/auto-dev-issue.yml) on branch creation.*" + + # Dedent heredoc + BODY=$(echo "$BODY" | sed 's/^ //') + # Check for existing issue with same title prefix - EXISTING=$(gh api "repos/${REPO}/issues?state=open&per_page=10" \ + EXISTING=$(gh api "repos/${REPO}/issues?state=open&per_page=5" \ --jq ".[] | select(.title | startswith(\"${TITLE_PREFIX}(${VERSION})\")) | .number" 2>/dev/null | head -1) if [ -n "$EXISTING" ]; then echo "ℹ️ Issue #${EXISTING} already exists for ${VERSION}" >> $GITHUB_STEP_SUMMARY - exit 0 - fi - - # ── Define sub-issues for the dev workflow ──────────────────────── - if [[ "$BRANCH" == rc/* ]]; then - SUB_ISSUES=( - "RC Testing|Verify all features work on rc branch|type: test,release-candidate" - "Regression Testing|Run full regression suite before merge to main|type: test,release-candidate" - "Version Bump|Bump version in README.md and all headers|type: version,release-candidate" - "Changelog Update|Update CHANGELOG.md with release notes|documentation,release-candidate" - "Merge to Main|Create PR from rc branch to main|type: release,needs-review" - ) else - SUB_ISSUES=( - "Development|Implement feature/fix on dev branch|type: feature,status: in-progress" - "Unit Testing|Write and pass unit tests|type: test,status: pending" - "Code Review|Request and complete code review|needs-review,status: pending" - "Version Bump|Bump version in README.md and all headers|type: version,status: pending" - "Changelog Update|Update CHANGELOG.md with release notes|documentation,status: pending" - "Create RC Branch|Promote dev to rc branch for final testing|type: release,status: pending" - "Merge to Main|Create PR from rc/dev to main|type: release,needs-review,status: pending" - ) - fi - - # ── Create sub-issues first ─────────────────────────────────────── - SUB_LIST="" - SUB_NUMBERS="" - for SUB in "${SUB_ISSUES[@]}"; do - IFS='|' read -r SUB_TITLE SUB_DESC SUB_LABELS <<< "$SUB" - SUB_FULL_TITLE="${TITLE_PREFIX}(${VERSION}): ${SUB_TITLE}" - - SUB_BODY=$(printf '### %s\n\n%s\n\n| Field | Value |\n|-------|-------|\n| **Parent Branch** | `%s` |\n| **Version** | `%s` |\n\n---\n*Sub-issue of the %s tracking issue for `%s`.*' \ - "$SUB_TITLE" "$SUB_DESC" "$BRANCH" "$VERSION" "$BRANCH_TYPE" "$BRANCH") - - SUB_URL=$(gh issue create \ + ISSUE_URL=$(gh issue create \ --repo "$REPO" \ - --title "$SUB_FULL_TITLE" \ - --body "$SUB_BODY" \ - --label "${SUB_LABELS}" \ + --title "$TITLE" \ + --body "$BODY" \ + --label "${LABEL_TYPE},version" \ --assignee "jmiller-moko" 2>&1) - - SUB_NUM=$(echo "$SUB_URL" | grep -oE '[0-9]+$') - if [ -n "$SUB_NUM" ]; then - SUB_LIST="${SUB_LIST}\n- [ ] ${SUB_TITLE} (#${SUB_NUM})" - SUB_NUMBERS="${SUB_NUMBERS} #${SUB_NUM}" - fi - sleep 0.3 - done - - # ── Create parent tracking issue ────────────────────────────────── - PARENT_BODY=$(printf '## %s Branch Created\n\n| Field | Value |\n|-------|-------|\n| **Branch** | `%s` |\n| **Version** | `%s` |\n| **Type** | %s |\n| **Created by** | @%s |\n| **Created at** | %s |\n| **Repository** | `%s` |\n\n## Workflow Sub-Issues\n\n%b\n\n---\n*Auto-created by [auto-dev-issue.yml](.github/workflows/auto-dev-issue.yml) on branch creation.*' \ - "$BRANCH_TYPE" "$BRANCH" "$VERSION" "$BRANCH_TYPE" "$ACTOR" "$NOW" "$REPO" "$SUB_LIST") - - PARENT_URL=$(gh issue create \ - --repo "$REPO" \ - --title "$TITLE" \ - --body "$PARENT_BODY" \ - --label "${LABEL_TYPE},version" \ - --assignee "jmiller-moko" 2>&1) - - PARENT_NUM=$(echo "$PARENT_URL" | grep -oE '[0-9]+$') - - # ── Link sub-issues back to parent ──────────────────────────────── - if [ -n "$PARENT_NUM" ]; then - for SUB in "${SUB_ISSUES[@]}"; do - IFS='|' read -r SUB_TITLE _ _ <<< "$SUB" - SUB_FULL_TITLE="${TITLE_PREFIX}(${VERSION}): ${SUB_TITLE}" - SUB_NUM=$(gh api "repos/${REPO}/issues?state=open&per_page=20" \ - --jq ".[] | select(.title == \"${SUB_FULL_TITLE}\") | .number" 2>/dev/null | head -1) - if [ -n "$SUB_NUM" ]; then - gh api "repos/${REPO}/issues/${SUB_NUM}" -X PATCH \ - -f body="$(gh api "repos/${REPO}/issues/${SUB_NUM}" --jq '.body' 2>/dev/null) - - > **Parent Issue:** #${PARENT_NUM}" --silent 2>/dev/null || true - fi - sleep 0.2 - done + echo "✅ Created tracking issue: ${ISSUE_URL}" >> $GITHUB_STEP_SUMMARY fi - - # ── RC: Create or update draft release ──────────────────────────── - if [[ "$BRANCH" == rc/* ]]; then - MAJOR=$(echo "$VERSION" | awk -F. '{print $1}') - RELEASE_TAG="v${MAJOR}" - DRAFT_EXISTS=$(gh release view "$RELEASE_TAG" --json isDraft -q .isDraft 2>/dev/null || true) - - if [ -z "$DRAFT_EXISTS" ]; then - # No release exists — create draft - gh release create "$RELEASE_TAG" \ - --title "v${MAJOR} (RC: ${VERSION})" \ - --notes "## Release Candidate ${VERSION}\n\nRC branch: \`${BRANCH}\`\nTracking issue: ${PARENT_URL}" \ - --draft \ - --target main 2>/dev/null || true - echo "Draft release created: ${RELEASE_TAG}" >> $GITHUB_STEP_SUMMARY - elif [ "$DRAFT_EXISTS" = "true" ]; then - # Draft exists — update title - gh release edit "$RELEASE_TAG" \ - --title "v${MAJOR} (RC: ${VERSION})" --draft 2>/dev/null || true - echo "Draft release updated: ${RELEASE_TAG}" >> $GITHUB_STEP_SUMMARY - else - # Release exists and is published — set back to draft for RC - gh release edit "$RELEASE_TAG" \ - --title "v${MAJOR} (RC: ${VERSION})" --draft 2>/dev/null || true - echo "Release ${RELEASE_TAG} set to draft for RC" >> $GITHUB_STEP_SUMMARY - fi - fi - - # ── Summary ─────────────────────────────────────────────────────── - echo "## Dev Workflow Issues Created" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Item | Issue |" >> $GITHUB_STEP_SUMMARY - echo "|------|-------|" >> $GITHUB_STEP_SUMMARY - echo "| **Parent** | ${PARENT_URL} |" >> $GITHUB_STEP_SUMMARY - echo "| **Sub-issues** |${SUB_NUMBERS} |" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml index f53572f..5462926 100644 --- a/.github/workflows/auto-release.yml +++ b/.github/workflows/auto-release.yml @@ -6,31 +6,29 @@ # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Release # REPO: https://github.com/mokoconsulting-tech/MokoStandards -# PATH: /templates/workflows/joomla/auto-release.yml.template -# VERSION: 04.05.13 -# BRIEF: Joomla build & release — ZIP package, update.xml, SHA-256 checksum +# PATH: /templates/workflows/shared/auto-release.yml.template +# VERSION: 04.05.00 +# BRIEF: Unified build & release pipeline — version branch, platform version, badges, tag, release # -# +========================================================================+ -# | BUILD & RELEASE PIPELINE (JOOMLA) | -# +========================================================================+ -# | | -# | Triggers on push to main (skips bot commits + [skip ci]): | -# | | -# | Every push: | -# | 1. Read version from README.md | -# | 3. Set platform version (Joomla ) | -# | 4. Update [VERSION: XX.YY.ZZ] badges in markdown files | -# | 5. Write update.xml (Joomla update server XML) | -# | 6. Create git tag vXX.YY.ZZ | -# | 7a. Patch: update existing GitHub Release for this minor | -# | 8. Build ZIP, upload asset, write SHA-256 to update.xml | -# | | -# | Every version change: archives main -> version/XX.YY branch | -# | Patch 00 = development (no release). First release = patch 01. | -# | First release only (patch == 01): | -# | 7b. Create new GitHub Release | -# | | -# +========================================================================+ +# ╔════════════════════════════════════════════════════════════════════════╗ +# ║ BUILD & RELEASE PIPELINE ║ +# ╠════════════════════════════════════════════════════════════════════════╣ +# ║ ║ +# ║ Triggers on push to main (skips bot commits + [skip ci]): ║ +# ║ ║ +# ║ Every push: ║ +# ║ 1. Read version from README.md ║ +# ║ 3. Set platform version (Dolibarr $this->version, Joomla )║ +# ║ 4. Update [VERSION: XX.YY.ZZ] badges in markdown files ║ +# ║ 5. Write update.txt / update.xml ║ +# ║ 6. Create git tag vXX.YY.ZZ ║ +# ║ 7a. Patch: update existing GitHub Release for this minor ║ +# ║ ║ +# ║ Minor releases only (patch == 00): ║ +# ║ 2. Create/update version/XX.YY branch (patches update in-place) ║ +# ║ 7b. Create new GitHub Release ║ +# ║ ║ +# ╚════════════════════════════════════════════════════════════════════════╝ name: Build & Release @@ -72,13 +70,13 @@ jobs: cd /tmp/mokostandards composer install --no-dev --no-interaction --quiet - # -- STEP 1: Read version ----------------------------------------------- + # ── STEP 1: Read version ─────────────────────────────────────────── - name: "Step 1: Read version from README.md" id: version run: | VERSION=$(php /tmp/mokostandards/api/cli/version_read.php --path . 2>/dev/null) if [ -z "$VERSION" ]; then - echo "No VERSION in README.md — skipping release" + echo "⏭️ No VERSION in README.md — skipping release" echo "skip=true" >> "$GITHUB_OUTPUT" exit 0 fi @@ -86,34 +84,24 @@ jobs: MINOR=$(echo "$VERSION" | awk -F. '{printf "%s.%s", $1, $2}') PATCH=$(echo "$VERSION" | awk -F. '{print $3}') - MAJOR=$(echo "$VERSION" | awk -F. '{print $1}') - MINOR_NUM=$(echo "$VERSION" | awk -F. '{print $2}') - echo "version=$VERSION" >> "$GITHUB_OUTPUT" + echo "tag=v${VERSION}" >> "$GITHUB_OUTPUT" echo "branch=version/${MINOR}" >> "$GITHUB_OUTPUT" echo "minor=$MINOR" >> "$GITHUB_OUTPUT" - echo "major=$MAJOR" >> "$GITHUB_OUTPUT" - echo "release_tag=v${MAJOR}" >> "$GITHUB_OUTPUT" + echo "skip=false" >> "$GITHUB_OUTPUT" if [ "$PATCH" = "00" ]; then - echo "skip=true" >> "$GITHUB_OUTPUT" - echo "is_minor=false" >> "$GITHUB_OUTPUT" - echo "Version: $VERSION (patch 00 = development — skipping release)" + echo "is_minor=true" >> "$GITHUB_OUTPUT" + echo "✅ Version: $VERSION (minor release — full pipeline)" else - echo "skip=false" >> "$GITHUB_OUTPUT" - if [ "$PATCH" = "01" ]; then - echo "is_minor=true" >> "$GITHUB_OUTPUT" - echo "Version: $VERSION (first release — full pipeline)" - else - echo "is_minor=false" >> "$GITHUB_OUTPUT" - echo "Version: $VERSION (patch — platform version + badges only)" - fi + echo "is_minor=false" >> "$GITHUB_OUTPUT" + echo "✅ Version: $VERSION (patch — platform version + badges only)" fi - name: Check if already released if: steps.version.outputs.skip != 'true' id: check run: | - TAG="${{ steps.version.outputs.release_tag }}" + TAG="${{ steps.version.outputs.tag }}" BRANCH="${{ steps.version.outputs.branch }}" TAG_EXISTS=false @@ -131,109 +119,102 @@ jobs: echo "already_released=false" >> "$GITHUB_OUTPUT" fi - # -- SANITY CHECKS ------------------------------------------------------- - - name: "Sanity: Pre-release validation" + # ── SANITY CHECKS ──────────────────────────────────────────────────── + - name: "Sanity: Platform-specific validation" if: >- steps.version.outputs.skip != 'true' && steps.check.outputs.already_released != 'true' run: | VERSION="${{ steps.version.outputs.version }}" + PLATFORM=$(php /tmp/mokostandards/api/cli/platform_detect.php --path . 2>/dev/null) ERRORS=0 - echo "## Pre-Release Sanity Checks (Joomla)" >> $GITHUB_STEP_SUMMARY + echo "## 🔍 Pre-Release Sanity Checks" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Platform: \`${PLATFORM}\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - - # -- Version drift check (must pass before release) -------- - README_VER=$(grep -oP 'VERSION:\s*\K[\d.]+' README.md 2>/dev/null | head -1) - if [ "$README_VER" != "$VERSION" ]; then - echo "- Version drift: README says \`${README_VER}\` but releasing \`${VERSION}\`" >> $GITHUB_STEP_SUMMARY - ERRORS=$((ERRORS+1)) - else - echo "- Version consistent: \`${VERSION}\`" >> $GITHUB_STEP_SUMMARY - fi - - # Check CHANGELOG version matches - CL_VER=$(grep -oP 'VERSION:\s*\K[\d.]+' CHANGELOG.md 2>/dev/null | head -1) - if [ -n "$CL_VER" ] && [ "$CL_VER" != "$VERSION" ]; then - echo "- CHANGELOG drift: \`${CL_VER}\` != \`${VERSION}\`" >> $GITHUB_STEP_SUMMARY - ERRORS=$((ERRORS+1)) - fi - - # Check composer.json version if present - if [ -f "composer.json" ]; then - COMP_VER=$(grep -oP '"version"\s*:\s*"\K[^"]+' composer.json 2>/dev/null | head -1) - if [ -n "$COMP_VER" ] && [ "$COMP_VER" != "$VERSION" ]; then - echo "- composer.json drift: \`${COMP_VER}\` != \`${VERSION}\`" >> $GITHUB_STEP_SUMMARY - ERRORS=$((ERRORS+1)) - fi - fi # Common checks if [ ! -f "LICENSE" ]; then - echo "- Missing LICENSE file" >> $GITHUB_STEP_SUMMARY + echo "❌ Missing LICENSE file" >> $GITHUB_STEP_SUMMARY ERRORS=$((ERRORS+1)) else - echo "- LICENSE present" >> $GITHUB_STEP_SUMMARY + echo "✅ LICENSE" >> $GITHUB_STEP_SUMMARY fi - if [ ! -d "src" ] && [ ! -d "htdocs" ]; then - echo "- Warning: No src/ or htdocs/ directory" >> $GITHUB_STEP_SUMMARY + if [ ! -d "src" ]; then + echo "⚠️ No src/ directory" >> $GITHUB_STEP_SUMMARY else - echo "- Source directory present" >> $GITHUB_STEP_SUMMARY + echo "✅ src/ directory" >> $GITHUB_STEP_SUMMARY fi - # -- Joomla: manifest version drift -------- - MANIFEST=$(find . -maxdepth 2 -name "*.xml" -exec grep -l '/dev/null | head -1) - if [ -n "$MANIFEST" ]; then - XML_VER=$(grep -oP '\K[^<]+' "$MANIFEST" 2>/dev/null | head -1) - if [ -n "$XML_VER" ] && [ "$XML_VER" != "$VERSION" ]; then - echo "- Manifest drift: \`${XML_VER}\` != \`${VERSION}\`" >> $GITHUB_STEP_SUMMARY + # Dolibarr-specific checks + if [ "$PLATFORM" = "crm-module" ]; then + MOD_FILE=$(find src htdocs -path "*/core/modules/mod*.class.php" -print -quit 2>/dev/null) + if [ -z "$MOD_FILE" ]; then + echo "❌ No module descriptor (src/core/modules/mod*.class.php)" >> $GITHUB_STEP_SUMMARY ERRORS=$((ERRORS+1)) else - echo "- Manifest version: \`${VERSION}\`" >> $GITHUB_STEP_SUMMARY + echo "✅ Module descriptor: \`${MOD_FILE}\`" >> $GITHUB_STEP_SUMMARY + + # Check module number + NUMERO=$(grep -oP '\$this->numero\s*=\s*\K\d+' "$MOD_FILE" 2>/dev/null || echo "0") + if [ "$NUMERO" = "0" ] || [ -z "$NUMERO" ]; then + echo "❌ Module number (\$this->numero) is 0 or not set" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS+1)) + else + echo "✅ Module number: ${NUMERO}" >> $GITHUB_STEP_SUMMARY + fi + + # Check url_last_version exists + if grep -q 'url_last_version' "$MOD_FILE" 2>/dev/null; then + echo "✅ url_last_version is set" >> $GITHUB_STEP_SUMMARY + else + echo "⚠️ url_last_version not set — update checks won't work" >> $GITHUB_STEP_SUMMARY + fi fi fi - # -- Joomla: XML manifest existence -------- - if [ -z "$MANIFEST" ]; then - echo "- No Joomla XML manifest found" >> $GITHUB_STEP_SUMMARY - ERRORS=$((ERRORS+1)) - else - echo "- Manifest: \`${MANIFEST}\`" >> $GITHUB_STEP_SUMMARY + # Joomla-specific checks + if [ "$PLATFORM" = "waas-component" ]; then + MANIFEST=$(find . -maxdepth 2 -name "*.xml" -exec grep -l '/dev/null | head -1) + if [ -z "$MANIFEST" ]; then + echo "❌ No Joomla XML manifest found" >> $GITHUB_STEP_SUMMARY + ERRORS=$((ERRORS+1)) + else + echo "✅ Manifest: \`${MANIFEST}\`" >> $GITHUB_STEP_SUMMARY - # -- Joomla: extension type check -------- - TYPE=$(grep -oP ']+type="\K[^"]+' "$MANIFEST" 2>/dev/null) - echo "- Extension type: ${TYPE:-unknown}" >> $GITHUB_STEP_SUMMARY + # Check extension type + TYPE=$(grep -oP ']+type="\K[^"]+' "$MANIFEST" 2>/dev/null) + echo "✅ Extension type: ${TYPE:-unknown}" >> $GITHUB_STEP_SUMMARY + fi fi echo "" >> $GITHUB_STEP_SUMMARY if [ "$ERRORS" -gt 0 ]; then - echo "**${ERRORS} error(s) — release may be incomplete**" >> $GITHUB_STEP_SUMMARY + echo "**❌ ${ERRORS} error(s) — release may be incomplete**" >> $GITHUB_STEP_SUMMARY else - echo "**All sanity checks passed**" >> $GITHUB_STEP_SUMMARY + echo "**✅ All sanity checks passed**" >> $GITHUB_STEP_SUMMARY fi - # -- STEP 2: Create or update version/XX.YY archive branch --------------- - # Always runs — every version change on main archives to version/XX.YY - - name: "Step 2: Version archive branch" - if: steps.check.outputs.already_released != 'true' + # ── STEP 2: Create or update version/XX.YY branch ────────────────── + - name: "Step 2: Version branch" + if: >- + steps.version.outputs.skip != 'true' && + steps.check.outputs.already_released != 'true' run: | BRANCH="${{ steps.version.outputs.branch }}" IS_MINOR="${{ steps.version.outputs.is_minor }}" - PATCH="${{ steps.version.outputs.version }}" - PATCH_NUM=$(echo "$PATCH" | awk -F. '{print $3}') - - # Check if branch exists - if git ls-remote --heads origin "$BRANCH" | grep -q "$BRANCH"; then - git push origin HEAD:"$BRANCH" --force - echo "Updated archive branch: ${BRANCH} (patch ${PATCH_NUM})" >> $GITHUB_STEP_SUMMARY - else + if [ "$IS_MINOR" = "true" ]; then git checkout -b "$BRANCH" 2>/dev/null || git checkout "$BRANCH" git push origin "$BRANCH" --force - echo "Created archive branch: ${BRANCH}" >> $GITHUB_STEP_SUMMARY + echo "🌿 Created branch: ${BRANCH}" >> $GITHUB_STEP_SUMMARY + else + git push origin HEAD:"$BRANCH" --force + echo "📝 Updated branch: ${BRANCH} (patch)" >> $GITHUB_STEP_SUMMARY fi - # -- STEP 3: Set platform version ---------------------------------------- + # ── STEP 3: Set platform version ─────────────────────────────────── - name: "Step 3: Set platform version" if: >- steps.version.outputs.skip != 'true' && @@ -243,7 +224,7 @@ jobs: php /tmp/mokostandards/api/cli/version_set_platform.php \ --path . --version "$VERSION" --branch main - # -- STEP 4: Update version badges ---------------------------------------- + # ── STEP 4: Update version badges ────────────────────────────────── - name: "Step 4: Update version badges" if: >- steps.version.outputs.skip != 'true' && @@ -256,100 +237,107 @@ jobs: fi done - # -- STEP 5: Write update.xml (Joomla update server) --------------------- - - name: "Step 5: Write update.xml" + # ── STEP 5: Write update files (Dolibarr: update.txt / Joomla: update.xml) + - name: "Step 5: Write update files" if: >- steps.version.outputs.skip != 'true' && steps.check.outputs.already_released != 'true' run: | + PLATFORM=$(php /tmp/mokostandards/api/cli/platform_detect.php --path . 2>/dev/null) VERSION="${{ steps.version.outputs.version }}" REPO="${{ github.repository }}" - # -- Parse extension metadata from XML manifest ---------------- - MANIFEST=$(find . -maxdepth 2 -name "*.xml" -exec grep -l '/dev/null | head -1) - if [ -z "$MANIFEST" ]; then - echo "Warning: No Joomla XML manifest found — skipping update.xml" >> $GITHUB_STEP_SUMMARY - exit 0 + if [ "$PLATFORM" = "crm-module" ]; then + printf '%s' "$VERSION" > update.txt + echo "📦 update.txt: ${VERSION}" >> $GITHUB_STEP_SUMMARY fi - EXT_NAME=$(grep -oP '\K[^<]+' "$MANIFEST" 2>/dev/null | head -1 || echo "${{ github.event.repository.name }}") - EXT_TYPE=$(grep -oP ']+type="\K[^"]+' "$MANIFEST" 2>/dev/null || echo "component") - EXT_ELEMENT=$(grep -oP '\K[^<]+' "$MANIFEST" 2>/dev/null | head -1 || echo "") - EXT_CLIENT=$(grep -oP ']+client="\K[^"]+' "$MANIFEST" 2>/dev/null || echo "") - EXT_FOLDER=$(grep -oP ']+group="\K[^"]+' "$MANIFEST" 2>/dev/null || echo "") - TARGET_PLATFORM=$(grep -oP '' "$MANIFEST" 2>/dev/null | head -1 || echo "") - PHP_MINIMUM=$(grep -oP '\K[^<]+' "$MANIFEST" 2>/dev/null | head -1 || echo "") + if [ "$PLATFORM" = "waas-component" ]; then + # ── Parse extension metadata from XML manifest ────────────── + MANIFEST=$(find . -maxdepth 2 -name "*.xml" -exec grep -l '/dev/null | head -1) + if [ -z "$MANIFEST" ]; then + echo "⚠️ No Joomla XML manifest found — skipping update.xml" >> $GITHUB_STEP_SUMMARY + else + EXT_NAME=$(grep -oP '\K[^<]+' "$MANIFEST" 2>/dev/null | head -1 || echo "${{ github.event.repository.name }}") + EXT_TYPE=$(grep -oP ']+type="\K[^"]+' "$MANIFEST" 2>/dev/null || echo "component") + EXT_ELEMENT=$(grep -oP '\K[^<]+' "$MANIFEST" 2>/dev/null | head -1 || echo "") + EXT_CLIENT=$(grep -oP ']+client="\K[^"]+' "$MANIFEST" 2>/dev/null || echo "") + EXT_FOLDER=$(grep -oP ']+group="\K[^"]+' "$MANIFEST" 2>/dev/null || echo "") + TARGET_PLATFORM=$(grep -oP '' "$MANIFEST" 2>/dev/null | head -1 || echo "") + PHP_MINIMUM=$(grep -oP '\K[^<]+' "$MANIFEST" 2>/dev/null | head -1 || echo "") - # Derive element from manifest filename if not in XML - if [ -z "$EXT_ELEMENT" ]; then - EXT_ELEMENT=$(basename "$MANIFEST" .xml) + # Derive element from manifest filename if not in XML + if [ -z "$EXT_ELEMENT" ]; then + EXT_ELEMENT=$(basename "$MANIFEST" .xml) + fi + + # Build client tag: plugins and frontend modules need site + CLIENT_TAG="" + if [ -n "$EXT_CLIENT" ]; then + CLIENT_TAG="${EXT_CLIENT}" + elif [ "$EXT_TYPE" = "module" ] || [ "$EXT_TYPE" = "plugin" ]; then + CLIENT_TAG="site" + fi + + # Build folder tag for plugins (required for Joomla to match the update) + FOLDER_TAG="" + if [ -n "$EXT_FOLDER" ] && [ "$EXT_TYPE" = "plugin" ]; then + FOLDER_TAG="${EXT_FOLDER}" + fi + + # Build targetplatform (fallback to Joomla 5+6 if not in manifest) + if [ -z "$TARGET_PLATFORM" ]; then + TARGET_PLATFORM=$(printf '' "/") + fi + + # Build php_minimum tag + PHP_TAG="" + if [ -n "$PHP_MINIMUM" ]; then + PHP_TAG="${PHP_MINIMUM}" + fi + + DOWNLOAD_URL="https://github.com/${REPO}/releases/download/v${VERSION}/${EXT_ELEMENT}-${VERSION}.zip" + INFO_URL="https://github.com/${REPO}/releases/tag/v${VERSION}" + + # ── Write update.xml (stable release) ─────────────────────── + { + printf '%s\n' '' + printf '%s\n' '' + printf '%s\n' ' ' + printf '%s\n' " ${EXT_NAME}" + printf '%s\n' " ${EXT_NAME} update" + printf '%s\n' " ${EXT_ELEMENT}" + printf '%s\n' " ${EXT_TYPE}" + printf '%s\n' " ${VERSION}" + [ -n "$CLIENT_TAG" ] && printf '%s\n' " ${CLIENT_TAG}" + [ -n "$FOLDER_TAG" ] && printf '%s\n' " ${FOLDER_TAG}" + printf '%s\n' ' ' + printf '%s\n' ' stable' + printf '%s\n' ' ' + printf '%s\n' " ${INFO_URL}" + printf '%s\n' ' ' + printf '%s\n' " ${DOWNLOAD_URL}" + printf '%s\n' ' ' + printf '%s\n' " ${TARGET_PLATFORM}" + [ -n "$PHP_TAG" ] && printf '%s\n' " ${PHP_TAG}" + printf '%s\n' ' Moko Consulting' + printf '%s\n' ' https://mokoconsulting.tech' + printf '%s\n' ' ' + printf '%s\n' '' + } > update.xml + + echo "📦 update.xml: ${VERSION} (stable) — ${EXT_TYPE}/${EXT_ELEMENT}" >> $GITHUB_STEP_SUMMARY + fi fi - # Build client tag: plugins and frontend modules need site - CLIENT_TAG="" - if [ -n "$EXT_CLIENT" ]; then - CLIENT_TAG="${EXT_CLIENT}" - elif [ "$EXT_TYPE" = "module" ] || [ "$EXT_TYPE" = "plugin" ]; then - CLIENT_TAG="site" - fi - - # Build folder tag for plugins (required for Joomla to match the update) - FOLDER_TAG="" - if [ -n "$EXT_FOLDER" ] && [ "$EXT_TYPE" = "plugin" ]; then - FOLDER_TAG="${EXT_FOLDER}" - fi - - # Build targetplatform (fallback to Joomla 5 if not in manifest) - if [ -z "$TARGET_PLATFORM" ]; then - TARGET_PLATFORM=$(printf '' "/") - fi - - # Build php_minimum tag - PHP_TAG="" - if [ -n "$PHP_MINIMUM" ]; then - PHP_TAG="${PHP_MINIMUM}" - fi - - DOWNLOAD_URL="https://github.com/${REPO}/releases/download/v${VERSION}/${EXT_ELEMENT}-${VERSION}.zip" - INFO_URL="https://github.com/${REPO}/releases/tag/v${VERSION}" - - # -- Write update.xml (stable release) -------------------------- - { - printf '%s\n' '' - printf '%s\n' '' - printf '%s\n' ' ' - printf '%s\n' " ${EXT_NAME}" - printf '%s\n' " ${EXT_NAME} update" - printf '%s\n' " ${EXT_ELEMENT}" - printf '%s\n' " ${EXT_TYPE}" - printf '%s\n' " ${VERSION}" - [ -n "$CLIENT_TAG" ] && printf '%s\n' " ${CLIENT_TAG}" - [ -n "$FOLDER_TAG" ] && printf '%s\n' " ${FOLDER_TAG}" - printf '%s\n' ' ' - printf '%s\n' ' stable' - printf '%s\n' ' ' - printf '%s\n' " ${INFO_URL}" - printf '%s\n' ' ' - printf '%s\n' " ${DOWNLOAD_URL}" - printf '%s\n' ' ' - printf '%s\n' " ${TARGET_PLATFORM}" - [ -n "$PHP_TAG" ] && printf '%s\n' " ${PHP_TAG}" - printf '%s\n' ' Moko Consulting' - printf '%s\n' ' https://mokoconsulting.tech' - printf '%s\n' ' ' - printf '%s\n' '' - } > update.xml - - echo "update.xml: ${VERSION} (stable) — ${EXT_TYPE}/${EXT_ELEMENT}" >> $GITHUB_STEP_SUMMARY - - # -- Commit all changes --------------------------------------------------- + # ── Commit all changes ───────────────────────────────────────────── - name: Commit release changes if: >- steps.version.outputs.skip != 'true' && steps.check.outputs.already_released != 'true' run: | if git diff --quiet && git diff --cached --quiet; then - echo "No changes to commit" + echo "ℹ️ No changes to commit" exit 0 fi VERSION="${{ steps.version.outputs.version }}" @@ -360,25 +348,18 @@ jobs: --author="github-actions[bot] " git push - # -- STEP 6: Create tag --------------------------------------------------- + # ── STEP 6: Create tag ───────────────────────────────────────────── - name: "Step 6: Create git tag" if: >- steps.version.outputs.skip != 'true' && - steps.check.outputs.tag_exists != 'true' && - steps.version.outputs.is_minor == 'true' + steps.check.outputs.tag_exists != 'true' run: | - RELEASE_TAG="${{ steps.version.outputs.release_tag }}" - # Only create the major release tag if it doesn't exist yet - if ! git rev-parse "$RELEASE_TAG" >/dev/null 2>&1; then - git tag "$RELEASE_TAG" - git push origin "$RELEASE_TAG" - echo "Tag created: ${RELEASE_TAG}" >> $GITHUB_STEP_SUMMARY - else - echo "Tag ${RELEASE_TAG} already exists" >> $GITHUB_STEP_SUMMARY - fi - echo "Tag: ${TAG}" >> $GITHUB_STEP_SUMMARY + TAG="${{ steps.version.outputs.tag }}" + git tag "$TAG" + git push origin "$TAG" + echo "🏷️ Tag: ${TAG}" >> $GITHUB_STEP_SUMMARY - # -- STEP 7: Create or update GitHub Release ------------------------------ + # ── STEP 7: Create or update GitHub Release ────────────────────────── - name: "Step 7: GitHub Release" if: >- steps.version.outputs.skip != 'true' && @@ -387,129 +368,67 @@ jobs: GH_TOKEN: ${{ secrets.GH_TOKEN || github.token }} run: | VERSION="${{ steps.version.outputs.version }}" - RELEASE_TAG="${{ steps.version.outputs.release_tag }}" + TAG="${{ steps.version.outputs.tag }}" BRANCH="${{ steps.version.outputs.branch }}" - MAJOR="${{ steps.version.outputs.major }}" + IS_MINOR="${{ steps.version.outputs.is_minor }}" + + # Derive the minor version base (XX.YY.00) + MINOR_BASE=$(echo "$VERSION" | sed 's/\.[0-9]*$/.00/') + MINOR_TAG="v${MINOR_BASE}" NOTES=$(php /tmp/mokostandards/api/cli/release_notes.php --path . --version "$VERSION" 2>/dev/null) [ -z "$NOTES" ] && NOTES="Release ${VERSION}" echo "$NOTES" > /tmp/release_notes.md - # Check if the major release already exists - EXISTING=$(gh release view "$RELEASE_TAG" --json tagName -q .tagName 2>/dev/null || true) - - if [ -z "$EXISTING" ]; then - # First release for this major - gh release create "$RELEASE_TAG" \ - --title "v${MAJOR} (latest: ${VERSION})" \ + if [ "$IS_MINOR" = "true" ]; then + # Minor release: create new GitHub Release + gh release create "$TAG" \ + --title "${VERSION}" \ --notes-file /tmp/release_notes.md \ --target "$BRANCH" - echo "Release created: ${RELEASE_TAG} (${VERSION})" >> $GITHUB_STEP_SUMMARY + echo "🚀 Release created: ${VERSION}" >> $GITHUB_STEP_SUMMARY else - # Append version notes to existing major release - CURRENT_NOTES=$(gh release view "$RELEASE_TAG" --json body -q .body 2>/dev/null || true) - { - echo "$CURRENT_NOTES" - echo "" - echo "---" - echo "### ${VERSION}" - echo "" - cat /tmp/release_notes.md - } > /tmp/updated_notes.md + # Patch release: update the existing minor release with new tag + # Find the latest release for this minor version + EXISTING=$(gh release view "$MINOR_TAG" --json tagName -q .tagName 2>/dev/null || true) + if [ -n "$EXISTING" ]; then + # Update existing release body with patch info + CURRENT_NOTES=$(gh release view "$MINOR_TAG" --json body -q .body 2>/dev/null || true) + { + echo "$CURRENT_NOTES" + echo "" + echo "---" + echo "### Patch ${VERSION}" + echo "" + cat /tmp/release_notes.md + } > /tmp/updated_notes.md - gh release edit "$RELEASE_TAG" \ - --title "v${MAJOR} (latest: ${VERSION})" \ - --notes-file /tmp/updated_notes.md - echo "Release updated: ${RELEASE_TAG} -> ${VERSION}" >> $GITHUB_STEP_SUMMARY - fi - - # -- STEP 8: Build Joomla install ZIP + SHA-256 checksum ------------------ - # Every patch builds an install-ready ZIP and uploads it to the minor release. - # Result: one Release per minor version with a ZIP for each patch. - - name: "Step 8: Build Joomla package and update checksum" - if: >- - steps.version.outputs.skip != 'true' - env: - GH_TOKEN: ${{ secrets.GH_TOKEN || github.token }} - run: | - VERSION="${{ steps.version.outputs.version }}" - RELEASE_TAG="${{ steps.version.outputs.release_tag }}" - REPO="${{ github.repository }}" - - # All ZIPs upload to the major release tag (vXX) - gh release view "$RELEASE_TAG" --json tagName > /dev/null 2>&1 || { - echo "No release ${RELEASE_TAG} found — skipping ZIP upload" - exit 0 - } - - # Find extension element name from manifest - MANIFEST=$(find . -maxdepth 2 -name "*.xml" -exec grep -l '/dev/null | head -1 || true) - [ -z "$MANIFEST" ] && exit 0 - - EXT_ELEMENT=$(grep -oP '\K[^<]+' "$MANIFEST" 2>/dev/null | head -1 || basename "$MANIFEST" .xml) - PACKAGE_NAME="${EXT_ELEMENT}-${VERSION}.zip" - - # -- Build install-ready ZIP from src/ ---------------------------- - SOURCE_DIR="src" - [ ! -d "$SOURCE_DIR" ] && SOURCE_DIR="htdocs" - [ ! -d "$SOURCE_DIR" ] && { echo "No src/ or htdocs/ — skipping package"; exit 0; } - - cd "$SOURCE_DIR" - zip -r "/tmp/${PACKAGE_NAME}" . -x '*.git*' '*.DS_Store' 'Thumbs.db' '*.log' - cd .. - - FILESIZE=$(stat -c%s "/tmp/${PACKAGE_NAME}" 2>/dev/null || stat -f%z "/tmp/${PACKAGE_NAME}" 2>/dev/null || echo "unknown") - - # -- Calculate SHA-256 ------------------------------------------- - SHA256=$(sha256sum "/tmp/${PACKAGE_NAME}" | cut -d' ' -f1) - - # -- Upload ZIP to the minor release tag ------------------------- - gh release upload "$RELEASE_TAG" "/tmp/${PACKAGE_NAME}" --clobber 2>/dev/null || { - echo "Could not upload with --clobber, retrying..." - gh release upload "$RELEASE_TAG" "/tmp/${PACKAGE_NAME}" 2>/dev/null || true - } - - # -- Update update.xml with SHA-256 for latest patch ------------- - if [ -f "update.xml" ]; then - if grep -q '' update.xml; then - sed -i "s|.*|sha256:${SHA256}|" update.xml + gh release edit "$MINOR_TAG" \ + --title "${MINOR_BASE} (latest: ${VERSION})" \ + --notes-file /tmp/updated_notes.md + echo "📝 Release updated: ${MINOR_BASE} → patch ${VERSION}" >> $GITHUB_STEP_SUMMARY else - sed -i "s||\n sha256:${SHA256}|" update.xml + # No existing minor release found — create one for this patch + gh release create "$TAG" \ + --title "${VERSION}" \ + --notes-file /tmp/release_notes.md + echo "🚀 Release created: ${VERSION} (no minor release found)" >> $GITHUB_STEP_SUMMARY fi - - # Also update the download URL to point to this patch's ZIP - DOWNLOAD_URL="https://github.com/${REPO}/releases/download/${RELEASE_TAG}/${PACKAGE_NAME}" - sed -i "s|]*>[^<]*|${DOWNLOAD_URL}|" update.xml - - git add update.xml - git commit -m "chore(release): SHA-256 + download URL for ${VERSION} [skip ci]" \ - --author="github-actions[bot] " || true - git push || true fi - echo "### Joomla Package" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY - echo "|-------|-------|" >> $GITHUB_STEP_SUMMARY - echo "| Package | \`${PACKAGE_NAME}\` |" >> $GITHUB_STEP_SUMMARY - echo "| Size | ${FILESIZE} bytes |" >> $GITHUB_STEP_SUMMARY - echo "| SHA-256 | \`${SHA256}\` |" >> $GITHUB_STEP_SUMMARY - echo "| Release | \`${RELEASE_TAG}\` |" >> $GITHUB_STEP_SUMMARY - echo "| Download | [${PACKAGE_NAME}](https://github.com/${REPO}/releases/download/${RELEASE_TAG}/${PACKAGE_NAME}) |" >> $GITHUB_STEP_SUMMARY - - # -- Summary -------------------------------------------------------------- + # ── Summary ──────────────────────────────────────────────────────── - name: Pipeline Summary if: always() run: | VERSION="${{ steps.version.outputs.version }}" if [ "${{ steps.version.outputs.skip }}" = "true" ]; then - echo "## Release Skipped" >> $GITHUB_STEP_SUMMARY + echo "## ⏭️ Release Skipped" >> $GITHUB_STEP_SUMMARY echo "No VERSION in README.md" >> $GITHUB_STEP_SUMMARY elif [ "${{ steps.check.outputs.already_released }}" = "true" ]; then - echo "## Already Released — ${VERSION}" >> $GITHUB_STEP_SUMMARY + echo "## ℹ️ Already Released — ${VERSION}" >> $GITHUB_STEP_SUMMARY else echo "" >> $GITHUB_STEP_SUMMARY - echo "## Build & Release Complete (Joomla)" >> $GITHUB_STEP_SUMMARY + echo "## ✅ Build & Release Complete" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "| Step | Result |" >> $GITHUB_STEP_SUMMARY echo "|------|--------|" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/deploy-demo.yml b/.github/workflows/deploy-demo.yml index 45c0a5f..7f785bf 100644 --- a/.github/workflows/deploy-demo.yml +++ b/.github/workflows/deploy-demo.yml @@ -22,7 +22,7 @@ # INGROUP: MokoStandards.Deploy # REPO: https://github.com/mokoconsulting-tech/MokoStandards # PATH: /templates/workflows/shared/deploy-demo.yml.template -# VERSION: 04.05.13 +# VERSION: 04.05.00 # BRIEF: SFTP deployment workflow for demo server — synced to all governed repos # NOTE: Synced via bulk-repo-sync to .github/workflows/deploy-demo.yml in all governed repos. # Port is resolved in order: DEMO_FTP_PORT variable → :port suffix in DEMO_FTP_HOST → 22. @@ -296,12 +296,6 @@ jobs: HOST="$HOST_RAW" PORT="$PORT_VAR" - if [ -z "$HOST" ]; then - echo "⏭️ DEMO_FTP_HOST not configured — skipping demo deployment." - echo "skip=true" >> "$GITHUB_OUTPUT" - exit 0 - fi - # Priority 1 — explicit DEMO_FTP_PORT variable if [ -n "$PORT" ]; then echo "ℹ️ Using explicit DEMO_FTP_PORT=${PORT}" @@ -323,7 +317,7 @@ jobs: echo "SFTP target: ${HOST}:${PORT}" - name: Build remote path - if: steps.source.outputs.skip == 'false' && steps.conn.outputs.skip != 'true' + if: steps.source.outputs.skip == 'false' id: remote env: DEMO_FTP_PATH: ${{ vars.DEMO_FTP_PATH }} @@ -332,9 +326,10 @@ jobs: BASE="$DEMO_FTP_PATH" if [ -z "$BASE" ]; then - echo "⏭️ DEMO_FTP_PATH not configured — skipping demo deployment." - echo "skip=true" >> "$GITHUB_OUTPUT" - exit 0 + echo "❌ DEMO_FTP_PATH is not set." + echo " Configure it as an org-level variable (Settings → Variables) and" + echo " ensure this repository has been granted access to it." + exit 1 fi # DEMO_FTP_SUFFIX is required — it identifies the remote subdirectory for this repo. @@ -645,7 +640,7 @@ jobs: rm -f /tmp/deploy_key /tmp/sftp-config.json - name: Create or update failure issue - if: failure() && steps.remote.outputs.skip != 'true' && steps.conn.outputs.skip != 'true' + if: failure() && steps.remote.outputs.skip != 'true' env: GH_TOKEN: ${{ secrets.GH_TOKEN || github.token }} run: | diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index af275da..7019628 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -22,7 +22,7 @@ # INGROUP: MokoStandards.Deploy # REPO: https://github.com/mokoconsulting-tech/MokoStandards # PATH: /templates/workflows/shared/deploy-dev.yml.template -# VERSION: 04.05.13 +# VERSION: 04.05.00 # BRIEF: SFTP deployment workflow for development server — synced to all governed repos # NOTE: Synced via bulk-repo-sync to .github/workflows/deploy-dev.yml in all governed repos. # Port is resolved in order: DEV_FTP_PORT variable → :port suffix in DEV_FTP_HOST → 22. diff --git a/.github/workflows/deploy-rs.yml b/.github/workflows/deploy-rs.yml index 5f9f8da..bf9a779 100644 --- a/.github/workflows/deploy-rs.yml +++ b/.github/workflows/deploy-rs.yml @@ -22,7 +22,7 @@ # INGROUP: MokoStandards.Deploy # REPO: https://github.com/mokoconsulting-tech/MokoStandards # PATH: /templates/workflows/shared/deploy-rs.yml.template -# VERSION: 04.05.13 +# VERSION: 04.05.00 # BRIEF: SFTP deployment workflow for release staging server — synced to all governed repos # NOTE: Synced via bulk-repo-sync to .github/workflows/deploy-rs.yml in all governed repos. # Port is resolved in order: RS_FTP_PORT variable → :port suffix in RS_FTP_HOST → 22. @@ -296,12 +296,6 @@ jobs: HOST="$HOST_RAW" PORT="$PORT_VAR" - if [ -z "$HOST" ]; then - echo "⏭️ RS_FTP_HOST not configured — skipping RS deployment." - echo "skip=true" >> "$GITHUB_OUTPUT" - exit 0 - fi - # Priority 1 — explicit RS_FTP_PORT variable if [ -n "$PORT" ]; then echo "ℹ️ Using explicit RS_FTP_PORT=${PORT}" @@ -323,7 +317,7 @@ jobs: echo "SFTP target: ${HOST}:${PORT}" - name: Build remote path - if: steps.source.outputs.skip == 'false' && steps.conn.outputs.skip != 'true' + if: steps.source.outputs.skip == 'false' id: remote env: RS_FTP_PATH: ${{ vars.RS_FTP_PATH }} @@ -332,9 +326,10 @@ jobs: BASE="$RS_FTP_PATH" if [ -z "$BASE" ]; then - echo "⏭️ RS_FTP_PATH not configured — skipping RS deployment." - echo "skip=true" >> "$GITHUB_OUTPUT" - exit 0 + echo "❌ RS_FTP_PATH is not set." + echo " Configure it as an org-level variable (Settings → Variables) and" + echo " ensure this repository has been granted access to it." + exit 1 fi # RS_FTP_SUFFIX is required — it identifies the remote subdirectory for this repo. @@ -572,7 +567,7 @@ jobs: rm -f /tmp/deploy_key /tmp/sftp-config.json - name: Create or update failure issue - if: failure() && steps.remote.outputs.skip != 'true' && steps.conn.outputs.skip != 'true' + if: failure() && steps.remote.outputs.skip != 'true' env: GH_TOKEN: ${{ secrets.GH_TOKEN || github.token }} run: | diff --git a/.github/workflows/enterprise-firewall-setup.yml b/.github/workflows/enterprise-firewall-setup.yml index b6cf7ab..8979107 100644 --- a/.github/workflows/enterprise-firewall-setup.yml +++ b/.github/workflows/enterprise-firewall-setup.yml @@ -22,7 +22,7 @@ # INGROUP: MokoStandards.Firewall # REPO: https://github.com/mokoconsulting-tech/MokoStandards # PATH: /templates/workflows/shared/enterprise-firewall-setup.yml.template -# VERSION: 04.05.13 +# VERSION: 04.05.00 # BRIEF: Enterprise firewall configuration — generates outbound allow-rules including SFTP deployment server # NOTE: Reads DEV_FTP_HOST / DEV_FTP_PORT variables to include SFTP egress rules alongside HTTPS rules. diff --git a/.github/workflows/repository-cleanup.yml b/.github/workflows/repository-cleanup.yml index b078061..e77c279 100644 --- a/.github/workflows/repository-cleanup.yml +++ b/.github/workflows/repository-cleanup.yml @@ -9,7 +9,7 @@ # INGROUP: MokoStandards.Maintenance # REPO: https://github.com/mokoconsulting-tech/MokoStandards # PATH: /templates/workflows/shared/repository-cleanup.yml.template -# VERSION: 04.05.13 +# VERSION: 04.05.00 # BRIEF: Recurring repository maintenance — labels, branches, workflows, logs, doc indexes # NOTE: Synced via bulk-repo-sync to .github/workflows/repository-cleanup.yml in all governed repos. # Runs on the 1st and 15th of each month at 6:00 AM UTC, and on manual dispatch. diff --git a/.github/workflows/sync-version-on-merge.yml b/.github/workflows/sync-version-on-merge.yml index 7b2ef6c..5c60d37 100644 --- a/.github/workflows/sync-version-on-merge.yml +++ b/.github/workflows/sync-version-on-merge.yml @@ -9,7 +9,7 @@ # INGROUP: MokoStandards.Automation # REPO: https://github.com/mokoconsulting-tech/MokoStandards # PATH: /templates/workflows/shared/sync-version-on-merge.yml.template -# VERSION: 04.05.13 +# VERSION: 04.05.00 # BRIEF: Auto-bump patch version on every push to main and propagate to all file headers # NOTE: Synced via bulk-repo-sync to .github/workflows/sync-version-on-merge.yml in all governed repos. # README.md is the single source of truth for the repository version. diff --git a/.gitignore b/.gitignore index ff96728..2efa088 100644 --- a/.gitignore +++ b/.gitignore @@ -198,9 +198,5 @@ venv/ *.coverage hypothesis/ - -# ============================================================ -# Cassiopeia custom theme overrides -# ============================================================ -/src/media/css/theme/dark.custom.css -/src/media/css/theme/light.custom.css +src/media/css/theme/dark.custom.css +src/media/css/theme/light.custom.css diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e4a9ef..7f5195b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,13 +12,48 @@ BRIEF: Changelog file documenting version history of MokoCassiopeia --> -# Changelog — MokoCassiopeia (VERSION: 03.08.03) +# Changelog — MokoCassiopeia (VERSION: 03.09.02) All notable changes to the MokoCassiopeia Joomla template are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] - 2026-04-02 + +### Added + +- **Favicon configuration** — New "Favicon" tab in template config; upload a PNG and all favicon sizes are auto-generated via PHP GD (ICO, Apple Touch Icon 180px, Android Chrome 192/512px, site.webmanifest) +- **Module overrides** — 11 new `default.php` layout overrides for Joomla core modules: `mod_custom`, `mod_articles_latest`, `mod_articles_popular`, `mod_articles_news`, `mod_articles_category`, `mod_breadcrumbs`, `mod_footer`, `mod_login`, `mod_finder`, `mod_tags_popular`, `mod_tags_similar`, `mod_related_items` +- **Module title support** — All module overrides respect `$module->showtitle`, `header_tag`, `header_class`, and `moduleclass_sfx` parameters +- **Module CSS** — BEM-scoped styles for module titles, article lists, tag badges, search forms, login forms, breadcrumbs, and footer content +- **Hero card variables** — Full variable-driven hero system: `--hero-card-bg`, `--hero-card-color`, `--hero-card-overlay`, `--hero-card-border-radius`, `--hero-card-padding-x/y`, `--hero-card-max-width`, plus `--hero-alt-card-*` for secondary variant +- **Hero mobile breakpoint** — Photo background hidden on mobile (≤767.98px), hero card becomes full-bleed (100dvh, no border-radius) +- **CSS fallback values** — 1365 `var()` calls in template.css now include inline fallback values +- **Card border-radius** — `.card` now has `.25rem` fallback on `var(--card-border-radius)` +- **Usage section in README** — Added missing "Usage" section required by MokoStandards + +### Changed + +- **Button backgrounds** — `--btn-bg: transparent` changed to `var(--body-bg)` in dark and light themes +- **Offcanvas close button** — `.offcanvas-header .btn-close` now gets `background-color` from `--offcanvas-bg` +- **Custom template sync** — Both `dark.custom.css` and `light.custom.css` now contain all variables from their standard counterparts (was missing 223 variables) +- **Overlay layer** — Added `--hero-overlay-bg-position` and `--hero-overlay-bg-size` variables +- **Legacy CSS cleanup** — Removed vendor prefixes (`-webkit-box`, `-ms-flexbox`) from `.overlay` rules, replaced with modern flexbox + +### Removed + +- **FILE INFORMATION headers** — Stripped DEFGROUP/INGROUP/PATH/VERSION/BRIEF metadata from all PHP, CSS, JS, INI, and HTML files (kept in XML and README per policy) +- **Mobile overrides** — Deleted 26 `mobile.php` layout files and their empty parent directories +- **Joomla-specific gitignore entries** — Removed ~700 lines of Joomla CMS core paths from `.gitignore` (not applicable to a template repository) + +### Fixed + +- **CI: composer install** — Workflow `standards-compliance.yml` now conditionally runs `composer install` only when `composer.json` exists +- **CI: YAML syntax** — Fixed invalid YAML in `auto-update-sha.yml` caused by multiline commit message in run block + +--- + ## [03.09.02] - 2026-03-26 ### Added - Hero Variant System & Block Color System @@ -37,13 +72,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 #### Files Modified - `src/media/css/template.css` — hero variant rules, block color `:nth-child()` rules, named override rules -- `src/templates/light.custom.css` — hero and block color variables (light mode) -- `src/templates/dark.custom.css` — hero and block color variables (dark mode) -- `docs/CSS_VARIABLES.md` — full variable reference for both systems +- `src/media/css/theme/light.standard.css` — hero and block color variables (light standard) +- `src/media/css/theme/dark.standard.css` — hero and block color variables (dark standard) +- `src/templates/light.custom.css` — hero and block color variables (light custom starter) +- `src/templates/dark.custom.css` — hero and block color variables (dark custom starter) +- `src/templateDetails.xml` — Theme Preview tab, hero/block note fields, scriptfile registration, version bump to 03.09.02 +- `src/language/en-GB/tpl_mokocassiopeia.ini` — language strings for new admin fields (British English) +- `src/language/en-US/tpl_mokocassiopeia.ini` — language strings for new admin fields (American English) +- `docs/CSS_VARIABLES.md` — full variable reference for both systems, sync script documentation - `CHANGELOG.md` — this entry #### Files Added -- `src/templates/theme-test.html` — Bootstrap-style test page showing all CSS variables and new features +- `src/templates/theme-test.html` — Bootstrap-style test page with branded showcase, CSS variable swatches, hero demos, block color demos, and color test image +- `src/script.php` — Joomla install/update lifecycle script (runs CSS variable sync on upgrade, checks PHP/Joomla minimum versions) +- `src/sync_custom_vars.php` — CLI/library utility that detects missing CSS variables in user custom palettes and injects them +- `src/templates/brand-showcase.html` — Interactive color system gradients with hover pixel sampler, Bootstrap component showcase + +#### Variable Audit +- All 20 hero/block variables confirmed present in all 4 theme files (light/dark standard + custom) +- No duplicate variable declarations found across any theme file +- `--gutter-x` references in template.css are self-scoped to grid containers (standard Bootstrap 5 behavior, not a `:root` variable) --- diff --git a/README.md b/README.md index d20af22..dbe0569 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,20 @@ The template includes a dark mode toggle. Test it by: --- +## Usage + +Once installed and set as the default site template, MokoCassiopeia works out of the box with Joomla's standard content and module system. Key usage points: + +- **Template Options** — Configure via **System → Site Templates → MokoCassiopeia** (theme colours, layout, analytics, favicon, drawers) +- **Custom Colour Schemes** — Copy `templates/mokocassiopeia/templates/light.custom.css` or `dark.custom.css` to `media/templates/site/mokocassiopeia/css/theme/` and select "Custom" in the Theme tab +- **Custom CSS/JS** — Create `media/templates/site/mokocassiopeia/css/user.css` or `js/user.js` for site-specific overrides that survive template updates +- **Module Overrides** — The template includes overrides for common Joomla modules with consistent title rendering, Bootstrap 5 styling, and Font Awesome 7 icons +- **Dark Mode** — Enabled by default with a floating toggle button; respects system preference and persists via localStorage + +See [Configuration](#️-configuration) below for detailed parameter reference. + +--- + ## ⚙️ Configuration ### Global Parameters diff --git a/docs/CSS_VARIABLES.md b/docs/CSS_VARIABLES.md index 3a0017c..c570635 100644 --- a/docs/CSS_VARIABLES.md +++ b/docs/CSS_VARIABLES.md @@ -10,7 +10,7 @@ INGROUP: MokoCassiopeia.Documentation REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia FILE: docs/CSS_VARIABLES.md - VERSION: 03.06.03 + VERSION: 03.09.02 BRIEF: Complete CSS variable reference for MokoCassiopeia template --> @@ -60,6 +60,12 @@ To create custom color schemes: 4. **Note**: Custom files are gitignored and won't be committed to the repository +5. **On upgrade**: When the template is updated, `script.php` automatically runs `sync_custom_vars.php` to detect any new variables added to the starter templates and inject them into your existing custom palette files. Your existing values are never overwritten — only genuinely new variables are added. You can also run this manually: + ```bash + php templates/mokocassiopeia/sync_custom_vars.php --dry-run # preview what would be added + php templates/mokocassiopeia/sync_custom_vars.php # apply missing variables + ``` + --- ## Primary Brand Colors @@ -1440,9 +1446,9 @@ These ensure optimal readability for links within alert boxes. * Repository: [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) * Path: /docs/CSS_VARIABLES.md * Owner: Moko Consulting -* Version: 03.06.03 +* Version: 03.09.02 * Status: Active -* Effective Date: 2026-01-30 +* Effective Date: 2026-03-26 * Classification: Public Open Source Documentation ## Revision History diff --git a/src/component.php b/src/component.php index 48b29ef..23b267d 100644 --- a/src/component.php +++ b/src/component.php @@ -1,19 +1,9 @@ +/* Copyright (C) 2025 Moko Consulting This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia - PATH: ./templates/mokocassiopeia/component.php - VERSION: 03.06.02 - BRIEF: Main template index file for MokoCassiopeia rendering site layout */ @@ -54,15 +44,6 @@ $sitename = htmlspecialchars($sitenameR, ENT_QUOTES, 'UTF-8'); $menu = $app->getMenu()->getActive(); $pageclass = $menu !== null ? $menu->getParams()->get('pageclass_sfx', '') : ''; -// Respect “Site Name in Page Titles” (0:none, 1:before, 2:after) -$mode = (int) $app->get('sitename_pagetitles', 0); -$pageTitle = trim($this->getTitle()); -$final = $pageTitle !== '' - ? ($mode === 1 ? $sitenameR . ' - ' . $pageTitle - : ($mode === 2 ? $pageTitle . ' - ' . $sitenameR : $pageTitle)) - : $sitenameR; -$this->setTitle($final); - // Template/Media path $templatePath = 'media/templates/site/mokocassiopeia'; diff --git a/src/custom.php b/src/custom.php index 518fcd9..79167a8 100644 --- a/src/custom.php +++ b/src/custom.php @@ -1,19 +1,9 @@ +/* Copyright (C) 2025 Moko Consulting This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia - PATH: ./templates/mokocassiopeia/custom.php - VERSION: 03.06.02 - BRIEF: MokoCassiopeia with user-defined overrides */ function console_log($output, $with_script_tags = true) { diff --git a/src/error.php b/src/error.php index 7f85bbd..c783115 100644 --- a/src/error.php +++ b/src/error.php @@ -1,19 +1,9 @@ +/* Copyright (C) 2025 Moko Consulting This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia - PATH: ./templates/mokocassiopeia/error.php - VERSION: 03.06.02 - BRIEF: Error page template file for MokoCassiopeia */ defined('_JEXEC') or die; @@ -428,7 +418,7 @@ $wa->useScript('user.js'); // js/user.js params->get('backTop') == 1) : ?> - + diff --git a/src/helper/favicon.php b/src/helper/favicon.php new file mode 100644 index 0000000..2567e86 --- /dev/null +++ b/src/helper/favicon.php @@ -0,0 +1,173 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Favicon generator — creates ICO, Apple Touch Icon, and Android icons + * from a single source PNG uploaded via the template config. + */ + +defined('_JEXEC') or die; + +class MokoFaviconHelper +{ + /** + * Sizes to generate: filename => [width, height, format]. + * ICO embeds 16×16 and 32×32 internally. + */ + private const SIZES = [ + 'apple-touch-icon.png' => [180, 180, 'png'], + 'favicon-32x32.png' => [32, 32, 'png'], + 'favicon-16x16.png' => [16, 16, 'png'], + 'android-chrome-192x192.png' => [192, 192, 'png'], + 'android-chrome-512x512.png' => [512, 512, 'png'], + ]; + + /** + * Generate all favicon files from a source PNG if they don't already exist + * or if the source has been modified since last generation. + * + * @param string $sourcePath Absolute path to the source PNG. + * @param string $outputDir Absolute path to the output directory. + * + * @return bool True if generation succeeded or files are up to date. + */ + public static function generate(string $sourcePath, string $outputDir): bool + { + if (!is_file($sourcePath) || !extension_loaded('gd')) { + return false; + } + + if (!is_dir($outputDir)) { + mkdir($outputDir, 0755, true); + } + + $sourceTime = filemtime($sourcePath); + $stampFile = $outputDir . '/.favicon_generated'; + + // Skip if already up to date + if (is_file($stampFile) && filemtime($stampFile) >= $sourceTime) { + return true; + } + + $source = imagecreatefrompng($sourcePath); + if (!$source) { + return false; + } + + imagealphablending($source, false); + imagesavealpha($source, true); + + $srcW = imagesx($source); + $srcH = imagesy($source); + + // Generate PNG sizes + foreach (self::SIZES as $filename => [$w, $h]) { + $resized = imagecreatetruecolor($w, $h); + imagealphablending($resized, false); + imagesavealpha($resized, true); + $transparent = imagecolorallocatealpha($resized, 0, 0, 0, 127); + imagefill($resized, 0, 0, $transparent); + + imagecopyresampled($resized, $source, 0, 0, 0, 0, $w, $h, $srcW, $srcH); + imagepng($resized, $outputDir . '/' . $filename, 9); + imagedestroy($resized); + } + + // Generate ICO (contains 16×16 and 32×32) + self::generateIco($source, $srcW, $srcH, $outputDir . '/favicon.ico'); + + // Generate site.webmanifest + self::generateManifest($outputDir); + + imagedestroy($source); + + // Write timestamp stamp + file_put_contents($stampFile, date('c')); + + return true; + } + + /** + * Build a minimal ICO file containing 16×16 and 32×32 PNG entries. + */ + private static function generateIco(\GdImage $source, int $srcW, int $srcH, string $outPath): void + { + $entries = []; + foreach ([16, 32] as $size) { + $resized = imagecreatetruecolor($size, $size); + imagealphablending($resized, false); + imagesavealpha($resized, true); + $transparent = imagecolorallocatealpha($resized, 0, 0, 0, 127); + imagefill($resized, 0, 0, $transparent); + imagecopyresampled($resized, $source, 0, 0, 0, 0, $size, $size, $srcW, $srcH); + + ob_start(); + imagepng($resized, null, 9); + $pngData = ob_get_clean(); + imagedestroy($resized); + + $entries[] = ['size' => $size, 'data' => $pngData]; + } + + // ICO header: 2 bytes reserved, 2 bytes type (1=ICO), 2 bytes count + $count = count($entries); + $ico = pack('vvv', 0, 1, $count); + + // Calculate offset: header (6) + directory entries (16 each) + $offset = 6 + ($count * 16); + $imageData = ''; + + foreach ($entries as $entry) { + $size = $entry['size'] >= 256 ? 0 : $entry['size']; + $dataLen = strlen($entry['data']); + + // ICONDIRENTRY: width, height, colors, reserved, planes, bpp, size, offset + $ico .= pack('CCCCvvVV', $size, $size, 0, 0, 1, 32, $dataLen, $offset); + $imageData .= $entry['data']; + $offset += $dataLen; + } + + file_put_contents($outPath, $ico . $imageData); + } + + /** + * Write a site.webmanifest for Android/PWA icon discovery. + */ + private static function generateManifest(string $outputDir): void + { + $manifest = [ + 'icons' => [ + ['src' => 'android-chrome-192x192.png', 'sizes' => '192x192', 'type' => 'image/png'], + ['src' => 'android-chrome-512x512.png', 'sizes' => '512x512', 'type' => 'image/png'], + ], + ]; + file_put_contents( + $outputDir . '/site.webmanifest', + json_encode($manifest, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) + ); + } + + /** + * Return the tags to inject into . + * + * @param string $basePath URL path to the favicon directory (relative to site root). + * + * @return string HTML link tags. + */ + public static function getHeadTags(string $basePath): string + { + $basePath = rtrim($basePath, '/'); + + return '' . "\n" + . '' . "\n" + . '' . "\n" + . '' . "\n" + . '' . "\n"; + } +} diff --git a/src/html/com_comprofiler/index.html b/src/helper/index.html similarity index 100% rename from src/html/com_comprofiler/index.html rename to src/helper/index.html diff --git a/src/helper/minify.php b/src/helper/minify.php new file mode 100644 index 0000000..0ea066a --- /dev/null +++ b/src/helper/minify.php @@ -0,0 +1,162 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * CSS/JS minifier — generates .min files from source when dev mode is off, + * deletes them when dev mode is on. + */ + +defined('_JEXEC') or die; + +class MokoMinifyHelper +{ + /** + * Files to minify: source path relative to template media root. + * The .min variant is derived automatically (template.css → template.min.css). + */ + private const CSS_FILES = [ + 'css/template.css', + 'css/theme/light.standard.css', + 'css/theme/dark.standard.css', + 'css/theme/light.custom.css', + 'css/theme/dark.custom.css', + ]; + + private const JS_FILES = [ + 'js/template.js', + ]; + + /** + * When dev mode is ON: delete all .min files. + * When dev mode is OFF: regenerate .min files if source is newer. + * + * @param string $mediaRoot Absolute path to the template media directory. + * @param bool $devMode Whether development mode is enabled. + */ + public static function sync(string $mediaRoot, bool $devMode): void + { + $mediaRoot = rtrim($mediaRoot, '/\\'); + + foreach (self::CSS_FILES as $relPath) { + $source = $mediaRoot . '/' . $relPath; + $min = self::minPath($source); + + if ($devMode) { + self::deleteIfExists($min); + } else { + self::buildIfStale($source, $min, 'css'); + } + } + + foreach (self::JS_FILES as $relPath) { + $source = $mediaRoot . '/' . $relPath; + $min = self::minPath($source); + + if ($devMode) { + self::deleteIfExists($min); + } else { + self::buildIfStale($source, $min, 'js'); + } + } + } + + /** + * Derive the .min path from a source path. + * template.css → template.min.css + */ + private static function minPath(string $path): string + { + $info = pathinfo($path); + return $info['dirname'] . '/' . $info['filename'] . '.min.' . $info['extension']; + } + + /** + * Delete a file if it exists. + */ + private static function deleteIfExists(string $path): void + { + if (is_file($path)) { + @unlink($path); + } + } + + /** + * Build the minified file if the source is newer or the min file is missing. + */ + private static function buildIfStale(string $source, string $min, string $type): void + { + if (!is_file($source)) { + return; + } + + // Skip if min file exists and is newer than source + if (is_file($min) && filemtime($min) >= filemtime($source)) { + return; + } + + $content = file_get_contents($source); + if ($content === false) { + return; + } + + $minified = ($type === 'css') + ? self::minifyCss($content) + : self::minifyJs($content); + + file_put_contents($min, $minified); + } + + /** + * Minify CSS by stripping comments, excess whitespace, and unnecessary characters. + */ + private static function minifyCss(string $css): string + { + // Remove comments (but keep IE hacks like /*\*/) + $css = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $css); + + // Remove whitespace around { } : ; , > + ~ + $css = preg_replace('/\s*([{}:;,>+~])\s*/', '$1', $css); + + // Remove remaining newlines and tabs + $css = preg_replace('/\s+/', ' ', $css); + + // Remove spaces around selectors + $css = str_replace(['{ ', ' {', '; ', ' ;'], ['{', '{', ';', ';'], $css); + + // Remove trailing semicolons before closing braces + $css = str_replace(';}', '}', $css); + + // Remove leading/trailing whitespace + return trim($css); + } + + /** + * Minify JS by stripping single-line comments, multi-line comments, + * and collapsing whitespace. Preserves string literals. + */ + private static function minifyJs(string $js): string + { + // Remove multi-line comments + $js = preg_replace('!/\*.*?\*/!s', '', $js); + + // Remove single-line comments (but not URLs like http://) + $js = preg_replace('!(?<=^|[\s;{}()\[\]])//[^\n]*!m', '', $js); + + // Collapse whitespace + $js = preg_replace('/\s+/', ' ', $js); + + // Remove spaces around operators and punctuation + $js = preg_replace('/\s*([{}();,=+\-*\/<>!&|?:])\s*/', '$1', $js); + + // Restore necessary spaces (after keywords) + $js = preg_replace('/(var|let|const|return|typeof|instanceof|new|delete|throw|case|in|of)([^\s;})><=!&|?:,])/', '$1 $2', $js); + + return trim($js); + } +} diff --git a/src/html/com_comprofiler/login/index.html b/src/html/com_comprofiler/login/index.html deleted file mode 100644 index 2efb97f..0000000 --- a/src/html/com_comprofiler/login/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_comprofiler/login/mobile.php b/src/html/com_comprofiler/login/mobile.php deleted file mode 100644 index c2d7f96..0000000 --- a/src/html/com_comprofiler/login/mobile.php +++ /dev/null @@ -1,112 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for Community Builder login view - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; -use Joomla\CMS\Router\Route; - -$return = $this->return ?? ''; -$showRegisterLink = $this->showRegisterLink ?? true; -$showLostPasswordLink = $this->showLostPasswordLink ?? true; -?> - -
-
-
-

- -

-
- -
- -
- - -
- -
- - -
- - showRememberMe ?? true) : ?> -
-
- - -
-
- - -
- -
- - - - token ?? ''; ?> -
- -
- -
- - - - -
- - - -
- - - - -
- -
-
-
diff --git a/src/html/com_comprofiler/registers/index.html b/src/html/com_comprofiler/registers/index.html deleted file mode 100644 index 2efb97f..0000000 --- a/src/html/com_comprofiler/registers/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_comprofiler/registers/mobile.php b/src/html/com_comprofiler/registers/mobile.php deleted file mode 100644 index 01a65fd..0000000 --- a/src/html/com_comprofiler/registers/mobile.php +++ /dev/null @@ -1,136 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for Community Builder registration view - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -// Get form and fields -$form = $this->form ?? null; -$tabs = $this->tabs ?? null; -?> - -
-
-

- -

- - introduction ?? null) : ?> -
- introduction; ?> -
- -
- - -
- - - - fields) && !empty($tab->fields)) : ?> -
- title) : ?> - - title, ENT_QUOTES, 'UTF-8'); ?> - - - - description) : ?> -
- description; ?> -
- - -
- fields as $field) : ?> -
- - - description) : ?> -
- description; ?> -
- - -
- input; ?> -
- - error) && $field->error) : ?> -
- error; ?> -
- -
- -
-
- - - - - showCaptcha ?? false) : ?> -
- captcha; ?> -
- - - showTerms ?? false) : ?> -
-
- - -
-
- - -
- - - - - - -
- - token ?? ''; ?> -
- -
- -
- -
diff --git a/src/html/com_comprofiler/userprofile/index.html b/src/html/com_comprofiler/userprofile/index.html deleted file mode 100644 index 2efb97f..0000000 --- a/src/html/com_comprofiler/userprofile/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_comprofiler/userprofile/mobile.php b/src/html/com_comprofiler/userprofile/mobile.php deleted file mode 100644 index 8d8e6c3..0000000 --- a/src/html/com_comprofiler/userprofile/mobile.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for Community Builder user profile view - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -// Get user object -$user = $this->user ?? null; -$tabs = $this->tabs ?? null; -?> - -
- -
- getField('avatar', null, 'html', 'none', 'profile')) : ?> -
- getField('avatar', null, 'html', 'none', 'profile'); ?> -
- - -
-

- getField('formatname', null, 'html', 'none', 'profile'), ENT_QUOTES, 'UTF-8'); ?> -

- - getField('onlinestatus', null, 'html', 'none', 'profile')) : ?> -
- getField('onlinestatus', null, 'html', 'none', 'profile'); ?> -
- -
-
- - -
-
    - - fields) && !empty($tab->fields)) : ?> -
  • - - title, ENT_QUOTES, 'UTF-8'); ?> - -
  • - - -
- -
- - fields) && !empty($tab->fields)) : ?> -
- - description) : ?> -
- description; ?> -
- - -
- fields as $field) : ?> - value) : ?> -
-
- title, ENT_QUOTES, 'UTF-8'); ?> -
-
- value; ?> -
-
- - -
-
- - -
-
- - -
- -
- -
diff --git a/src/html/com_comprofiler/userslist/index.html b/src/html/com_comprofiler/userslist/index.html deleted file mode 100644 index 2efb97f..0000000 --- a/src/html/com_comprofiler/userslist/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_comprofiler/userslist/mobile.php b/src/html/com_comprofiler/userslist/mobile.php deleted file mode 100644 index 2e25d70..0000000 --- a/src/html/com_comprofiler/userslist/mobile.php +++ /dev/null @@ -1,123 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for Community Builder users list view - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; -use Joomla\CMS\Router\Route; - -// Get users list -$users = $this->users ?? []; -$pagination = $this->pagination ?? null; -$search = $this->search ?? ''; -$listid = $this->listid ?? 0; -?> - -
-
-

- -

- - showSearch ?? true) : ?> -
-
- -
- - - - -
-
-
- -
- - -
- -
- getField('avatar', null, 'html', 'none', 'list')) : ?> -
- - getField('avatar', null, 'html', 'none', 'list'); ?> - -
- - -
-

- - getField('formatname', null, 'html', 'none', 'list'), ENT_QUOTES, 'UTF-8'); ?> - -

- - getField('onlinestatus', null, 'html', 'none', 'list')) : ?> -
- getField('onlinestatus', null, 'html', 'none', 'list'); ?> -
- - - fields) && !empty($user->fields)) : ?> -
- fields as $field) : ?> - value) : ?> -
- title, ENT_QUOTES, 'UTF-8'); ?>: - value; ?> -
- - -
- - -
- - - - -
-
-
- -
- - -
- getPagesLinks(); ?> -
- - -
- -
- -
diff --git a/src/html/com_content/article/index.html b/src/html/com_content/article/index.html index 2efb97f..1a6c6cf 100644 --- a/src/html/com_content/article/index.html +++ b/src/html/com_content/article/index.html @@ -1 +1,76 @@ - + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/com_content/article/toc-left.php b/src/html/com_content/article/toc-left.php index 4d91c07..df6a95c 100644 --- a/src/html/com_content/article/toc-left.php +++ b/src/html/com_content/article/toc-left.php @@ -1,17 +1,10 @@ * - * @copyright (C) 2026 Moko Consulting - * @license GNU General Public License version 3 or later; see LICENSE.txt - * - * FILE INFORMATION - * DEFGROUP: Joomla.Template.Site - * INGROUP: MokoCassiopeia - * PATH: ./templates/mokocassiopeia/html/com_content/article/toc-left.php - * VERSION: 03.06.02 - * BRIEF: Article layout with table of contents on the left side using Bootstrap TOC + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later */ defined('_JEXEC') or die; @@ -19,6 +12,7 @@ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Associations; +use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; // Load Bootstrap TOC assets @@ -43,13 +37,13 @@ $assocParam = (Associations::isEnabled() && $params->get('show_associations'));
-
item->title, 50); ?>
+
-
+
params->get('show_page_heading')) : ?> @@ -91,7 +85,7 @@ $assocParam = (Associations::isEnabled() && $params->get('show_associations')); item->tags->itemTags); ?> -
+
item->text; ?>
diff --git a/src/html/com_content/article/toc-right.php b/src/html/com_content/article/toc-right.php index 2ec4ca9..21a1ae7 100644 --- a/src/html/com_content/article/toc-right.php +++ b/src/html/com_content/article/toc-right.php @@ -1,17 +1,10 @@ * - * @copyright (C) 2026 Moko Consulting - * @license GNU General Public License version 3 or later; see LICENSE.txt - * - * FILE INFORMATION - * DEFGROUP: Joomla.Template.Site - * INGROUP: MokoCassiopeia - * PATH: ./templates/mokocassiopeia/html/com_content/article/toc-right.php - * VERSION: 03.06.02 - * BRIEF: Article layout with table of contents on the right side using Bootstrap TOC + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later */ defined('_JEXEC') or die; @@ -19,6 +12,7 @@ defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Associations; +use Joomla\CMS\Language\Text; use Joomla\CMS\Layout\LayoutHelper; // Load Bootstrap TOC assets @@ -40,7 +34,7 @@ $assocParam = (Associations::isEnabled() && $params->get('show_associations'));
-
+
params->get('show_page_heading')) : ?> @@ -82,7 +76,7 @@ $assocParam = (Associations::isEnabled() && $params->get('show_associations')); item->tags->itemTags); ?> -
+
item->text; ?>
@@ -108,7 +102,7 @@ $assocParam = (Associations::isEnabled() && $params->get('show_associations'));
-
item->title, 50); ?>
+
diff --git a/src/html/com_jem/calendar/index.html b/src/html/com_jem/calendar/index.html deleted file mode 100644 index 2efb97f..0000000 --- a/src/html/com_jem/calendar/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_jem/calendar/mobile.php b/src/html/com_jem/calendar/mobile.php deleted file mode 100644 index ec2c307..0000000 --- a/src/html/com_jem/calendar/mobile.php +++ /dev/null @@ -1,167 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for JEM calendar view - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; -use Joomla\CMS\Router\Route; -use Joomla\CMS\HTML\HTMLHelper; - -$events = $this->rows ?? []; -$date = $this->date ?? null; -$year = $this->year ?? date('Y'); -$month = $this->month ?? date('m'); -?> - -
-
- - -
-

- -

-
- - -
- - ‹ - - -

- -

- - - › - -
- - -
- -
- -
- -
- -
- - -
- -
- dates) && date('Y-m-d', strtotime($event->dates)) == $currentDate) { - $hasEvents = true; - $dayEvents[] = $event; - } - } - } - - $isToday = ($currentDate == date('Y-m-d')); - $classes = 'jem-calendar__day'; - if ($hasEvents) { - $classes .= ' jem-calendar__day--has-events'; - } - if ($isToday) { - $classes .= ' jem-calendar__day--today'; - } - ?> -
-
- -
- -
- - - -
- -
- -
-
- - - -
-

- -

-
- -
-
- dates)) : ?> - - dates, Text::_('DATE_FORMAT_LC4')); ?> - - -
-

- slug)) : ?> - - escape($event->title); ?> - - - escape($event->title); ?> - -

- venue)) : ?> -
- 📍 escape($event->venue); ?> -
- -
- -
-
- - -
-
diff --git a/src/html/com_jem/categories/index.html b/src/html/com_jem/categories/index.html deleted file mode 100644 index 2efb97f..0000000 --- a/src/html/com_jem/categories/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_jem/categories/mobile.php b/src/html/com_jem/categories/mobile.php deleted file mode 100644 index 7c704a7..0000000 --- a/src/html/com_jem/categories/mobile.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for JEM categories view - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; -use Joomla\CMS\Router\Route; - -$categories = $this->categories ?? []; -?> - -
-
- - -
-

- -

-
- - -
- -
-
- - - image)) : ?> -
- <?php echo $this->escape($category->catname); ?> -
- - - -
- - -

- slug)) : ?> - - escape($category->catname); ?> - - - escape($category->catname); ?> - -

- - - catdescription)) : ?> -
- catdescription; ?> -
- - - - eventcount)) : ?> -
- - eventcount); ?> - -
- - - - slug)) : ?> -
- - - -
- - -
- -
-
- -
- - - pagination)) : ?> -
- pagination->getPagesLinks(); ?> -
- - - -
-

- -

-
- - -
-
diff --git a/src/html/com_jem/event/index.html b/src/html/com_jem/event/index.html deleted file mode 100644 index 2efb97f..0000000 --- a/src/html/com_jem/event/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_jem/event/mobile.php b/src/html/com_jem/event/mobile.php deleted file mode 100644 index 43f90c8..0000000 --- a/src/html/com_jem/event/mobile.php +++ /dev/null @@ -1,212 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for JEM event details view - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; -use Joomla\CMS\Router\Route; -use Joomla\CMS\HTML\HTMLHelper; - -$item = $this->item ?? null; -$params = $this->params ?? null; - -if (!$item) { - return; -} -?> - -
-
- - -
-

- escape($item->title); ?> -

-
- - - datimage)) : ?> -
- <?php echo $this->escape($item->title); ?> -
- - - -
- - -
- 📅 -
- - : - - dates)) : ?> - - dates, Text::_('DATE_FORMAT_LC3')); ?> - - - - enddates) && $item->enddates != $item->dates) : ?> - - - - enddates, Text::_('DATE_FORMAT_LC3')); ?> - - -
-
- - - times)) : ?> -
- 🕐 -
- - : - - - escape($item->times); ?> - endtimes)) : ?> - - escape($item->endtimes); ?> - - -
-
- - - - venue)) : ?> -
- 📍 -
- - : - - venueslug)) : ?> - - escape($item->venue); ?> - - - - escape($item->venue); ?> - - - - street) || !empty($item->city)) : ?> -
- street)) : ?> - - escape($item->street); ?> - - - city)) : ?> - - escape($item->city); ?> - - -
- -
-
- - - - categories)) : ?> -
- 🏷️ -
- - : - -
- categories as $category) : ?> - - escape($category->catname); ?> - - -
-
-
- - -
- - - fulltext)) : ?> -
-

- -

-
- fulltext; ?> -
-
- - - - registra) && $item->registra == 1) : ?> -
-

- -

- maxplaces)) : ?> -

- : - maxplaces; ?> -

- - waitinglist)) : ?> -

- -

- -
- - - - contactname)) : ?> -
-

- -

-

- : - escape($item->contactname); ?> -

- contactemail)) : ?> -

- : - - escape($item->contactemail); ?> - -

- -
- - - -
- - - -
- -
-
diff --git a/src/html/com_jem/eventslist/index.html b/src/html/com_jem/eventslist/index.html deleted file mode 100644 index 2efb97f..0000000 --- a/src/html/com_jem/eventslist/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_jem/eventslist/mobile.php b/src/html/com_jem/eventslist/mobile.php deleted file mode 100644 index b7b6d65..0000000 --- a/src/html/com_jem/eventslist/mobile.php +++ /dev/null @@ -1,147 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for JEM events list view - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; -use Joomla\CMS\Router\Route; -use Joomla\CMS\HTML\HTMLHelper; - -// Load JEM helper if available -if (file_exists(JPATH_SITE . '/components/com_jem/helpers/helper.php')) { - require_once JPATH_SITE . '/components/com_jem/helpers/helper.php'; -} - -$items = $this->items ?? []; -$params = $this->params ?? null; -?> - -
-
- - pageheading)) : ?> -
-

- escape($this->pageheading); ?> -

-
- - - -
- -
-
- - -
- dates)) : ?> - - dates, Text::_('DATE_FORMAT_LC4')); ?> - - - - enddates) && $item->enddates != $item->dates) : ?> - - - - enddates, Text::_('DATE_FORMAT_LC4')); ?> - - -
- - -

- slug)) : ?> - - escape($item->title); ?> - - - escape($item->title); ?> - -

- - - venue)) : ?> -
- 📍 - venueslug)) : ?> - - escape($item->venue); ?> - - - - escape($item->venue); ?> - - - - city)) : ?> - - , escape($item->city); ?> - - -
- - - - introtext)) : ?> -
- introtext; ?> -
- - - - categories)) : ?> -
- categories as $category) : ?> - - escape($category->catname); ?> - - -
- - - - slug)) : ?> -
- - - -
- - -
-
- -
- - - pagination)) : ?> -
- pagination->getPagesLinks(); ?> -
- - - -
-

- -

-
- - -
-
diff --git a/src/html/com_jem/index.html b/src/html/com_jem/index.html deleted file mode 100644 index 2efb97f..0000000 --- a/src/html/com_jem/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_jem/venue/index.html b/src/html/com_jem/venue/index.html deleted file mode 100644 index 2efb97f..0000000 --- a/src/html/com_jem/venue/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_jem/venue/mobile.php b/src/html/com_jem/venue/mobile.php deleted file mode 100644 index 6c69804..0000000 --- a/src/html/com_jem/venue/mobile.php +++ /dev/null @@ -1,188 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for JEM venue view - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; -use Joomla\CMS\Router\Route; -use Joomla\CMS\HTML\HTMLHelper; - -$venue = $this->venue ?? null; -$events = $this->rows ?? []; - -if (!$venue) { - return; -} -?> - -
-
- - -
-

- escape($venue->venue); ?> -

-
- - - locimage)) : ?> -
- <?php echo $this->escape($venue->venue); ?> -
- - - -
- - - street) || !empty($venue->city) || !empty($venue->postalCode)) : ?> -
- 📍 -
- - : - -
- street)) : ?> -
- escape($venue->street); ?> -
- - postalCode) || !empty($venue->city)) : ?> -
- postalCode)) : ?> - - escape($venue->postalCode); ?> - - - city)) : ?> - - escape($venue->city); ?> - - -
- - state)) : ?> -
- escape($venue->state); ?> -
- - country)) : ?> -
- escape($venue->country); ?> -
- -
-
-
- - - - url)) : ?> -
- 🌐 -
- - : - - - escape($venue->url); ?> - -
-
- - - - locdescription)) : ?> -
-

- -

-
- locdescription; ?> -
-
- - -
- - - latitude) && !empty($venue->longitude)) : ?> -
-

- -

-
- -
-

-

- - - -

-
-
-
- - - - -
-

- -

-
- -
-
- dates)) : ?> - - dates, Text::_('DATE_FORMAT_LC4')); ?> - - -
-

- slug)) : ?> - - escape($event->title); ?> - - - escape($event->title); ?> - -

-
- -
-
- - - -
- - - -
- -
-
diff --git a/src/html/com_kunena/category/index.html b/src/html/com_kunena/category/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/com_kunena/category/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_kunena/category/mobile.php b/src/html/com_kunena/category/mobile.php deleted file mode 100644 index a45ece9..0000000 --- a/src/html/com_kunena/category/mobile.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for Kunena category list - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -$this->document->addStyleDeclaration(' -.kunena-category-list-responsive { - width: 100%; -} - -.kunena-category-responsive { - background: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); - padding: 1rem; - margin-bottom: 1rem; - transition: all 0.2s; -} - -.kunena-category-responsive:hover { - background: var(--secondary-bg); - border-color: var(--color-primary); -} - -@media (max-width: 575.98px) { - .kunena-category-responsive { - padding: 0.75rem; - } -} -'); -?> - -
- categories)) : ?> - categories as $category) : ?> -
-

- - escape($category->name); ?> - -

- - description) : ?> -
- displayField('description'); ?> -
- - -
- : numTopics; ?> - : numPosts; ?> -
-
- - -
- -
- -
diff --git a/src/html/com_kunena/topic/index.html b/src/html/com_kunena/topic/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/com_kunena/topic/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_osmembership/plan/index.html b/src/html/com_osmembership/plan/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/com_osmembership/plan/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_osmembership/plans/index.html b/src/html/com_osmembership/plans/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/com_osmembership/plans/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/com_osmembership/plans/mobile.php b/src/html/com_osmembership/plans/mobile.php deleted file mode 100644 index 41a447c..0000000 --- a/src/html/com_osmembership/plans/mobile.php +++ /dev/null @@ -1,141 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for OS Membership plans list - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -$this->document->addStyleDeclaration(' -.osmembership-plans-responsive { - display: grid; - gap: 2rem; - grid-template-columns: 1fr; -} - -.osmembership-plan-card { - background: var(--body-bg); - border: 2px solid var(--border-color); - border-radius: var(--border-radius); - padding: 2rem; - transition: all 0.3s; - display: flex; - flex-direction: column; -} - -.osmembership-plan-card:hover { - transform: translateY(-4px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); - border-color: var(--color-primary); -} - -.osmembership-plan-card--featured { - border-color: var(--color-primary); - position: relative; -} - -.osmembership-plan-card--featured::before { - content: "' . Text::_('OSM_POPULAR') . '"; - position: absolute; - top: -12px; - right: 20px; - background: var(--color-primary); - color: white; - padding: 0.25rem 1rem; - border-radius: 1rem; - font-size: 0.875rem; - font-weight: 600; -} - -@media (min-width: 768px) { - .osmembership-plans-responsive { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (min-width: 992px) { - .osmembership-plans-responsive { - grid-template-columns: repeat(3, 1fr); - } -} - -@media (min-width: 1200px) { - .osmembership-plans-responsive.osmembership-plans--many { - grid-template-columns: repeat(4, 1fr); - } -} -'); -?> - -
- items as $item) : ?> -
- image)) : ?> -
- <?php echo htmlspecialchars($item->title, ENT_COMPAT, 'UTF-8'); ?> -
- - -

- title, ENT_COMPAT, 'UTF-8'); ?> -

- -
- price > 0) : ?> -
- config->currency_symbol; ?> - price, 0); ?> -
- subscription_length > 0) : ?> -
- subscription_length . ' ' . Text::_('OSM_' . strtoupper($item->subscription_length_unit)); ?> -
- - -
- -
- -
- - short_description)) : ?> -
- short_description; ?> -
- - - features)) : ?> -
-
    - features) as $feature) : ?> - -
  • - - -
  • - - -
-
- - -
- - - - -
-
- -
diff --git a/src/html/mod_acymailing/index.html b/src/html/mod_acymailing/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_acymailing/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_acymailing/mobile.php b/src/html/mod_acymailing/mobile.php deleted file mode 100644 index 7ed3264..0000000 --- a/src/html/mod_acymailing/mobile.php +++ /dev/null @@ -1,82 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_acymailing module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); - -// Add responsive wrapper class -$wrapperClass = 'mod-acymailing mod-acymailing-responsive ' . $moduleclass_sfx; -?> - -
- -
- get('intro_text')) : ?> -
- get('intro_text'); ?> -
- - - - - get('outro_text')) : ?> -
- get('outro_text'); ?> -
- -
- -
-

-
- -
- - diff --git a/src/html/mod_articles_archive/default.php b/src/html/mod_articles_archive/default.php new file mode 100644 index 0000000..e76a8dd --- /dev/null +++ b/src/html/mod_articles_archive/default.php @@ -0,0 +1,36 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_articles_archive. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-articles-archive__title">title; ?>> + +
    + +
  • + text; ?> +
  • + +
+
diff --git a/src/html/mod_articles_archive/index.html b/src/html/mod_articles_archive/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_articles_archive/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_articles_categories/default.php b/src/html/mod_articles_categories/default.php new file mode 100644 index 0000000..7b37853 --- /dev/null +++ b/src/html/mod_articles_categories/default.php @@ -0,0 +1,44 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_articles_categories. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +$showDescription = $params->get('show_description', 0); +$numitems = $params->get('numitems', 0); +?> +
+ showtitle) : ?> + < class="mod-articles-categories__title">title; ?>> + +
    + +
  • + title; ?> + + (numitems; ?>) + + description)) : ?> +

    description; ?>

    + +
  • + +
+
diff --git a/src/html/mod_articles_categories/index.html b/src/html/mod_articles_categories/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_articles_categories/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_articles_category/default.php b/src/html/mod_articles_category/default.php new file mode 100644 index 0000000..079d6b6 --- /dev/null +++ b/src/html/mod_articles_category/default.php @@ -0,0 +1,78 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_articles_category. + * Adds showtitle support and respects module settings. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Factory; +use Joomla\CMS\HTML\HTMLHelper; +use Joomla\CMS\Language\Text; + +Factory::getApplication()->getLanguage()->load('mod_articles_category', JPATH_SITE); + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-articles-category__title">title; ?>> + +
    + +
  • + get('link_titles') == 1) : ?> + + title; ?> + + + title; ?> + + + displayHits) : ?> + + (displayHits; ?>) + + + + get('show_author', 0)) : ?> + + displayAuthorName; ?> + + + + displayDate) : ?> + + displayDate; ?> + + + + get('show_introtext', 0)) : ?> +
    + displayIntrotext; ?> +
    + + + get('show_readmore', 0)) : ?> + + + + +
  • + +
+
diff --git a/src/html/mod_articles_category/index.html b/src/html/mod_articles_category/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_articles_category/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_articles_latest/default.php b/src/html/mod_articles_latest/default.php new file mode 100644 index 0000000..4df78bb --- /dev/null +++ b/src/html/mod_articles_latest/default.php @@ -0,0 +1,40 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_articles_latest. + * Adds showtitle support and respects module settings. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Language\Text; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-articles-latest__title">title; ?>> + +
    + +
  • + + title; ?> + +
  • + +
+
diff --git a/src/html/mod_articles_latest/index.html b/src/html/mod_articles_latest/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_articles_latest/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_articles_news/default.php b/src/html/mod_articles_news/default.php new file mode 100644 index 0000000..aa46eac --- /dev/null +++ b/src/html/mod_articles_news/default.php @@ -0,0 +1,58 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_articles_news (newsflash). + * Adds showtitle support with card-based layout. + */ + +defined('_JEXEC') or die; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-articles-news__title">title; ?>> + + +
+ get('item_title')) : ?> +

+ link !== '' && $params->get('link_titles')) : ?> + title; ?> + + title; ?> + +

+ + + afterDisplayTitle)) : ?> + afterDisplayTitle; ?> + + + get('show_introtext', 1)) : ?> +
+ introtext; ?> +
+ + + readmore) && $item->readmore) : ?> + + linkText; ?> + + +
+ +
diff --git a/src/html/mod_articles_news/index.html b/src/html/mod_articles_news/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_articles_news/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_articles_popular/default.php b/src/html/mod_articles_popular/default.php new file mode 100644 index 0000000..6d3c6be --- /dev/null +++ b/src/html/mod_articles_popular/default.php @@ -0,0 +1,38 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_articles_popular. + * Adds showtitle support and respects module settings. + */ + +defined('_JEXEC') or die; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-articles-popular__title">title; ?>> + +
    + +
  • + + title; ?> + +
  • + +
+
diff --git a/src/html/mod_articles_popular/index.html b/src/html/mod_articles_popular/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_articles_popular/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_banners/default.php b/src/html/mod_banners/default.php new file mode 100644 index 0000000..455e633 --- /dev/null +++ b/src/html/mod_banners/default.php @@ -0,0 +1,52 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_banners. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\HTML\HTMLHelper; +use Joomla\CMS\Language\Text; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-banners__title">title; ?>> + + +
+ params->get('url') ?: ''; ?> + type == 1) : ?> + + params->get('imageurl', ''); ?> + name, ENT_COMPAT, 'UTF-8'); ?> + + + <?php echo $alt; ?> + + + <?php echo $alt; ?> + + + + custombannercode; ?> + +
+ +
diff --git a/src/html/mod_banners/index.html b/src/html/mod_banners/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_banners/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_breadcrumbs/default.php b/src/html/mod_breadcrumbs/default.php new file mode 100644 index 0000000..fbea28f --- /dev/null +++ b/src/html/mod_breadcrumbs/default.php @@ -0,0 +1,48 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_breadcrumbs. + * Bootstrap 5 breadcrumb with schema.org BreadcrumbList markup. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Factory; +use Joomla\CMS\Language\Text; + +Factory::getApplication()->getLanguage()->load('mod_breadcrumbs', JPATH_SITE); + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-breadcrumbs__title">title; ?>> + +
    + $item) : ?> + +
  1. > + link) : ?> + + name; ?> + + + name; ?> + + +
  2. + +
+
diff --git a/src/html/mod_breadcrumbs/index.html b/src/html/mod_breadcrumbs/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_breadcrumbs/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_cblogin/index.html b/src/html/mod_cblogin/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_cblogin/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_cblogin/mobile.php b/src/html/mod_cblogin/mobile.php deleted file mode 100644 index 4011014..0000000 --- a/src/html/mod_cblogin/mobile.php +++ /dev/null @@ -1,164 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_cblogin module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Factory; -use Joomla\CMS\Language\Text; - -// Ensure module language file is loaded -$lang = Factory::getLanguage(); -$lang->load('mod_cblogin', JPATH_SITE); - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); - -// Add responsive wrapper class -$wrapperClass = 'mod-cblogin mod-cblogin-responsive ' . $moduleclass_sfx; -?> - -
- -
- get('greeting', 1)) : ?> -
- -
- getField('avatar', null, 'html', 'none', 'list'); ?> -
-
- - getField('formatname', null, 'html', 'none', 'list'), ENT_COMPAT, 'UTF-8'); ?> - -
- -
- - -
-
- get('profileLink', 1) && $cbUser) : ?> - - - - - - - -
- - - - -
-
- -
- get('pretext')) : ?> -
- get('pretext'); ?> -
- - -
-
- - -
- -
- - -
- - get('remember_me', 1)) : ?> -
- - -
- -
- -
- -
- -
- get('lostpassword_link', 1)) : ?> - - - - - - - get('lostusername_link', 1)) : ?> - - - - - - - get('registration_link', 1)) : ?> - - - - - -
- - get('posttext')) : ?> -
- get('posttext'); ?> -
- - - - - - - - -
- -
diff --git a/src/html/mod_comprofilerOnline/index.html b/src/html/mod_comprofilerOnline/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_comprofilerOnline/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_comprofilerOnline/mobile.php b/src/html/mod_comprofilerOnline/mobile.php deleted file mode 100644 index dac596b..0000000 --- a/src/html/mod_comprofilerOnline/mobile.php +++ /dev/null @@ -1,99 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_comprofilerOnline module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Factory; -use Joomla\CMS\Language\Text; - -// Ensure module language file is loaded -$lang = Factory::getLanguage(); -$lang->load('mod_comprofilerOnline', JPATH_SITE); - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); - -// Add responsive wrapper class -$wrapperClass = 'mod-cb-online mod-cb-online-responsive ' . $moduleclass_sfx; -?> - -
- -
-
- - - - -
- - get('show_guest_count', 1)) : ?> -
- - - - - - - - -
- -
- - get('show_user_list', 1) && !empty($onlineUsers)) : ?> -
- get('header_level', 3); ?> class="mod-cb-online__heading"> - - get('header_level', 3); ?>> - -
    - -
  • - get('show_avatar', 1) && !empty($user->avatar)) : ?> -
    - avatar; ?> -
    - - -
    - get('link_names', 1) && !empty($user->link)) : ?> - - name, ENT_COMPAT, 'UTF-8'); ?> - - - - name, ENT_COMPAT, 'UTF-8'); ?> - - - - get('show_status', 1) && !empty($user->status)) : ?> - - status, ENT_COMPAT, 'UTF-8'); ?> - - -
    - - get('show_online_icon', 1)) : ?> - - - - -
  • - -
-
- - -
-

-
- -
diff --git a/src/html/mod_custom/default.php b/src/html/mod_custom/default.php new file mode 100644 index 0000000..5e03a50 --- /dev/null +++ b/src/html/mod_custom/default.php @@ -0,0 +1,39 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_custom. + * Adds showtitle support and respects all module settings. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\HTML\HTMLHelper; +use Joomla\CMS\Uri\Uri; + +$modId = 'mod-custom' . $module->id; +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); + +if ($params->get('backgroundimage')) { + /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ + $wa = $app->getDocument()->getWebAssetManager(); + $wa->addInlineStyle( + '#' . $modId . '{background-image: url("' . Uri::root(true) . '/' . HTMLHelper::_('cleanImageURL', $params->get('backgroundimage'))->url . '");}', + ['name' => $modId] + ); +} +?> +
+ showtitle) : ?> + < class="mod-custom__title">title; ?>> + + content; ?> +
diff --git a/src/html/mod_custom/hero.php b/src/html/mod_custom/hero.php index 5a5c951..d7368d6 100644 --- a/src/html/mod_custom/hero.php +++ b/src/html/mod_custom/hero.php @@ -1,12 +1,14 @@ * - * @copyright (C) 2026 Moko Consulting - * @license GNU General Public License version 2 or later; see LICENSE.txt + * This file is part of a Moko Consulting project. * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** * Template override for mod_custom adding banner-overlay wrapper pattern. * Based on Cassiopeia's banner layout approach. */ @@ -16,8 +18,10 @@ defined('_JEXEC') or die; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Uri\Uri; -$modId = 'mod-custom' . $module->id; -$moduleclass = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$modId = 'mod-custom' . $module->id; +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); if ($params->get('backgroundimage')) { /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ @@ -28,9 +32,11 @@ if ($params->get('backgroundimage')) { ); } ?> - -
+
+ showtitle) : ?> + < class="mod-custom__title">title; ?>> + content; ?>
diff --git a/src/html/mod_feed/default.php b/src/html/mod_feed/default.php new file mode 100644 index 0000000..f9ddb8f --- /dev/null +++ b/src/html/mod_feed/default.php @@ -0,0 +1,88 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_feed. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\HTML\HTMLHelper; + +if (!$feed) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +$rssurl = $params->get('rssurl', ''); +$rsstitle = $params->get('rsstitle', 1); +$rssdesc = $params->get('rssrtl', 0) ? ' feed-rtl' : ''; +$rssimage = $params->get('rssimage', 1); +$rssitems = $params->get('rssitems', 5); +$rssitemdesc = $params->get('rssitemdesc', 1); +$word_count = $params->get('word_count', 0); +?> +
+ showtitle) : ?> + < class="mod-feed__title">title; ?>> + + + title && $rsstitle) : ?> +

+ + + title; ?> + + + title; ?> + +

+ + + description && $rssdesc) : ?> +

description; ?>

+ + + image) : ?> + <?php echo $feed->image->title ?? ''; ?> + + + items)) : ?> +
    + items), $rssitems); $i < $max; $i++) : + $item = $feed->items[$i]; + ?> +
  • + uri)) : ?> + + title; ?> + + + title; ?> + + + content)) : + $desc = $item->content; + if ($word_count) { + $words = explode(' ', strip_tags($desc)); + if (count($words) > $word_count) { + $desc = implode(' ', array_slice($words, 0, $word_count)) . '…'; + } + } + ?> +

    + +
  • + +
+ +
diff --git a/src/html/mod_feed/index.html b/src/html/mod_feed/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_feed/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_finder/default.php b/src/html/mod_finder/default.php new file mode 100644 index 0000000..af54099 --- /dev/null +++ b/src/html/mod_finder/default.php @@ -0,0 +1,85 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_finder (Smart Search). + * Bootstrap 5 search form with showtitle support. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\HTML\HTMLHelper; +use Joomla\CMS\Language\Text; +use Joomla\CMS\Router\Route; + +// Load component language for search labels +$lang = $app->getLanguage(); +$lang->load('com_finder', JPATH_SITE); + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); + +$showLabel = $params->get('show_label', 1); +$labelClass = (!$showLabel ? 'visually-hidden ' : '') . 'finder'; + +Text::script('MOD_FINDER_SEARCH_VALUE'); + +/** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ +$wa = $app->getDocument()->getWebAssetManager(); +$wa->getRegistry()->addExtensionRegistryFile('com_finder'); + +if ($params->get('show_autosuggest', 1)) { + $wa->usePreset('awesomplete'); + $app->getDocument()->addScriptOptions('finder-search', ['url' => Route::_('index.php?option=com_finder&task=suggestions.suggest&format=json&tmpl=component', false)]); + Text::script('COM_FINDER_SEARCH_FORM_LIST_LABEL'); + Text::script('JLIB_JS_AJAX_ERROR_OTHER'); + Text::script('JLIB_JS_AJAX_ERROR_PARSE'); +} + +$wa->useScript('com_finder.finder'); +?> +
+ showtitle) : ?> + < class="mod-finder__title">title; ?>> + +
+ +
+ + get('show_button', 0)) : ?> + + +
+ + get('show_advanced', 0); ?> + + + + + +
+ +
+ + + bootModule('mod_finder', 'site')->getHelper('FinderHelper'); + echo $finderHelper->getHiddenFields($route); + ?> +
+
diff --git a/src/html/mod_finder/index.html b/src/html/mod_finder/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_finder/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_footer/default.php b/src/html/mod_footer/default.php new file mode 100644 index 0000000..aea199f --- /dev/null +++ b/src/html/mod_footer/default.php @@ -0,0 +1,29 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_footer. + * Adds showtitle support and respects module settings. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Language\Text; + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-footer__title">title; ?>> + +
+
+
diff --git a/src/html/mod_footer/index.html b/src/html/mod_footer/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_footer/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_hikashop_cart/index.html b/src/html/mod_hikashop_cart/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_hikashop_cart/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_hikashop_cart/mobile.php b/src/html/mod_hikashop_cart/mobile.php deleted file mode 100644 index cf0625b..0000000 --- a/src/html/mod_hikashop_cart/mobile.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_hikashop_cart module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); - -// Add responsive wrapper class -$wrapperClass = 'mod-hikashop-cart mod-hikashop-cart-responsive ' . $moduleclass_sfx; -?> - -
- products)) : ?> -
- - - -
-
- products); ?> - products) == 1 ? Text::_('ITEM') : Text::_('ITEMS'); ?> -
- total)) : ?> -
- total->price_value_with_tax_formated; ?> -
- -
-
- - get('show_products', 1)) : ?> -
- products as $product) : ?> -
- images[0]) && $params->get('show_image', 1)) : ?> -
- <?php echo htmlspecialchars($product->product_name, ENT_COMPAT, 'UTF-8'); ?> -
- - -
-
- product_name, ENT_COMPAT, 'UTF-8'); ?> -
- -
- : - cart_product_quantity; ?> -
- - prices[0])) : ?> -
- prices[0]->price_value_with_tax_formated; ?> -
- -
- - get('show_delete', 1)) : ?> -
- - - -
- -
- -
- - -
- get('show_cart_button', 1)) : ?> - - - - - - get('show_checkout_button', 1)) : ?> - - - - -
- -
- - - -

- -

-
- -
diff --git a/src/html/mod_k2_content/index.html b/src/html/mod_k2_content/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_k2_content/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_k2_content/mobile.php b/src/html/mod_k2_content/mobile.php deleted file mode 100644 index 1186f66..0000000 --- a/src/html/mod_k2_content/mobile.php +++ /dev/null @@ -1,112 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_k2_content module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\HTML\HTMLHelper; -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); - -// Add responsive wrapper class -$wrapperClass = 'mod-k2-content mod-k2-content-responsive ' . $moduleclass_sfx; -?> - -
- -
    - $item) : ?> -
  • - get('itemImage') && !empty($item->imageXSmall)) : ?> -
    - - <?php echo htmlspecialchars($item->title, ENT_COMPAT, 'UTF-8'); ?> - -
    - - -
    - get('itemTitle')) : ?> - get('item_heading', 4); ?> class="mod-k2-content__title"> - - title, ENT_COMPAT, 'UTF-8'); ?> - - get('item_heading', 4); ?>> - - - get('itemAuthor') || $params->get('itemDateCreated') || $params->get('itemCategory') || $params->get('itemHits')) : ?> -
    - get('itemAuthor')) : ?> - - - author; ?> - - - - get('itemDateCreated')) : ?> - - - - created, Text::_('DATE_FORMAT_LC3')); ?> - - - - - get('itemCategory')) : ?> - - - - categoryname; ?> - - - - - get('itemHits')) : ?> - - - hits; ?> - - -
    - - - get('itemIntroText') && !empty($item->introtext)) : ?> -
    - introtext; ?> -
    - - - get('itemReadMore')) : ?> -
    - - - - -
    - -
    -
  • - -
- - get('itemCustomLink')) : ?> -
- - get('itemCustomLinkTitle'); ?> - -
- - -
-

-
- -
diff --git a/src/html/mod_kunenalatest/index.html b/src/html/mod_kunenalatest/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_kunenalatest/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_kunenalatest/mobile.php b/src/html/mod_kunenalatest/mobile.php deleted file mode 100644 index 00d7b8d..0000000 --- a/src/html/mod_kunenalatest/mobile.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_kunenalatest module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\HTML\HTMLHelper; -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); - -// Add responsive wrapper class -$wrapperClass = 'mod-kunena-latest mod-kunena-latest-responsive ' . $moduleclass_sfx; -?> - -
- -
    - -
  • - get('sh_userpic', 1) && !empty($post->getAuthor()->getAvatarImage())) : ?> -
    - getAuthor()->getAvatarImage('', 40, 40); ?> -
    - - -
    - get('sh_topic', 1)) : ?> - get('header_level', 4); ?> class="mod-kunena-latest__title"> - - subject, ENT_COMPAT, 'UTF-8'); ?> - - get('header_level', 4); ?>> - - -
    - get('sh_username', 1)) : ?> - - - - getAuthor()->getName(); ?> - - - - - get('sh_time', 1)) : ?> - - - - getTime(); ?> - - - - - get('sh_category', 1)) : ?> - - - - getCategory()->name; ?> - - - - - get('sh_hits', 0)) : ?> - - - getTopic()->hits; ?> - - - - get('sh_replies', 0)) : ?> - - - getTopic()->getReplies(); ?> - - -
    - - get('sh_text', 0) && !empty($post->message)) : ?> -
    - message, $params->get('txt_len', 50)); ?> -
    - -
    -
  • - -
- - get('more_link', 1)) : ?> -
- - - - -
- - -
-

-
- -
diff --git a/src/html/mod_kunenalogin/index.html b/src/html/mod_kunenalogin/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_kunenalogin/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_kunenalogin/mobile.php b/src/html/mod_kunenalogin/mobile.php deleted file mode 100644 index ccbe30a..0000000 --- a/src/html/mod_kunenalogin/mobile.php +++ /dev/null @@ -1,187 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_kunenalogin module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; -use Joomla\CMS\Router\Route; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); - -// Add responsive wrapper class -$wrapperClass = 'mod-kunena-login mod-kunena-login-responsive ' . $moduleclass_sfx; -?> - -
- exists()) : ?> - -
- get('showAvatar', 1)) : ?> -
- getAvatarImage('', 60, 60); ?> -
- - -
-
- - getName(); ?> - -
- - get('showRank', 1) && !empty($kunena_my->getRank())) : ?> -
- getRank(); ?> -
- -
-
- - get('showStats', 1)) : ?> -
-
- : - posts; ?> -
- - get('showKarma', 0) && isset($kunena_my->karma)) : ?> -
- : - karma; ?> -
- -
- - -
- get('showProfile', 1)) : ?> - - - - - - - get('showMessages', 1)) : ?> - - - - - - - - - -
- - - - - -
-
- - -
- get('pretext')) : ?> -
- get('pretext'); ?> -
- - -
-
- - -
- -
- - -
- - get('showRememberMe', 1)) : ?> -
- - -
- -
- -
- -
- -
- get('showRegister', 1) && $usersConfig->get('allowUserRegistration')) : ?> - - - - - - - get('showForgot', 1)) : ?> - - - - - -
- - get('posttext')) : ?> -
- get('posttext'); ?> -
- - - - - - -
- -
diff --git a/src/html/mod_kunenasearch/index.html b/src/html/mod_kunenasearch/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_kunenasearch/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_kunenasearch/mobile.php b/src/html/mod_kunenasearch/mobile.php deleted file mode 100644 index afb4903..0000000 --- a/src/html/mod_kunenasearch/mobile.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_kunenasearch module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); - -// Add responsive wrapper class -$wrapperClass = 'mod-kunena-search mod-kunena-search-responsive ' . $moduleclass_sfx; - -$button_pos = $params->get('button_pos', 'right'); -$button_text = $params->get('button_text', ''); -?> - -
-
- - -
- -
- - -
- - -
- - -
- -
- - - - -
-
diff --git a/src/html/mod_kunenastats/index.html b/src/html/mod_kunenastats/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_kunenastats/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_kunenastats/mobile.php b/src/html/mod_kunenastats/mobile.php deleted file mode 100644 index 4f51727..0000000 --- a/src/html/mod_kunenastats/mobile.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_kunenastats module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); - -// Add responsive wrapper class -$wrapperClass = 'mod-kunena-stats mod-kunena-stats-responsive ' . $moduleclass_sfx; -?> - -
-
- get('sh_latestMemberCount', 1)) : ?> -
-
- -
-
-
memberCount; ?>
-
-
-
- - - get('sh_latestMember', 1) && !empty($kunena_stats->latestMember)) : ?> -
-
- -
-
-
-
- - latestMember->getName(); ?> - -
-
-
- - - get('sh_messageCount', 1)) : ?> -
-
- -
-
-
messageCount; ?>
-
-
-
- - - get('sh_topicCount', 1)) : ?> -
-
- -
-
-
topicCount; ?>
-
-
-
- - - get('sh_todayTopicCount', 0)) : ?> -
-
- -
-
-
todayTopicCount; ?>
-
-
-
- - - get('sh_yesterdayTopicCount', 0)) : ?> -
-
- -
-
-
yesterdayTopicCount; ?>
-
-
-
- -
-
diff --git a/src/html/mod_languages/default.php b/src/html/mod_languages/default.php new file mode 100644 index 0000000..d382ca3 --- /dev/null +++ b/src/html/mod_languages/default.php @@ -0,0 +1,63 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_languages. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\HTML\HTMLHelper; +use Joomla\CMS\Language\Text; +use Joomla\CMS\Uri\Uri; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-languages__title">title; ?>> + +
    + + active ? ' active' : ''; ?> +
  • + active) : ?> + + + + + + get('image', 1)) : ?> + image) : ?> + image . '.gif', '', null, true); ?> + + sef); ?> + + + + get('show_name', 1)) : ?> + title_native; ?> + + + active) : ?> + + + + +
  • + +
+
diff --git a/src/html/mod_languages/index.html b/src/html/mod_languages/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_languages/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_login/default.php b/src/html/mod_login/default.php new file mode 100644 index 0000000..7071b4f --- /dev/null +++ b/src/html/mod_login/default.php @@ -0,0 +1,126 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_login. + * Bootstrap 5 login form with showtitle support. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Factory; +use Joomla\CMS\HTML\HTMLHelper; +use Joomla\CMS\Language\Text; +use Joomla\CMS\Router\Route; + +Factory::getApplication()->getLanguage()->load('mod_login', JPATH_SITE); + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-login__title">title; ?>> + + + +
+ get('greeting', 1)) : ?> +
+ name)) : ?> + name, ENT_COMPAT, 'UTF-8')); ?> + + username, ENT_COMPAT, 'UTF-8')); ?> + +
+ +
+ +
+ + + + +
+ +
+ get('pretext')) : ?> +
get('pretext'); ?>
+ + +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ + 1) : ?> +
+ +
+ + +
+
+ + + get('remember', 1)) : ?> +
+ + +
+ + +
+ +
+ + +
    + get('allowUserRegistration')) : ?> +
  • + + + +
  • + +
  • + + + +
  • +
  • + + + +
  • +
+ + + + + + + get('posttext')) : ?> +
get('posttext'); ?>
+ +
+ +
diff --git a/src/html/mod_login/index.html b/src/html/mod_login/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_login/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_menu/default.php b/src/html/mod_menu/default.php new file mode 100644 index 0000000..aecbceb --- /dev/null +++ b/src/html/mod_menu/default.php @@ -0,0 +1,95 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_menu. + * Simple list menu with showtitle support, suitable for sidebars and footers. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Helper\ModuleHelper; + +$id = ''; + +if ($tagId = $params->get('tag_id', '')) { + $id = ' id="' . $tagId . '"'; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
aria-label="title, ENT_COMPAT, 'UTF-8'); ?>"> + showtitle) : ?> + < class="mod-menu__title">title; ?>> + +
    + &$item) : + $itemParams = $item->getParams(); + $class = 'nav-item mod-menu__item item-' . $item->id; + + if ($item->id == $default_id) { + $class .= ' default'; + } + + if ($item->id == $active_id || ($item->type === 'alias' && $itemParams->get('aliasoptions') == $active_id)) { + $class .= ' current'; + } + + if (in_array($item->id, $path)) { + $class .= ' active'; + } elseif ($item->type === 'alias') { + $aliasToId = $itemParams->get('aliasoptions'); + + if (count($path) > 0 && $aliasToId == $path[count($path) - 1]) { + $class .= ' active'; + } elseif (in_array($aliasToId, $path)) { + $class .= ' alias-parent-active'; + } + } + + if ($item->type === 'separator') { + $class .= ' divider'; + } + + if ($item->deeper) { + $class .= ' deeper'; + } + + if ($item->parent) { + $class .= ' parent'; + } + + echo '
  • '; + + switch ($item->type) : + case 'separator': + case 'component': + case 'heading': + case 'url': + require ModuleHelper::getLayoutPath('mod_menu', 'default_' . $item->type); + break; + + default: + require ModuleHelper::getLayoutPath('mod_menu', 'default_url'); + break; + endswitch; + + if ($item->deeper) { + echo '
      '; + } elseif ($item->shallower) { + echo ''; + echo str_repeat('
  • ', $item->level_diff); + } else { + echo ''; + } +endforeach; +?>
+
diff --git a/src/html/mod_menu/index.html b/src/html/mod_menu/index.html index a07609c..1a6c6cf 100644 --- a/src/html/mod_menu/index.html +++ b/src/html/mod_menu/index.html @@ -1,9 +1,76 @@ - + + + - - + + Redirecting… + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
diff --git a/src/html/mod_menu/mainmenu.php b/src/html/mod_menu/mainmenu.php index 0c43bdd..e664177 100644 --- a/src/html/mod_menu/mainmenu.php +++ b/src/html/mod_menu/mainmenu.php @@ -1,11 +1,13 @@ * - * @copyright (C) 2025 Moko Consulting - * @license GNU General Public License version 2 or later; see LICENSE.txt + * This file is part of a Moko Consulting project. * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** * Main Menu - Mobile responsive collapsible dropdown menu override * Bootstrap 5 responsive navbar with hamburger menu */ @@ -29,7 +31,7 @@ $moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COM
diff --git a/src/html/mod_menu/mainmenu_component.php b/src/html/mod_menu/mainmenu_component.php index 0707118..dfcfa7f 100644 --- a/src/html/mod_menu/mainmenu_component.php +++ b/src/html/mod_menu/mainmenu_component.php @@ -1,11 +1,13 @@ * - * @copyright (C) 2025 Moko Consulting - * @license GNU General Public License version 2 or later; see LICENSE.txt + * This file is part of a Moko Consulting project. * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** * Main Menu - Component item layout */ diff --git a/src/html/mod_menu/mainmenu_heading.php b/src/html/mod_menu/mainmenu_heading.php index 0b92a44..990077e 100644 --- a/src/html/mod_menu/mainmenu_heading.php +++ b/src/html/mod_menu/mainmenu_heading.php @@ -1,11 +1,13 @@ * - * @copyright (C) 2025 Moko Consulting - * @license GNU General Public License version 2 or later; see LICENSE.txt + * This file is part of a Moko Consulting project. * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** * Main Menu - Heading item layout */ diff --git a/src/html/mod_menu/mainmenu_separator.php b/src/html/mod_menu/mainmenu_separator.php index 2523962..2c0c587 100644 --- a/src/html/mod_menu/mainmenu_separator.php +++ b/src/html/mod_menu/mainmenu_separator.php @@ -1,11 +1,13 @@ * - * @copyright (C) 2025 Moko Consulting - * @license GNU General Public License version 2 or later; see LICENSE.txt + * This file is part of a Moko Consulting project. * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** * Main Menu - Separator item layout */ diff --git a/src/html/mod_menu/mainmenu_url.php b/src/html/mod_menu/mainmenu_url.php index abad710..10b380b 100644 --- a/src/html/mod_menu/mainmenu_url.php +++ b/src/html/mod_menu/mainmenu_url.php @@ -1,11 +1,13 @@ * - * @copyright (C) 2025 Moko Consulting - * @license GNU General Public License version 2 or later; see LICENSE.txt + * This file is part of a Moko Consulting project. * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** * Main Menu - URL item layout */ diff --git a/src/html/mod_osmembership/index.html b/src/html/mod_osmembership/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_osmembership/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_osmembership/mobile.php b/src/html/mod_osmembership/mobile.php deleted file mode 100644 index 80dfdb1..0000000 --- a/src/html/mod_osmembership/mobile.php +++ /dev/null @@ -1,105 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_osmembership module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); - -// Add responsive wrapper class -$wrapperClass = 'mod-osmembership mod-osmembership-responsive ' . $moduleclass_sfx; -?> - -
- -
- -
- get('show_plan_image', 1) && !empty($plan->image)) : ?> -
- <?php echo htmlspecialchars($plan->title, ENT_COMPAT, 'UTF-8'); ?> -
- - -
- get('header_level', 3); ?> class="mod-osmembership__plan-title"> - title, ENT_COMPAT, 'UTF-8'); ?> - get('header_level', 3); ?>> - - get('show_short_description', 1) && !empty($plan->short_description)) : ?> -
- short_description; ?> -
- - - get('show_price', 1)) : ?> -
- price > 0) : ?> -
- currency_symbol; ?> - price, 2); ?> - subscription_length > 0) : ?> - - / subscription_length . ' ' . Text::_('OSM_' . strtoupper($plan->subscription_length_unit)); ?> - - -
- -
- -
- -
- - - get('show_features', 1) && !empty($plan->features)) : ?> -
-
    - features) as $feature) : ?> - -
  • - - -
  • - - -
-
- - -
- - get('button_text', Text::_('OSM_SUBSCRIBE')); ?> - - -
-
-
- -
- - get('show_all_plans_link', 1)) : ?> -
- - - -
- - -
-

-
- -
diff --git a/src/html/mod_random_image/default.php b/src/html/mod_random_image/default.php new file mode 100644 index 0000000..2d89070 --- /dev/null +++ b/src/html/mod_random_image/default.php @@ -0,0 +1,41 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_random_image. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +if (empty($image)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-random-image__title">title; ?>> + + + + + <?php echo htmlspecialchars($image->name, ENT_COMPAT, 'UTF-8'); ?>width) : ?>width="width; ?>" + height) : ?>height="height; ?>" + class="mod-random-image__img" + loading="lazy" /> + + + +
diff --git a/src/html/mod_random_image/index.html b/src/html/mod_random_image/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_random_image/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_related_items/default.php b/src/html/mod_related_items/default.php new file mode 100644 index 0000000..8014400 --- /dev/null +++ b/src/html/mod_related_items/default.php @@ -0,0 +1,44 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_related_items. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\HTML\HTMLHelper; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +$showDate = $params->get('showDate', 0); +?> +
+ showtitle) : ?> + < class="mod-related-items__title">title; ?>> + +
    + +
  • + title; ?> + + + created, 'DATE_FORMAT_LC3'); ?> + + +
  • + +
+
diff --git a/src/html/mod_related_items/index.html b/src/html/mod_related_items/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_related_items/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_stats/default.php b/src/html/mod_stats/default.php new file mode 100644 index 0000000..d6aa1fd --- /dev/null +++ b/src/html/mod_stats/default.php @@ -0,0 +1,35 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_stats. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-stats__title">title; ?>> + +
+ +
title; ?>
+
data; ?>
+ +
+
diff --git a/src/html/mod_stats/index.html b/src/html/mod_stats/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_stats/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_syndicate/default.php b/src/html/mod_syndicate/default.php new file mode 100644 index 0000000..b56bec9 --- /dev/null +++ b/src/html/mod_syndicate/default.php @@ -0,0 +1,31 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_syndicate. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Language\Text; + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-syndicate__title">title; ?>> + + + + + +
diff --git a/src/html/mod_syndicate/index.html b/src/html/mod_syndicate/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_syndicate/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_tags_popular/default.php b/src/html/mod_tags_popular/default.php new file mode 100644 index 0000000..96e2b53 --- /dev/null +++ b/src/html/mod_tags_popular/default.php @@ -0,0 +1,41 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_tags_popular. + * Adds showtitle support with Bootstrap badge-style tags. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Language\Text; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-tags-popular__title">title; ?>> + +
+ + + title, ENT_COMPAT, 'UTF-8'); ?> + get('show_tag_count', 0)) : ?> + (count; ?>) + + + +
+
diff --git a/src/html/mod_tags_popular/index.html b/src/html/mod_tags_popular/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_tags_popular/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_tags_similar/default.php b/src/html/mod_tags_similar/default.php new file mode 100644 index 0000000..c850961 --- /dev/null +++ b/src/html/mod_tags_similar/default.php @@ -0,0 +1,38 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_tags_similar. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Language\Text; + +if (empty($list)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-tags-similar__title">title; ?>> + +
    + +
  • + core_title, ENT_COMPAT, 'UTF-8'); ?> +
  • + +
+
diff --git a/src/html/mod_tags_similar/index.html b/src/html/mod_tags_similar/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_tags_similar/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_users_latest/default.php b/src/html/mod_users_latest/default.php new file mode 100644 index 0000000..48c3404 --- /dev/null +++ b/src/html/mod_users_latest/default.php @@ -0,0 +1,41 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_users_latest. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\HTML\HTMLHelper; + +if (empty($names)) { + return; +} + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +?> +
+ showtitle) : ?> + < class="mod-users-latest__title">title; ?>> + +
    + +
  • + name, ENT_COMPAT, 'UTF-8'); ?> + + registerDate, 'DATE_FORMAT_LC3'); ?> + +
  • + +
+
diff --git a/src/html/mod_users_latest/index.html b/src/html/mod_users_latest/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_users_latest/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_virtuemart_cart/index.html b/src/html/mod_virtuemart_cart/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_virtuemart_cart/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_virtuemart_cart/mobile.php b/src/html/mod_virtuemart_cart/mobile.php deleted file mode 100644 index bc52f90..0000000 --- a/src/html/mod_virtuemart_cart/mobile.php +++ /dev/null @@ -1,122 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_virtuemart_cart module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\HTML\HTMLHelper; -use Joomla\CMS\Language\Text; - -// Load VirtueMart assets if not already loaded -vmJsApi::js('fancybox/jquery.fancybox-1.3.4.pack'); -vmJsApi::css('jquery.fancybox-1.3.4'); - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); -$show_price = $params->get('show_price', 1); -$show_product_list = $params->get('show_product_list', 1); - -// Add responsive wrapper class -$wrapperClass = 'mod-vm-cart mod-vm-cart-responsive ' . $moduleclass_sfx; -?> - -
- totalProduct) && $data->totalProduct > 0) : ?> -
- - - -
-
- totalProduct; ?> - totalProduct == 1 ? Text::_('MOD_VIRTUEMART_CART_ITEM') : Text::_('MOD_VIRTUEMART_CART_ITEMS'); ?> -
- billTotal)) : ?> -
- billTotal; ?> -
- -
-
- - products)) : ?> -
- products as $product) : ?> -
- image)) : ?> -
- - image; ?> - -
- - -
-
- - product_name, ENT_COMPAT, 'UTF-8'); ?> - -
- -
- : - quantity; ?> -
- - prices)) : ?> -
- prices; ?> -
- -
- - delete_link)) : ?> -
- - - -
- -
- -
- - -
- cart_show)) : ?> - - - - - - checkout_link)) : ?> - - - - -
- -
- - - -

- -

-
- -
diff --git a/src/html/mod_virtuemart_category/index.html b/src/html/mod_virtuemart_category/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_virtuemart_category/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_virtuemart_category/mobile.php b/src/html/mod_virtuemart_category/mobile.php deleted file mode 100644 index 34bcdce..0000000 --- a/src/html/mod_virtuemart_category/mobile.php +++ /dev/null @@ -1,85 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_virtuemart_category module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); -$show_images = $params->get('show_images', 1); -$show_description = $params->get('show_description', 0); -$show_product_count = $params->get('show_product_count', 0); - -// Add responsive wrapper class -$wrapperClass = 'mod-vm-category mod-vm-category-responsive ' . $moduleclass_sfx; -?> - -
- -
-
    - -
  • - current) ? 'aria-current="page"' : ''; ?>> - - images[0])) : ?> - - images[0]->displayMediaThumb('', false); ?> - - - - - category_name, ENT_COMPAT, 'UTF-8'); ?> - - - product_count)) : ?> - - (product_count; ?>) - - - - - category_description)) : ?> -
    - category_description, 50, '...'); ?> -
    - - - children)) : ?> -
      - children as $child) : ?> -
    • - current) ? 'aria-current="page"' : ''; ?>> - category_name, ENT_COMPAT, 'UTF-8'); ?> - product_count)) : ?> - - (product_count; ?>) - - - -
    • - -
    - -
  • - -
-
- -
-

-
- -
diff --git a/src/html/mod_virtuemart_currencies/index.html b/src/html/mod_virtuemart_currencies/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_virtuemart_currencies/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_virtuemart_currencies/mobile.php b/src/html/mod_virtuemart_currencies/mobile.php deleted file mode 100644 index 014a8b9..0000000 --- a/src/html/mod_virtuemart_currencies/mobile.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_virtuemart_currencies module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); -$text_before = $params->get('text_before', ''); -$text_after = $params->get('text_after', ''); - -// Add responsive wrapper class -$wrapperClass = 'mod-vm-currencies mod-vm-currencies-responsive ' . $moduleclass_sfx; -?> - -
- -
- -
- - -
- - -
- - - - -
- - - - - - -
- - -
- -
- -
diff --git a/src/html/mod_virtuemart_manufacturer/index.html b/src/html/mod_virtuemart_manufacturer/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_virtuemart_manufacturer/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_virtuemart_manufacturer/mobile.php b/src/html/mod_virtuemart_manufacturer/mobile.php deleted file mode 100644 index 41e3a84..0000000 --- a/src/html/mod_virtuemart_manufacturer/mobile.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_virtuemart_manufacturer module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); -$show_images = $params->get('show_images', 1); -$display_style = $params->get('display_style', 'list'); - -// Add responsive wrapper class -$wrapperClass = 'mod-vm-manufacturer mod-vm-manufacturer-responsive ' . $moduleclass_sfx; -?> - -
- -
- -
- - - images[0])) : ?> -
- images[0]->displayMediaThumb('', false); ?> -
- - -
- - mf_name, ENT_COMPAT, 'UTF-8'); ?> - - - mf_desc)) : ?> -
- mf_desc, 30, '...'); ?> -
- -
-
-
- -
- -
-

-
- -
diff --git a/src/html/mod_virtuemart_product/index.html b/src/html/mod_virtuemart_product/index.html deleted file mode 100644 index 09b7ab1..0000000 --- a/src/html/mod_virtuemart_product/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/html/mod_virtuemart_product/mobile.php b/src/html/mod_virtuemart_product/mobile.php deleted file mode 100644 index 4a62585..0000000 --- a/src/html/mod_virtuemart_product/mobile.php +++ /dev/null @@ -1,93 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - * - * Mobile responsive override for mod_virtuemart_product module - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\HTML\HTMLHelper; -use Joomla\CMS\Language\Text; - -$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); -$headerText = $params->get('headerText', ''); -$headerText = HTMLHelper::_('content.prepare', $headerText); -$display_style = $params->get('display_style', 'div'); - -// Add responsive wrapper class -$wrapperClass = 'mod-vm-product mod-vm-product-responsive ' . $moduleclass_sfx; -?> - -
- -
- -
- - - -
- -
- images[0])) : ?> -
- - images[0]->displayMediaThumb('', false); ?> - - - product_availability)) : ?> - - product_availability; ?> - - -
- - -
-

- - product_name, ENT_COMPAT, 'UTF-8'); ?> - -

- - product_s_desc)) : ?> -
- product_s_desc, 60, '...'); ?> -
- - - prices)) : ?> -
- prices; ?> -
- - -
- - - - - form)) : ?> -
- form; ?> -
- -
-
-
- -
- -
-

-
- -
diff --git a/src/html/mod_whosonline/default.php b/src/html/mod_whosonline/default.php new file mode 100644 index 0000000..e3942fc --- /dev/null +++ b/src/html/mod_whosonline/default.php @@ -0,0 +1,43 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_whosonline. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Language\Text; + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +$showmode = $params->get('showmode', 0); +?> +
+ showtitle) : ?> + < class="mod-whosonline__title">title; ?>> + + + +

+
+ +

+ + + +
    + +
  • username; ?>
  • + +
+ +
diff --git a/src/html/mod_whosonline/index.html b/src/html/mod_whosonline/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_whosonline/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/html/mod_wrapper/default.php b/src/html/mod_wrapper/default.php new file mode 100644 index 0000000..91b608b --- /dev/null +++ b/src/html/mod_wrapper/default.php @@ -0,0 +1,39 @@ + + * + * This file is part of a Moko Consulting project. + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Default layout override for mod_wrapper. + * Adds showtitle support. + */ + +defined('_JEXEC') or die; + +$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8'); +$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8'); +$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8'); +$url = htmlspecialchars($params->get('url', ''), ENT_COMPAT, 'UTF-8'); +$width = htmlspecialchars($params->get('width', '100%'), ENT_COMPAT, 'UTF-8'); +$height = htmlspecialchars($params->get('height', '500'), ENT_COMPAT, 'UTF-8'); +$scrolling = $params->get('scrolling', 'auto'); +$frameborder = $params->get('frameborder', 0) ? '1' : '0'; +?> +
+ showtitle) : ?> + < class="mod-wrapper__title">title; ?>> + + +
diff --git a/src/html/mod_wrapper/index.html b/src/html/mod_wrapper/index.html new file mode 100644 index 0000000..1a6c6cf --- /dev/null +++ b/src/html/mod_wrapper/index.html @@ -0,0 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/index.html b/src/index.html index fb0a3d0..1a6c6cf 100644 --- a/src/index.html +++ b/src/index.html @@ -1,27 +1,8 @@ - diff --git a/src/index.php b/src/index.php index 8d8a9a2..4fc14e0 100644 --- a/src/index.php +++ b/src/index.php @@ -1,31 +1,9 @@ +/* Copyright (C) 2025 Moko Consulting This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia - PATH: ./templates/mokocassiopeia/index.php - VERSION: 03.06.02 - BRIEF: Main template index file for MokoCassiopeia rendering site layout */ @@ -56,13 +34,25 @@ $params_googleanalyticsid = $this->params->get('googleanalyticsid', null); $params_googlesitekey = $this->params->get('googlesitekey', null); $params_custom_head_start = $this->params->get('custom_head_start', null); $params_custom_head_end = $this->params->get('custom_head_end', null); -$params_developmentmode = $this->params->get('developmentmode', false); +$params_developmentmode = $this->params->get('developmentmode', false) || $app->get('debug', false); +$params_favicon_source = (string) $this->params->get('favicon_source', ''); // Theme params $params_theme_enabled = $this->params->get('theme_enabled', 1); +$params_theme_control_type = (string) $this->params->get('theme_control_type', 'radios'); $params_theme_fab_enabled = $this->params->get('theme_fab_enabled', 1); $params_theme_fab_pos = $this->params->get('theme_fab_pos', 'br'); +// Accessibility params +$params_a11y_toolbar = $this->params->get('a11y_toolbar_enabled', 1); +$params_a11y_resize = $this->params->get('a11y_text_resize', 1); +$params_a11y_invert = $this->params->get('a11y_color_inversion', 1); +$params_a11y_contrast = $this->params->get('a11y_high_contrast', 1); +$params_a11y_links = $this->params->get('a11y_highlight_links', 1); +$params_a11y_font = $this->params->get('a11y_readable_font', 1); +$params_a11y_animations = $this->params->get('a11y_pause_animations', 1); +$params_a11y_pos = (string) $this->params->get('a11y_toolbar_pos', 'tl'); + // Detecting Active Variables $option = $input->getCmd('option', ''); $view = $input->getCmd('view', ''); @@ -74,23 +64,34 @@ $sitename = htmlspecialchars($sitenameR, ENT_QUOTES, 'UTF-8'); $menu = $app->getMenu()->getActive(); $pageclass = $menu !== null ? $menu->getParams()->get('pageclass_sfx', '') : ''; -// Respect “Site Name in Page Titles” (0:none, 1:before, 2:after) -$mode = (int) $app->get('sitename_pagetitles', 0); -$pageTitle = trim($this->getTitle()); -$final = $pageTitle !== '' - ? ($mode === 1 ? $sitenameR . ' - ' . $pageTitle - : ($mode === 2 ? $pageTitle . ' - ' . $sitenameR : $pageTitle)) - : $sitenameR; -$this->setTitle($final); - // Template/Media path $templatePath = 'media/templates/site/mokocassiopeia'; -// Core template CSS -$wa->useStyle('template.base'); // css/template.css +// Favicon generation +$faviconHeadTags = ''; +if ($params_favicon_source) { + require_once __DIR__ . '/helper/favicon.php'; + $faviconSourceAbs = JPATH_ROOT . '/' . ltrim($params_favicon_source, '/'); + $faviconOutputDir = JPATH_ROOT . '/images/favicons'; + $faviconUrlBase = Uri::root(true) . '/images/favicons'; -// Scripts -$wa->useScript('template.js'); + if (MokoFaviconHelper::generate($faviconSourceAbs, $faviconOutputDir)) { + $faviconHeadTags = MokoFaviconHelper::getHeadTags($faviconUrlBase); + } +} + +// Minification: dev mode ON → delete .min files; OFF → regenerate if stale +require_once __DIR__ . '/helper/minify.php'; +MokoMinifyHelper::sync(JPATH_ROOT . '/' . $templatePath, (bool) $params_developmentmode); + +// Core template CSS + JS — use minified when not in development mode +if ($params_developmentmode) { + $wa->useStyle('template.base'); // css/template.css + $wa->useScript('template.js'); // js/template.js +} else { + $wa->useStyle('template.base.min'); // css/template.min.css + $wa->useScript('template.js.min'); // js/template.min.js +} // Load Osaka font for site title $wa->useStyle('template.font.osaka'); @@ -178,8 +179,8 @@ if ($this->countModules('drawer-left', true)) { $hasClass .= ' has-drawer-left if ($this->countModules('drawer-right', true)) { $hasClass .= ' has-drawer-right'; } // Smart Bootstrap component loading - only load what's needed +HTMLHelper::_('bootstrap.collapse'); if ($this->countModules('drawer-left', true) || $this->countModules('drawer-right', true)) { - // Load Bootstrap Offcanvas component for drawers HTMLHelper::_('bootstrap.offcanvas'); } @@ -193,56 +194,57 @@ if (!empty($params_googlesitekey)) { $this->setMetaData('google-site-verification', htmlspecialchars($params_googlesitekey, ENT_QUOTES, 'UTF-8')); } -if ($this->params->get('fA6KitCode')) { - $faKit = "https://kit.fontawesome.com/" . $this->params->get('fA6KitCode') . ".js"; - HTMLHelper::_('script', $faKit, ['crossorigin' => 'anonymous']); +// Font Awesome 7 — Kit (CDN) or local files +$faKitCode = trim((string) $this->params->get('fA6KitCode', '')); +if ($faKitCode !== '') { + HTMLHelper::_('script', 'https://kit.fontawesome.com/' . $faKitCode . '.js', ['crossorigin' => 'anonymous']); } else { - try { - if($params_developmentmode){ - $wa->useStyle('vendor.fa7free.all'); - $wa->useStyle('vendor.fa7free.brands'); - $wa->useStyle('vendor.fa7free.fontawesome'); - $wa->useStyle('vendor.fa7free.regular'); - $wa->useStyle('vendor.fa7free.solid'); - } else { - $wa->useStyle('vendor.fa7free.all.min'); - $wa->useStyle('vendor.fa7free.brands.min'); - $wa->useStyle('vendor.fa7free.fontawesome.min'); - $wa->useStyle('vendor.fa7free.regular.min'); - $wa->useStyle('vendor.fa7free.solid.min'); - } - } catch (\Throwable $e) { - if($params_developmentmode){ - $wa->registerAndUseStyle('vendor.fa7free.all.dynamic', $templatePath . '/vendor/fa7free/css/all.css'); - $wa->registerAndUseStyle('vendor.fa7free.brands.dynamic', $templatePath . '/vendor/fa7free/css/brands.css'); - $wa->registerAndUseStyle('vendor.fa7free.fontawesome.dynamic', $templatePath . '/vendor/fa7free/css/fontawesome.css'); - $wa->registerAndUseStyle('vendor.fa7free.regular.dynamic', $templatePath . '/vendor/fa7free/css/regular.css'); - $wa->registerAndUseStyle('vendor.fa7free.solid.dynamic', $templatePath . '/vendor/fa7free/css/solid.css'); - } else { - $wa->registerAndUseStyle('vendor.fa7free.all.min.dynamic', $templatePath . '/vendor/fa7free/css/all.min.css'); - $wa->registerAndUseStyle('vendor.fa7free.brands.min.dynamic', $templatePath . '/vendor/fa7free/css/brands.min.css'); - $wa->registerAndUseStyle('vendor.fa7free.fontawesome.min.dynamic', $templatePath . '/vendor/fa7free/css/fontawesome.min.css'); - $wa->registerAndUseStyle('vendor.fa7free.regular.min.dynamic', $templatePath . '/vendor/fa7free/css/regular.min.css'); - $wa->registerAndUseStyle('vendor.fa7free.solid.min.dynamic', $templatePath . '/vendor/fa7free/css/solid.min.css'); - } + // Load local FA7 Free — all.css via WebAsset + // Resolve the actual filesystem path: media dir (Joomla install) or template dir (SFTP deploy) + $faCssFile = $params_developmentmode ? 'vendor/fa7free/css/all.css' : 'vendor/fa7free/css/all.min.css'; + $faCandidates = [ + $templatePath . '/' . $faCssFile, // media/templates/site/mokocassiopeia/... + 'templates/site/' . $this->template . '/media/' . $faCssFile, // templates/site/mokocassiopeia/media/... + ]; + // Also check via __DIR__ for edge cases + $faFromDir = __DIR__ . '/media/' . $faCssFile; + if (is_file($faFromDir)) { + $faCandidates[] = ltrim(str_replace('\\', '/', str_replace(JPATH_ROOT, '', $faFromDir)), '/'); + } + + $faRegistered = false; + foreach ($faCandidates as $faPath) { + if (is_file(JPATH_ROOT . '/' . $faPath)) { + $wa->registerStyle('vendor.fa7free.all', $faPath); + $faRegistered = true; + break; + } + } + + // Use the asset — either our dynamic registration or the one from joomla.asset.json + try { + $wa->useStyle('vendor.fa7free.all'); + } catch (\Throwable $e) { + // All paths exhausted — FA icons will rely on the IcoMoon compat layer } } $params_leftIcon = htmlspecialchars($this->params->get('drawerLeftIcon', 'fa-solid fa-chevron-left'), ENT_COMPAT, 'UTF-8'); $params_rightIcon = htmlspecialchars($this->params->get('drawerRightIcon', 'fa-solid fa-chevron-right'), ENT_COMPAT, 'UTF-8'); -// Load theme palette stylesheets based on configuration -$wa->useStyle('template.light.standard'); // css/theme/light.standard.css -$wa->useStyle('template.dark.standard'); // css/theme/dark.standard.css +// Load theme palette stylesheets — minified when not in development mode +$suffix = $params_developmentmode ? '' : '.min'; +$wa->useStyle('template.light.standard' . $suffix); +$wa->useStyle('template.dark.standard' . $suffix); // Load custom palettes only if selected in template configuration AND files exist if ($params_LightColorName === 'custom' && file_exists(JPATH_ROOT . '/media/templates/site/mokocassiopeia/css/theme/light.custom.css')) { - $wa->useStyle('template.light.custom'); + $wa->useStyle('template.light.custom' . $suffix); } if ($params_DarkColorName === 'custom' && file_exists(JPATH_ROOT . '/media/templates/site/mokocassiopeia/css/theme/dark.custom.css')) { - $wa->useStyle('template.dark.custom'); + $wa->useStyle('template.dark.custom' . $suffix); } // Load user assets last (after all other styles and scripts) @@ -254,6 +256,9 @@ $wa->useScript('user.js'); // js/user.js + + + + " role="banner"> +
countModules('topbar')) : ?>
@@ -373,7 +387,7 @@ $wa->useScript('user.js'); // js/user.js
countModules('below-topbar')) : ?> -
+
@@ -469,12 +483,20 @@ $wa->useScript('user.js'); // js/user.js
- + countModules('main-top', true)) : ?> +
+ +
+
- + countModules('main-bottom', true)) : ?> +
+ +
+
countModules('sidebar-right', true)) : ?> @@ -511,15 +533,15 @@ $wa->useScript('user.js'); // js/user.js params->get('backTop') == 1) : ?> - + countModules('drawer-left', true)) : ?>
-
- +
+
@@ -530,8 +552,8 @@ $wa->useScript('user.js'); // js/user.js countModules('drawer-right', true)) : ?>
-
- +
+
diff --git a/src/joomla.asset.json b/src/joomla.asset.json index a305b51..ff60ae1 100644 --- a/src/joomla.asset.json +++ b/src/joomla.asset.json @@ -17,7 +17,7 @@ "defgroup": "Joomla.Template.Site", "ingroup": "MokoCassiopeia.Template.Assets", "path": "./media/templates/site/mokocassiopeia/joomla.asset.json", - "version": "03.06.02", + "version": "03.09.02", "brief": "Joomla asset registry for MokoCassiopeia" } }, diff --git a/src/language/en-GB/index.html b/src/language/en-GB/index.html index 480348d..1a6c6cf 100644 --- a/src/language/en-GB/index.html +++ b/src/language/en-GB/index.html @@ -1,27 +1,8 @@ - diff --git a/src/language/en-GB/tpl_mokocassiopeia.ini b/src/language/en-GB/tpl_mokocassiopeia.ini index 52d7017..945950b 100644 --- a/src/language/en-GB/tpl_mokocassiopeia.ini +++ b/src/language/en-GB/tpl_mokocassiopeia.ini @@ -1,21 +1,12 @@ -; Copyright (C) 2026 Moko Consulting +; Copyright (C) 2025 Moko Consulting ; ; This file is part of a Moko Consulting project. ; ; SPDX-License-Identifier: GPL-3.0-or-later -; -; #FILE INFORMATION -; DEFGROUP: Joomla.Template.Site -; INGROUP: MokoCassiopeia -; PATH: ./language/en-GB/tpl_mokocassiopeia.ini -; VERSION: 03.09.01 -; BRIEF: English (GB) language strings for the MokoCassiopeia Joomla template -; -; Note: Template metadata strings (name, description) are in tpl_mokocassiopeia.sys.ini ; ===== System / layout ===== TPL_MOKOCASSIOPEIA_DEVELOPMENTMODE_LABEL="Development Mode" -TPL_MOKOCASSIOPEIA_DEVELOPMENTMODE_DESC="If 'Development Mode' is active, certain features may be disabled, such as Google Tag Manager and Google Analytics." +TPL_MOKOCASSIOPEIA_DEVELOPMENTMODE_DESC="When enabled, unminified CSS and JavaScript files are loaded for easier debugging. When disabled, minified assets are served for faster page loads. Google Tag Manager and Google Analytics may also be disabled in development mode." TPL_MOKOCASSIOPEIA_FLUID_LABEL="Layout" TPL_MOKOCASSIOPEIA_STATIC="Static" TPL_MOKOCASSIOPEIA_FLUID="Fluid" @@ -36,6 +27,12 @@ TPL_MOKOCASSIOPEIA_DRAWER_LEFT_ICON_DESC="Enter the Font-Awesome class for the l TPL_MOKOCASSIOPEIA_DRAWER_RIGHT_ICON_LABEL="Drawer Right Icon CSS" TPL_MOKOCASSIOPEIA_DRAWER_RIGHT_ICON_DESC="Enter the Font-Awesome class for the right drawer toggle (e.g. 'fas fa-chevron-right')." +; ===== Favicon ===== +TPL_MOKOCASSIOPEIA_FAVICON_FIELDSET_LABEL="Favicon" +TPL_MOKOCASSIOPEIA_FAVICON_NOTE="

Upload a square PNG image (recommended 512×512 or larger). The template will automatically generate all required favicon sizes including ICO, Apple Touch Icon (180×180), and Android icons (192×192, 512×512). Generated files are cached in images/favicons/.

" +TPL_MOKOCASSIOPEIA_FAVICON_SOURCE_LABEL="Favicon Source Image" +TPL_MOKOCASSIOPEIA_FAVICON_SOURCE_DESC="Select a square PNG image to use as the site favicon. Recommended size: 512×512 pixels or larger." + ; ===== Google ===== TPL_MOKOCASSIOPEIA_GOOGLE_FIELDSET_LABEL="Google" TPL_MOKOCASSIOPEIA_GOOGLE_NOTE_TEXT="

PLEASE NOTE:

If fields are left blank, relative Google features will not be used" @@ -69,6 +66,7 @@ TPL_MOKOCASSIOPEIA_FONT_NOTE_TEXT="Loading fonts from external sources might be ; ===== Header & navigation (Theme tab) ===== TPL_MOKOCASSIOPEIA_STICKY_LABEL="Sticky Header" TPL_MOKOCASSIOPEIA_BACKTOTOP="Back to Top" +TPL_MOKOCASSIOPEIA_TOC_TITLE="Table of Contents" TPL_MOKOCASSIOPEIA_BACKTOTOP_LABEL="Back-to-top Link" TPL_MOKOCASSIOPEIA_TOC="Table of Contents" @@ -77,9 +75,9 @@ TPL_MOKOCASSIOPEIA_COLOR_NAME_STANDARD="Standard" TPL_MOKOCASSIOPEIA_COLOR_NAME_CUSTOM="Custom" ; New labels for Theme tab dropdowns TPL_MOKOCASSIOPEIA_COLOR_LIGHT_NAME_LABEL="Light colour palette" -TPL_MOKOCASSIOPEIA_COLOR_LIGHT_NAME_DESC="Select a colour palette for light mode. Standard uses the default blue theme with comprehensive styling for all components. Custom loads media/templates/site/mokocassiopeia/css/theme/light.custom.css — copy the starter file from templates/mokocassiopeia/templates/light.custom.css and customise the CSS variables to match your brand." +TPL_MOKOCASSIOPEIA_COLOR_LIGHT_NAME_DESC="Select a colour palette for light mode. Standard uses the default blue theme with comprehensive styling for all components. Custom loads media/templates/site/mokocassiopeia/css/theme/light.custom.css — copy the starter file from templates/mokocassiopeia/templates/light.custom.css and customise the CSS variables to match your brand. This file is stored in the media folder and will not be overwritten by template updates." TPL_MOKOCASSIOPEIA_COLOR_DARK_NAME_LABEL="Dark colour palette" -TPL_MOKOCASSIOPEIA_COLOR_DARK_NAME_DESC="Select a colour palette for dark mode. Standard uses the default blue theme optimised for dark backgrounds with proper contrast. Custom loads media/templates/site/mokocassiopeia/css/theme/dark.custom.css — copy the starter file from templates/mokocassiopeia/templates/dark.custom.css and customise the CSS variables to match your brand." +TPL_MOKOCASSIOPEIA_COLOR_DARK_NAME_DESC="Select a colour palette for dark mode. Standard uses the default blue theme optimised for dark backgrounds with proper contrast. Custom loads media/templates/site/mokocassiopeia/css/theme/dark.custom.css — copy the starter file from templates/mokocassiopeia/templates/dark.custom.css and customise the CSS variables to match your brand. This file is stored in the media folder and will not be overwritten by template updates." ; ===== Theme tab (core feature strings) ===== TPL_MOKO_THEME_FIELDSET="Theme" @@ -111,6 +109,29 @@ TPL_MOKO_THEME_FAB_ENABLED_DESC="Display a persistent, accessible theme toggle." TPL_MOKO_THEME_FAB_POS="Floating switch position" TPL_MOKO_THEME_FAB_POS_DESC="Screen corner for the toggle." +; ===== Accessibility toolbar ===== +TPL_MOKO_A11Y_TOOLBAR_ENABLED="Accessibility toolbar" +TPL_MOKO_A11Y_TOOLBAR_ENABLED_DESC="Show a floating accessibility toolbar with text resize and colour inversion controls." +TPL_MOKO_A11Y_TEXT_RESIZE="Text resize" +TPL_MOKO_A11Y_TEXT_RESIZE_DESC="Allow visitors to increase or decrease text size." +TPL_MOKO_A11Y_COLOR_INVERSION="Colour inversion" +TPL_MOKO_A11Y_COLOR_INVERSION_DESC="Allow visitors to invert page colours for improved readability." +TPL_MOKO_A11Y_TOOLBAR_POS="Toolbar position" +TPL_MOKO_A11Y_TOOLBAR_POS_DESC="Screen corner for the accessibility toolbar." +TPL_MOKO_A11Y_BTN_LABEL="Accessibility options" +TPL_MOKO_A11Y_TEXT_DECREASE="Decrease text size" +TPL_MOKO_A11Y_TEXT_RESET="Reset text size" +TPL_MOKO_A11Y_TEXT_INCREASE="Increase text size" +TPL_MOKO_A11Y_INVERT_COLORS="Invert colours" +TPL_MOKO_A11Y_HIGH_CONTRAST="High contrast" +TPL_MOKO_A11Y_HIGH_CONTRAST_DESC="Allow visitors to boost page contrast for improved readability." +TPL_MOKO_A11Y_HIGHLIGHT_LINKS="Highlight links" +TPL_MOKO_A11Y_HIGHLIGHT_LINKS_DESC="Allow visitors to outline all links so they stand out from surrounding text." +TPL_MOKO_A11Y_READABLE_FONT="Readable font" +TPL_MOKO_A11Y_READABLE_FONT_DESC="Allow visitors to switch to a clean system font optimised for readability." +TPL_MOKO_A11Y_PAUSE_ANIMATIONS="Pause animations" +TPL_MOKO_A11Y_PAUSE_ANIMATIONS_DESC="Allow visitors to stop all CSS animations and transitions." + ; ===== CSS Variables tab ===== TPL_MOKOCASSIOPEIA_CSS_VARS_FIELDSET_LABEL="CSS Variables" TPL_MOKOCASSIOPEIA_CSS_VARS_INTRO="

All colours, spacing and layout values are driven by CSS custom properties. To override any variable without editing the template, add your overrides to media/templates/site/mokocassiopeia/css/user.css, or create a custom palette file (see the Theme tab). Variables are scoped to :root[data-bs-theme="light"] or :root[data-bs-theme="dark"] so light and dark values are independent.

" @@ -151,7 +172,7 @@ TPL_MOKOCASSIOPEIA_CSS_VARS_HERO_DESC="Applied to the .custom-hero TPL_MOKOCASSIOPEIA_CSS_VARS_HERO_VARIANTS_LABEL="Hero Variants (.hero#primary / .hero#secondary)" TPL_MOKOCASSIOPEIA_CSS_VARS_HERO_VARIANTS_DESC="Two-variant hero system using .hero#primary and .hero#secondary. Each variant resolves its own CSS variable set per theme.

Primary variant — homepage, main landing pages (sky blue tint, softer overlay)
--hero-primary-bg-color — Fallback background colour
--hero-primary-overlay — Gradient overlay tint
--hero-primary-color — Text colour

Secondary variant — inner pages, events, about (navy overlay, lighter text)
--hero-secondary-bg-color — Fallback background colour
--hero-secondary-overlay — Gradient overlay tint
--hero-secondary-color — Text colour

HTML usage:
<div class="hero" id="primary" style="background-image:url(...)">" -TPL_MOKOCASSIOPEIA_CSS_VARS_BLOCK_COLORS_LABEL="Block Color System (top-a / top-b / bottom-a / bottom-b)" +TPL_MOKOCASSIOPEIA_CSS_VARS_BLOCK_COLORS_LABEL="Block Colour System (top-a / top-b / bottom-a / bottom-b)" TPL_MOKOCASSIOPEIA_CSS_VARS_BLOCK_COLORS_DESC="Automatic brand colour palette for modules in top-a, top-b, bottom-a, and bottom-b positions. Colours assigned by :nth-child() order — no classes needed.

Slot palette
--block-color-1 / --block-text-1 — 1st module
--block-color-2 / --block-text-2 — 2nd module
--block-color-3 / --block-text-3 — 3rd module
--block-color-4 / --block-text-4 — 4th module

Named overrides (add an ID to the module HTML to bypass slot colour)
--block-highlight-bg / --block-highlight-text — for #block-highlight
--block-cta-bg / --block-cta-text — for #block-cta
--block-alert-bg / --block-alert-text — for #block-alert

Priority: Named ID > Slot colour. No !important needed — specificity handles it." TPL_MOKOCASSIOPEIA_CSS_VARS_HEADER_LABEL="Header Background" @@ -238,6 +259,16 @@ TPL_MOKOCASSIOPEIA_CSS_VARS_VM_DESC="Surfaces & text
+; Copyright (C) 2025 Moko Consulting ; ; This file is part of a Moko Consulting project. ; ; SPDX-License-Identifier: GPL-3.0-or-later ; -; #FILE INFORMATION -; DEFGROUP: Joomla.Template.Site -; INGROUP: MokoCassiopeia -; PATH: ./language/en-GB/tpl_mokocassiopeia.sys.ini -; VERSION: 03.09.01 -; BRIEF: English (GB) system language strings for template metadata and installer -; TPL_MOKOCASSIOPEIA="MokoCassiopeia Site template" TPL_MOKOCASSIOPEIA_GOOGLE_FIELDSET_LABEL="Google" TPL_MOKOCASSIOPEIA_DRAWERS_FIELDSET_LABEL="Drawers" TPL_MOKOCASSIOPEIA_MOD_MENU_LAYOUT_COLLAPSE_METISMENU="Collapsible Dropdown" TPL_MOKOCASSIOPEIA_MOD_MENU_LAYOUT_DROPDOWN_METISMENU="Dropdown" TPL_MOKOCASSIOPEIA_POSITION_BANNER="Banner" -TPL_MOKOCASSIOPEIA_POSITION_BELOW_TOP="Below Top" +TPL_MOKOCASSIOPEIA_POSITION_BELOW_TOP="Below Topbar" TPL_MOKOCASSIOPEIA_POSITION_BRAND_ASIDE="Brand Aside" TPL_MOKOCASSIOPEIA_POSITION_BOTTOM_A="Bottom-A" TPL_MOKOCASSIOPEIA_POSITION_BOTTOM_B="Bottom-B" diff --git a/src/language/en-US/index.html b/src/language/en-US/index.html index 480348d..1a6c6cf 100644 --- a/src/language/en-US/index.html +++ b/src/language/en-US/index.html @@ -1,27 +1,8 @@ - diff --git a/src/language/en-US/tpl_mokocassiopeia.ini b/src/language/en-US/tpl_mokocassiopeia.ini index 23980c3..f70f948 100644 --- a/src/language/en-US/tpl_mokocassiopeia.ini +++ b/src/language/en-US/tpl_mokocassiopeia.ini @@ -1,21 +1,12 @@ -; Copyright (C) 2026 Moko Consulting +; Copyright (C) 2025 Moko Consulting ; ; This file is part of a Moko Consulting project. ; ; SPDX-License-Identifier: GPL-3.0-or-later -; -; #FILE INFORMATION -; DEFGROUP: Joomla.Template.Site -; INGROUP: MokoCassiopeia -; PATH: ./language/en-US/tpl_mokocassiopeia.ini -; VERSION: 03.09.01 -; BRIEF: English (US) language strings for the MokoCassiopeia Joomla template -; -; Note: Template metadata strings (name, description) are in tpl_mokocassiopeia.sys.ini ; ===== System / layout ===== TPL_MOKOCASSIOPEIA_DEVELOPMENTMODE_LABEL="Development Mode" -TPL_MOKOCASSIOPEIA_DEVELOPMENTMODE_DESC="If 'Development Mode' is active, certain features may be disabled, such as Google Tag Manager and Google Analytics." +TPL_MOKOCASSIOPEIA_DEVELOPMENTMODE_DESC="When enabled, unminified CSS and JavaScript files are loaded for easier debugging. When disabled, minified assets are served for faster page loads. Google Tag Manager and Google Analytics may also be disabled in development mode." TPL_MOKOCASSIOPEIA_FLUID_LABEL="Layout" TPL_MOKOCASSIOPEIA_STATIC="Static" TPL_MOKOCASSIOPEIA_FLUID="Fluid" @@ -36,6 +27,12 @@ TPL_MOKOCASSIOPEIA_DRAWER_LEFT_ICON_DESC="Enter the Font-Awesome class for the l TPL_MOKOCASSIOPEIA_DRAWER_RIGHT_ICON_LABEL="Drawer Right Icon CSS" TPL_MOKOCASSIOPEIA_DRAWER_RIGHT_ICON_DESC="Enter the Font-Awesome class for the right drawer toggle (e.g. 'fas fa-chevron-right')." +; ===== Favicon ===== +TPL_MOKOCASSIOPEIA_FAVICON_FIELDSET_LABEL="Favicon" +TPL_MOKOCASSIOPEIA_FAVICON_NOTE="

Upload a square PNG image (recommended 512×512 or larger). The template will automatically generate all required favicon sizes including ICO, Apple Touch Icon (180×180), and Android icons (192×192, 512×512). Generated files are cached in images/favicons/.

" +TPL_MOKOCASSIOPEIA_FAVICON_SOURCE_LABEL="Favicon Source Image" +TPL_MOKOCASSIOPEIA_FAVICON_SOURCE_DESC="Select a square PNG image to use as the site favicon. Recommended size: 512×512 pixels or larger." + ; ===== Google ===== TPL_MOKOCASSIOPEIA_GOOGLE_FIELDSET_LABEL="Google" TPL_MOKOCASSIOPEIA_GOOGLE_NOTE_TEXT="

PLEASE NOTE:

If fields are left blank, relative Google features will not be used" @@ -69,6 +66,7 @@ TPL_MOKOCASSIOPEIA_FONT_NOTE_TEXT="Loading fonts from external sources might be ; ===== Header & navigation (Theme tab) ===== TPL_MOKOCASSIOPEIA_STICKY_LABEL="Sticky Header" TPL_MOKOCASSIOPEIA_BACKTOTOP="Back to Top" +TPL_MOKOCASSIOPEIA_TOC_TITLE="Table of Contents" TPL_MOKOCASSIOPEIA_BACKTOTOP_LABEL="Back-to-top Link" TPL_MOKOCASSIOPEIA_TOC="Table of Contents" @@ -77,9 +75,9 @@ TPL_MOKOCASSIOPEIA_COLOR_NAME_STANDARD="Standard" TPL_MOKOCASSIOPEIA_COLOR_NAME_CUSTOM="Custom" ; New labels for Theme tab dropdowns TPL_MOKOCASSIOPEIA_COLOR_LIGHT_NAME_LABEL="Light color palette" -TPL_MOKOCASSIOPEIA_COLOR_LIGHT_NAME_DESC="Select a color palette for light mode. Standard uses the default blue theme with comprehensive styling for all components. Custom loads media/templates/site/mokocassiopeia/css/theme/light.custom.css — copy the starter file from templates/mokocassiopeia/templates/light.custom.css and customize the CSS variables to match your brand." +TPL_MOKOCASSIOPEIA_COLOR_LIGHT_NAME_DESC="Select a color palette for light mode. Standard uses the default blue theme with comprehensive styling for all components. Custom loads media/templates/site/mokocassiopeia/css/theme/light.custom.css — copy the starter file from templates/mokocassiopeia/templates/light.custom.css and customize the CSS variables to match your brand. This file is stored in the media folder and will not be overwritten by template updates." TPL_MOKOCASSIOPEIA_COLOR_DARK_NAME_LABEL="Dark color palette" -TPL_MOKOCASSIOPEIA_COLOR_DARK_NAME_DESC="Select a color palette for dark mode. Standard uses the default blue theme optimized for dark backgrounds with proper contrast. Custom loads media/templates/site/mokocassiopeia/css/theme/dark.custom.css — copy the starter file from templates/mokocassiopeia/templates/dark.custom.css and customize the CSS variables to match your brand." +TPL_MOKOCASSIOPEIA_COLOR_DARK_NAME_DESC="Select a color palette for dark mode. Standard uses the default blue theme optimized for dark backgrounds with proper contrast. Custom loads media/templates/site/mokocassiopeia/css/theme/dark.custom.css — copy the starter file from templates/mokocassiopeia/templates/dark.custom.css and customize the CSS variables to match your brand. This file is stored in the media folder and will not be overwritten by template updates." ; ===== Theme tab (core feature strings) ===== TPL_MOKO_THEME_FIELDSET="Theme" @@ -111,6 +109,29 @@ TPL_MOKO_THEME_FAB_ENABLED_DESC="Display a persistent, accessible theme toggle." TPL_MOKO_THEME_FAB_POS="Floating switch position" TPL_MOKO_THEME_FAB_POS_DESC="Screen corner for the toggle." +; ===== Accessibility toolbar ===== +TPL_MOKO_A11Y_TOOLBAR_ENABLED="Accessibility toolbar" +TPL_MOKO_A11Y_TOOLBAR_ENABLED_DESC="Show a floating accessibility toolbar with text resize and color inversion controls." +TPL_MOKO_A11Y_TEXT_RESIZE="Text resize" +TPL_MOKO_A11Y_TEXT_RESIZE_DESC="Allow visitors to increase or decrease text size." +TPL_MOKO_A11Y_COLOR_INVERSION="Color inversion" +TPL_MOKO_A11Y_COLOR_INVERSION_DESC="Allow visitors to invert page colors for improved readability." +TPL_MOKO_A11Y_TOOLBAR_POS="Toolbar position" +TPL_MOKO_A11Y_TOOLBAR_POS_DESC="Screen corner for the accessibility toolbar." +TPL_MOKO_A11Y_BTN_LABEL="Accessibility options" +TPL_MOKO_A11Y_TEXT_DECREASE="Decrease text size" +TPL_MOKO_A11Y_TEXT_RESET="Reset text size" +TPL_MOKO_A11Y_TEXT_INCREASE="Increase text size" +TPL_MOKO_A11Y_INVERT_COLORS="Invert colors" +TPL_MOKO_A11Y_HIGH_CONTRAST="High contrast" +TPL_MOKO_A11Y_HIGH_CONTRAST_DESC="Allow visitors to boost page contrast for improved readability." +TPL_MOKO_A11Y_HIGHLIGHT_LINKS="Highlight links" +TPL_MOKO_A11Y_HIGHLIGHT_LINKS_DESC="Allow visitors to outline all links so they stand out from surrounding text." +TPL_MOKO_A11Y_READABLE_FONT="Readable font" +TPL_MOKO_A11Y_READABLE_FONT_DESC="Allow visitors to switch to a clean system font optimized for readability." +TPL_MOKO_A11Y_PAUSE_ANIMATIONS="Pause animations" +TPL_MOKO_A11Y_PAUSE_ANIMATIONS_DESC="Allow visitors to stop all CSS animations and transitions." + ; ===== CSS Variables tab ===== TPL_MOKOCASSIOPEIA_CSS_VARS_FIELDSET_LABEL="CSS Variables" TPL_MOKOCASSIOPEIA_CSS_VARS_INTRO="

All colors, spacing and layout values are driven by CSS custom properties. To override any variable without editing the template, add your overrides to media/templates/site/mokocassiopeia/css/user.css, or create a custom palette file (see the Theme tab). Variables are scoped to :root[data-bs-theme="light"] or :root[data-bs-theme="dark"] so light and dark values are independent.

" @@ -238,6 +259,16 @@ TPL_MOKOCASSIOPEIA_CSS_VARS_VM_DESC="Surfaces & text
+; Copyright (C) 2025 Moko Consulting ; ; This file is part of a Moko Consulting project. ; ; SPDX-License-Identifier: GPL-3.0-or-later ; -; #FILE INFORMATION -; DEFGROUP: Joomla.Template.Site -; INGROUP: MokoCassiopeia -; PATH: ./language/en-US/tpl_mokocassiopeia.sys.ini -; VERSION: 03.09.01 -; BRIEF: English (US) system language strings for template metadata and installer -; TPL_MOKOCASSIOPEIA="MokoCassiopeia Site template" TPL_MOKOCASSIOPEIA_GOOGLE_FIELDSET_LABEL="Google" TPL_MOKOCASSIOPEIA_DRAWERS_FIELDSET_LABEL="Drawers" TPL_MOKOCASSIOPEIA_MOD_MENU_LAYOUT_COLLAPSE_METISMENU="Collapsible Dropdown" TPL_MOKOCASSIOPEIA_MOD_MENU_LAYOUT_DROPDOWN_METISMENU="Dropdown" TPL_MOKOCASSIOPEIA_POSITION_BANNER="Banner" -TPL_MOKOCASSIOPEIA_POSITION_BELOW_TOP="Below Top" +TPL_MOKOCASSIOPEIA_POSITION_BELOW_TOPBAR="Below Topbar" TPL_MOKOCASSIOPEIA_POSITION_BRAND_ASIDE="Brand Aside" TPL_MOKOCASSIOPEIA_POSITION_BOTTOM_A="Bottom-A" TPL_MOKOCASSIOPEIA_POSITION_BOTTOM_B="Bottom-B" diff --git a/src/language/index.html b/src/language/index.html index 480348d..1a6c6cf 100644 --- a/src/language/index.html +++ b/src/language/index.html @@ -1,27 +1,8 @@ - diff --git a/src/media/css/editor.css b/src/media/css/editor.css index cdef689..0488a2a 100644 --- a/src/media/css/editor.css +++ b/src/media/css/editor.css @@ -4,15 +4,6 @@ This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia - PATH: ./media/templates/site/mokocassiopeia/css/editor.css - VERSION: 03.05.00 - BRIEF: Stylesheet for Joomla editor content within MokoCassiopeia template */ /* STYLES FOR JOOMLA! EDITOR */ diff --git a/src/media/css/fonts/fira-sans.css b/src/media/css/fonts/fira-sans.css index 1c17706..729f88a 100644 --- a/src/media/css/fonts/fira-sans.css +++ b/src/media/css/fonts/fira-sans.css @@ -1,16 +1,8 @@ -/* Copyright (C) 2026 Moko Consulting +/* Copyright (C) 2025 Moko Consulting This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia.Styles - PATH: ./media/templates/site/mokocassiopeia/css/fonts/fira-sans.css - VERSION: 03.08.04 - BRIEF: Fira Sans font family definitions (self-hosted) */ /* diff --git a/src/media/css/fonts/noto-sans.css b/src/media/css/fonts/noto-sans.css index c011dd1..d9549f5 100644 --- a/src/media/css/fonts/noto-sans.css +++ b/src/media/css/fonts/noto-sans.css @@ -1,16 +1,8 @@ -/* Copyright (C) 2026 Moko Consulting +/* Copyright (C) 2025 Moko Consulting This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia.Styles - PATH: ./media/templates/site/mokocassiopeia/css/fonts/noto-sans.css - VERSION: 03.08.04 - BRIEF: Noto Sans font family definitions (self-hosted) */ /* diff --git a/src/media/css/fonts/osaka.css b/src/media/css/fonts/osaka.css index 42d3a98..1f75ffd 100644 --- a/src/media/css/fonts/osaka.css +++ b/src/media/css/fonts/osaka.css @@ -1,7 +1,8 @@ -/** - * @package MokoCassiopeia - * @copyright (C) 2026 Moko Consulting - * @license GNU General Public License version 3 or later +/* Copyright (C) 2025 Moko Consulting + + This file is part of a Moko Consulting project. + + SPDX-License-Identifier: GPL-3.0-or-later */ @font-face { diff --git a/src/media/css/fonts/roboto.css b/src/media/css/fonts/roboto.css index bf68f47..de14bfa 100644 --- a/src/media/css/fonts/roboto.css +++ b/src/media/css/fonts/roboto.css @@ -1,16 +1,8 @@ -/* Copyright (C) 2026 Moko Consulting +/* Copyright (C) 2025 Moko Consulting This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia.Styles - PATH: ./media/templates/site/mokocassiopeia/css/fonts/roboto.css - VERSION: 03.08.04 - BRIEF: Roboto font family definitions (self-hosted) */ /* diff --git a/src/media/css/index.html b/src/media/css/index.html index 480348d..1a6c6cf 100644 --- a/src/media/css/index.html +++ b/src/media/css/index.html @@ -1,27 +1,8 @@ - diff --git a/src/media/css/system/index.html b/src/media/css/system/index.html index 480348d..1a6c6cf 100644 --- a/src/media/css/system/index.html +++ b/src/media/css/system/index.html @@ -1,27 +1,8 @@ - diff --git a/src/media/css/system/searchtools/index.html b/src/media/css/system/searchtools/index.html index 480348d..1a6c6cf 100644 --- a/src/media/css/system/searchtools/index.html +++ b/src/media/css/system/searchtools/index.html @@ -1,27 +1,8 @@ - diff --git a/src/media/css/system/searchtools/searchtools.css b/src/media/css/system/searchtools/searchtools.css index 069dd2f..1a9bd2d 100644 --- a/src/media/css/system/searchtools/searchtools.css +++ b/src/media/css/system/searchtools/searchtools.css @@ -4,15 +4,6 @@ This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia - PATH: ./media/templates/site/mokocassiopeia/css/system/searchtools/searchtools.css - VERSION: 03.05.00 - BRIEF: Stylesheet for Joomla search tools integration in MokoCassiopeia template */ .js-stools-container-bar { diff --git a/src/media/css/template-rtl.css b/src/media/css/template-rtl.css index efd1cda..42d6c42 100644 --- a/src/media/css/template-rtl.css +++ b/src/media/css/template-rtl.css @@ -4,15 +4,6 @@ This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia - PATH: ./media/templates/site/mokocassiopeia/css/template-rtl.css - VERSION: 03.05.00 - BRIEF: Right-to-left (RTL) layout stylesheet for MokoCassiopeia template */ /*! diff --git a/src/media/css/template.css b/src/media/css/template.css index fcafb99..4e357e7 100644 --- a/src/media/css/template.css +++ b/src/media/css/template.css @@ -4,15 +4,6 @@ This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia - PATH: ./media/templates/site/mokocassiopeia/css/template.css - VERSION: 03.05.00 - BRIEF: Main stylesheet providing layout, typography, and component styles for MokoCassiopeia */ *, @@ -62,12 +53,12 @@ body { margin: 0; font-family: var(--body-font-family); - font-size: var(--body-font-size); - font-weight: var(--body-font-weight); - line-height: var(--body-line-height); - color: var(--body-color); + font-size: var(--body-font-size, 1rem); + font-weight: var(--body-font-weight, 400); + line-height: var(--body-line-height, 1.5); + color: var(--body-color, #e6ebf1); text-align: var(--body-text-align); - background: var(--body-bg); + background: var(--body-bg, #0e1318); -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } @@ -79,22 +70,22 @@ form { .table-of-contents-ck-wrap { width: 30%; float: right; - border: 1px solid var(--color-primary); + border: 1px solid var(--color-primary, #112855); } .table-of-contents-ck-toggler { font-size: 2em; font-weight: bold; - background-color: var(--gray-500); - padding: var(--btn-padding-y) var(--btn-padding-x); - color: var(--color-link); + background-color: var(--gray-500, #36404a); + padding: var(--btn-padding-y, 0.6rem) var(--btn-padding-x, 1rem); + color: var(--color-link, white); text-align: center; } .table-of-contents-ck-toggler a { font-size: .5em; font-weight: normal; - color: var(--color-link); + color: var(--color-link, white); display: block; text-align: center; } @@ -102,7 +93,7 @@ form { .table-of-contents-ck, .table-of-contents-ck a { font-size: 1.25em; - color: var(--color-link); + color: var(--color-link, white); } .offcanvas-start, @@ -111,25 +102,25 @@ form { } .drawer-toggle-left{ - position: fixed !important; - top: 250px !important; - left: 0px !important; - z-index: 1050 !important; - background-color: var(--nav-bg-color) !important; - color: var(--nav-text-color) !important; - padding-left: .5rem !important; - padding-right: .5rem !important; + position: fixed; + top: 50%; + left: 0px; + z-index: 1050; + background-color: var(--nav-bg-color); + color: var(--nav-text-color, gray); + padding-left: .5rem; + padding-right: .5rem; } .drawer-toggle-right{ - position: fixed !important; - top: 250px !important; - right: 0px !important; - z-index: 1050 !important; - background-color: var(--nav-bg-color) !important; - color: var(--nav-text-color) !important; - padding-left: .5rem !important; - padding-right: .5rem !important; + position: fixed; + top: 50%; + right: 0px; + z-index: 1050; + background-color: var(--nav-bg-color); + color: var(--nav-text-color, gray); + padding-left: .5rem; + padding-right: .5rem; } hr { @@ -284,7 +275,7 @@ small, mark, .mark { padding: 0.1875em; - background-color: var(--highlight-bg); + background-color: var(--highlight-bg, #ffe28a1a); } sub, @@ -304,7 +295,7 @@ sup { } a { - color: var(--link-color); + color: var(--link-color, #8ab4f8); text-decoration: underline; } @@ -342,8 +333,10 @@ pre code { code { font-size: 0.875em; - color: var(--code-color); + color: var(--code-color, black); word-wrap: break-word; + padding: calc(var(--padding-x, 0.15rem) * 3); + background-color: var(--code-bg-color, lightgreen); } a>code { @@ -353,8 +346,8 @@ a>code { kbd { padding: 0.1875rem 0.375rem; font-size: 0.875em; - color: var(--body-bg); - background-color: var(--body-color); + color: var(--body-bg, #0e1318); + background-color: var(--body-color, #e6ebf1); border-radius: 0.2rem; } @@ -686,8 +679,8 @@ progress { .img-thumbnail { padding: 0.25rem; - background-color: var(--body-color); - border: 1px solid var(--border-color); + background-color: var(--body-color, #e6ebf1); + border: 1px solid var(--border-color, #2b323b); border-radius: 0.25rem; max-width: 100%; height: auto; @@ -722,7 +715,6 @@ progress { padding-left: calc(var(--gutter-x) * 0.5); margin-right: auto; margin-left: auto; - padding-bottom: calc(var(--gutter-x) * 0.5); } .topten-view, @@ -730,7 +722,7 @@ progress { .latest-view, .recent-view, .products-view { - border-top: var(--accent-color-primary) 1px groove; + border-top: var(--accent-color-primary, #3f8ff0) 1px groove; } @media (min-width: 576px) { @@ -791,9 +783,9 @@ progress { display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; - margin-top: calc(-1 * var(--gutter-y)); - margin-right: calc(-0.5 * var(--gutter-x)); - margin-left: calc(-0.5 * var(--gutter-x)); + margin-top: 0; + margin-right: 0; + margin-left: 0; } .row > * { @@ -2350,10 +2342,10 @@ progress { .table> :not(caption)>*>* { padding: 0.5rem 0.5rem; - background-color: var(--table-bg); + background-color: var(--table-bg, transparent); border-bottom-width: 1px; - -webkit-box-shadow: inset 0 0 0 9999px var(--table-accent-bg); - box-shadow: inset 0 0 0 9999px var(--table-accent-bg); + -webkit-box-shadow: inset 0 0 0 9999px var(--table-accent-bg, transparent); + box-shadow: inset 0 0 0 9999px var(--table-accent-bg, transparent); } .table>tbody { @@ -2393,22 +2385,22 @@ progress { } .table-striped>tbody>tr:nth-of-type(odd)>* { - --table-accent-bg: var(--table-striped-bg); + --table-accent-bg: var(--table-striped-bg, rgba(var(--white-rgb), var(--opacity-5))); color: var(--table-striped-color); } .table-striped-columns> :not(caption)>tr> :nth-child(even) { - --table-accent-bg: var(--table-striped-bg); + --table-accent-bg: var(--table-striped-bg, rgba(var(--white-rgb), var(--opacity-5))); color: var(--table-striped-color); } .table-active { - --table-accent-bg: var(--table-active-bg); + --table-accent-bg: var(--table-active-bg, rgba(var(--white-rgb), 0.1)); color: var(--table-active-color); } .table-active>tbody>tr:active>* { - --table-accent-bg: var(--table-active-bg); + --table-accent-bg: var(--table-active-bg, rgba(var(--white-rgb), 0.1)); color: var(--table-active-color); } @@ -2511,15 +2503,15 @@ progress { } .table-dark { - --table-color: var(--body-color); + --table-color: var(--body-color, #e6ebf1); --table-bg: hsl(210, 10%, 23%); --table-border-color: #494f54; --table-striped-bg: #3f454b; - --table-striped-color: var(--body-color); + --table-striped-color: var(--body-color, #e6ebf1); --table-active-bg: #494f54; - --table-active-color: var(--body-color); + --table-active-color: var(--body-color, #e6ebf1); --table-active-bg: #444a4f; - --table-active-color: var(--body-color); + --table-active-color: var(--body-color, #e6ebf1); color: var(--table-color); border-color: var(--table-border-color); } @@ -2601,10 +2593,10 @@ progress { font-size: 1rem; font-weight: 400; line-height: 1; - color: var(--input-color); - background-color: var(--input-bg); + color: var(--input-color, #e6ebf1); + background-color: var(--input-bg, #1a2332); background-clip: padding-box; - border: 1px solid var(--input-border-color); + border: 1px solid var(--input-border-color, #3a4250); -webkit-appearance: none; -moz-appearance: none; appearance: none; @@ -2633,12 +2625,12 @@ progress { } .form-control:focus { - color: var(--input-color); - background-color: var(--input-bg); - border-color: var(--input-focus-border-color); + color: var(--input-color, #e6ebf1); + background-color: var(--input-bg, #1a2332); + border-color: var(--input-focus-border-color, #5472ff); outline: 0; - -webkit-box-shadow: var(--input-focus-box-shadow); - box-shadow: var(--input-focus-box-shadow); + -webkit-box-shadow: var(--input-focus-box-shadow, 0 0 0 0.25rem rgba(84, 114, 255, 0.25)); + box-shadow: var(--input-focus-box-shadow, 0 0 0 0.25rem rgba(84, 114, 255, 0.25)); } .form-control::-webkit-date-and-time-value { @@ -2646,33 +2638,33 @@ progress { } .form-control::-webkit-input-placeholder { - color: var(--input-placeholder-color); + color: var(--input-placeholder-color, #8894aa); opacity: 1; } .form-control::-moz-placeholder { - color: var(--input-placeholder-color); + color: var(--input-placeholder-color, #8894aa); opacity: 1; } .form-control:-ms-input-placeholder { - color: var(--input-placeholder-color); + color: var(--input-placeholder-color, #8894aa); opacity: 1; } .form-control::-ms-input-placeholder { - color: var(--input-placeholder-color); + color: var(--input-placeholder-color, #8894aa); opacity: 1; } .form-control::placeholder { - color: var(--input-placeholder-color); + color: var(--input-placeholder-color, #8894aa); opacity: 1; } .form-control:disabled { - background-color: var(--input-disabled-bg); - border-color: var(--input-disabled-border-color); + background-color: var(--input-disabled-bg, #0f1318); + border-color: var(--input-disabled-border-color, #2b323b); opacity: 1; } @@ -2729,11 +2721,11 @@ progress { } .form-control:active:not(:disabled):not([readonly])::-webkit-file-upload-button { - background-color: var(--input-file-button-active-bg); + background-color: var(--input-file-button-active-bg, #2b3441); } .form-control:active:not(:disabled):not([readonly])::file-selector-button { - background-color: var(--input-file-button-active-bg); + background-color: var(--input-file-button-active-bg, #2b3441); } .form-control-plaintext { @@ -2878,7 +2870,7 @@ textarea.form-control-lg { .form-select:focus, .custom-select:focus { - border-color: var(--input-focus-border-color); + border-color: var(--input-focus-border-color, #5472ff); outline: 0; -webkit-box-shadow: 0 0 0 0.25rem rgba(1, 1, 86, 0.25); box-shadow: 0 0 0 0.25rem rgba(1, 1, 86, 0.25); @@ -2948,7 +2940,7 @@ textarea.form-control-lg { height: 1em; margin-top: 0.25em; vertical-align: top; - background-color: var(--body-color); + background-color: var(--body-color, #e6ebf1); background-repeat: no-repeat; background-position: center; background-size: contain; @@ -2974,7 +2966,7 @@ textarea.form-control-lg { } .form-check-input:focus { - border-color: var(--input-focus-border-color); + border-color: var(--input-focus-border-color, #5472ff); outline: 0; -webkit-box-shadow: 0 0 0 0.25rem rgba(1, 1, 86, 0.25); box-shadow: 0 0 0 0.25rem rgba(1, 1, 86, 0.25); @@ -3088,12 +3080,12 @@ textarea.form-control-lg { } .form-range:focus::-webkit-slider-thumb { - -webkit-box-shadow: 0 0 0 1px var(--body-color), 0 0 0 0.25rem rgba(1, 1, 86, 0.25); - box-shadow: 0 0 0 1px var(--body-color), 0 0 0 0.25rem rgba(1, 1, 86, 0.25); + -webkit-box-shadow: 0 0 0 1px var(--body-color, #e6ebf1), 0 0 0 0.25rem rgba(1, 1, 86, 0.25); + box-shadow: 0 0 0 1px var(--body-color, #e6ebf1), 0 0 0 0.25rem rgba(1, 1, 86, 0.25); } .form-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px var(--body-color), 0 0 0 0.25rem rgba(1, 1, 86, 0.25); + box-shadow: 0 0 0 1px var(--body-color, #e6ebf1), 0 0 0 0.25rem rgba(1, 1, 86, 0.25); } .form-range::-moz-focus-outer { @@ -3123,7 +3115,7 @@ textarea.form-control-lg { } .form-range::-webkit-slider-thumb:active { - background-color: var(--form-range-thumb-active-bg); + background-color: var(--form-range-thumb-active-bg, #4a5766); } .form-range::-webkit-slider-runnable-track { @@ -3156,7 +3148,7 @@ textarea.form-control-lg { } .form-range::-moz-range-thumb:active { - background-color: var(--form-range-thumb-active-bg); + background-color: var(--form-range-thumb-active-bg, #4a5766); } .form-range::-moz-range-track { @@ -3451,7 +3443,7 @@ textarea.form-control-lg { padding: 0.25rem 0.5rem; margin-top: 0.1rem; font-size: 0.875rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); background-color: rgba(68, 131, 68, 0.9); border-radius: 0.25rem; } @@ -3574,7 +3566,7 @@ textarea.form-control.is-valid { padding: 0.25rem 0.5rem; margin-top: 0.1rem; font-size: 0.875rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); background-color: rgba(165, 31, 24, 0.9); border-radius: 0.25rem; } @@ -3690,30 +3682,30 @@ textarea.form-control.is-invalid { .btn:active { color: var(--btn-active-color); - background-color: var(--btn-active-bg); - border-color: var(--btn-active-border-color); + background-color: var(--btn-active-bg, hsl(210, 10%, 30%)); + border-color: var(--btn-active-border-color, transparent); } .btn-check+.btn:active { color: var(--btn-color); - background-color: var(--btn-bg); - border-color: var(--btn-border-color); + background-color: var(--btn-bg, transparent); + border-color: var(--btn-border-color, transparent); } .btn:focus-visible { color: var(--btn-active-color); - background-color: var(--btn-active-bg); - border-color: var(--btn-active-border-color); + background-color: var(--btn-active-bg, hsl(210, 10%, 30%)); + border-color: var(--btn-active-border-color, transparent); outline: 0; - -webkit-box-shadow: var(--btn-focus-box-shadow); - box-shadow: var(--btn-focus-box-shadow); + -webkit-box-shadow: var(--btn-focus-box-shadow, 0 0 0 0.25rem rgba(var(--btn-focus-shadow-rgb), .5)); + box-shadow: var(--btn-focus-box-shadow, 0 0 0 0.25rem rgba(var(--btn-focus-shadow-rgb), .5)); } .btn-check:focus-visible+.btn { - border-color: var(--btn-active-border-color); + border-color: var(--btn-active-border-color, transparent); outline: 0; - -webkit-box-shadow: var(--btn-focus-box-shadow); - box-shadow: var(--btn-focus-box-shadow); + -webkit-box-shadow: var(--btn-focus-box-shadow, 0 0 0 0.25rem rgba(var(--btn-focus-shadow-rgb), .5)); + box-shadow: var(--btn-focus-box-shadow, 0 0 0 0.25rem rgba(var(--btn-focus-shadow-rgb), .5)); } .btn-check:checked+.btn, @@ -3722,8 +3714,8 @@ textarea.form-control.is-invalid { .btn.active, .btn.show { color: var(--btn-active-color); - background-color: var(--btn-active-bg); - border-color: var(--btn-active-border-color); + background-color: var(--btn-active-bg, hsl(210, 10%, 30%)); + border-color: var(--btn-active-border-color, transparent); } .btn-check:checked+.btn:focus-visible, @@ -3731,23 +3723,23 @@ textarea.form-control.is-invalid { .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { - -webkit-box-shadow: var(--btn-focus-box-shadow); - box-shadow: var(--btn-focus-box-shadow); + -webkit-box-shadow: var(--btn-focus-box-shadow, 0 0 0 0.25rem rgba(var(--btn-focus-shadow-rgb), .5)); + box-shadow: var(--btn-focus-box-shadow, 0 0 0 0.25rem rgba(var(--btn-focus-shadow-rgb), .5)); } .btn:disabled, .btn.disabled, fieldset:disabled .btn { - color: var(--btn-disabled-color); + color: var(--btn-disabled-color, #6d7781); pointer-events: none; - background-color: var(--btn-disabled-bg); - border-color: var(--btn-disabled-border-color); - opacity: var(--btn-disabled-opacity); + background-color: var(--btn-disabled-bg, transparent); + border-color: var(--btn-disabled-border-color, transparent); + opacity: var(--btn-disabled-opacity, 0.65); } .btn-link { --btn-font-weight: 400; - --btn-color: var(--link-color); + --btn-color: var(--link-color, #8ab4f8); --btn-bg: transparent; --btn-border-color: transparent; --btn-active-color: var(--link-active-color); @@ -3870,25 +3862,25 @@ fieldset:disabled .btn { .dropdown-menu { /* Values defined in light.standard.css / dark.standard.css */ position: absolute; - z-index: var(--dropdown-zindex); + z-index: var(--dropdown-zindex, 1000); display: none; - min-width: var(--dropdown-min-width); - padding: var(--dropdown-padding-y) var(--dropdown-padding-x); + min-width: var(--dropdown-min-width, 10rem); + padding: var(--dropdown-padding-y, 0.5rem) var(--dropdown-padding-x, 0); margin: 0; - font-size: var(--dropdown-font-size); + font-size: var(--dropdown-font-size, 1rem); color: var(--dropdown-color); text-align: left; list-style: none; background-color: var(--dropdown-bg); background-clip: padding-box; - border: var(--dropdown-border-width) solid var(--dropdown-border-color); - border-radius: var(--dropdown-border-radius); + border: var(--dropdown-border-width, 1px) solid var(--dropdown-border-color); + border-radius: var(--dropdown-border-radius, 0.25rem); } .dropdown-menu[data-bs-popper] { top: 100%; left: 0; - margin-top: var(--dropdown-spacer); + margin-top: var(--dropdown-spacer, 0.125rem); } .dropdown-menu-start { @@ -4013,7 +4005,7 @@ fieldset:disabled .btn { top: auto; bottom: 100%; margin-top: 0; - margin-bottom: var(--dropdown-spacer); + margin-bottom: var(--dropdown-spacer, 0.125rem); } .dropup .dropdown-toggle::after { @@ -4036,7 +4028,7 @@ fieldset:disabled .btn { right: auto; left: 100%; margin-top: 0; - margin-left: var(--dropdown-spacer); + margin-left: var(--dropdown-spacer, 0.125rem); } .dropend .dropdown-toggle::after { @@ -4063,7 +4055,7 @@ fieldset:disabled .btn { right: 100%; left: auto; margin-top: 0; - margin-right: var(--dropdown-spacer); + margin-right: var(--dropdown-spacer, 0.125rem); } .dropstart .dropdown-toggle::after { @@ -4097,7 +4089,7 @@ fieldset:disabled .btn { .dropdown-divider { height: 0; - margin: var(--dropdown-divider-margin-y) 0; + margin: var(--dropdown-divider-margin-y, 0.5rem) 0; overflow: hidden; border-top: 1px solid var(--dropdown-divider-bg); opacity: 1; @@ -4106,7 +4098,7 @@ fieldset:disabled .btn { .dropdown-item { display: block; width: 100%; - padding: var(--dropdown-item-padding-y) var(--dropdown-item-padding-x); + padding: var(--dropdown-item-padding-y, 0.25rem) var(--dropdown-item-padding-x, 1rem); clear: both; font-weight: 400; color: var(--dropdown-link-color); @@ -4120,14 +4112,14 @@ fieldset:disabled .btn { .dropdown-item:active, .dropdown-item:focus { color: var(--dropdown-link-active-color); - background-color: var(--dropdown-link-active-bg); + background-color: var(--dropdown-link-active-bg, hsl(240, 98%, 17%)); } .dropdown-item.active, .dropdown-item:active { color: var(--dropdown-link-active-color); text-decoration: none; - background-color: var(--dropdown-link-active-bg); + background-color: var(--dropdown-link-active-bg, hsl(240, 98%, 17%)); } .dropdown-item.disabled, @@ -4143,7 +4135,7 @@ fieldset:disabled .btn { .dropdown-header { display: block; - padding: var(--dropdown-header-padding-y) var(--dropdown-header-padding-x); + padding: var(--dropdown-header-padding-y, 0.5rem) var(--dropdown-header-padding-x, 1rem); margin-bottom: 0; font-size: 0.875rem; color: var(--dropdown-header-color); @@ -4152,20 +4144,20 @@ fieldset:disabled .btn { .dropdown-item-text { display: block; - padding: var(--dropdown-item-padding-y) var(--dropdown-item-padding-x); + padding: var(--dropdown-item-padding-y, 0.25rem) var(--dropdown-item-padding-x, 1rem); color: var(--dropdown-link-color); } .dropdown-menu-dark { --dropdown-color: hsl(210, 14%, 89%); --dropdown-bg: hsl(210, 10%, 23%); - --dropdown-border-color: var(--border-color-translucent); + --dropdown-border-color: var(--border-color-translucent, #ffffff26); --dropdown-box-shadow: ; --dropdown-link-color: hsl(210, 14%, 89%); - --dropdown-link-active-color: var(--body-color); - --dropdown-divider-bg: var(--border-color-translucent); + --dropdown-link-active-color: var(--body-color, #e6ebf1); + --dropdown-divider-bg: var(--border-color-translucent, #ffffff26); --dropdown-link-active-bg: rgba(255, 255, 255, 0.15); - --dropdown-link-active-color: var(--body-color); + --dropdown-link-active-color: var(--body-color, #e6ebf1); --dropdown-link-active-bg: hsl(240, 98%, 17%); --dropdown-link-disabled-color: hsl(210, 11%, 71%); --dropdown-header-color: hsl(210, 11%, 71%); @@ -4317,9 +4309,9 @@ fieldset:disabled .btn { .nav-link { display: block; - padding: var(--nav-link-padding-y) var(--nav-link-padding-x); + padding: var(--nav-link-padding-y, 0.5rem) var(--nav-link-padding-x, 1rem); font-size: var(--nav-link-font-size); - font-weight: var(--nav-link-font-weight); + font-weight: var(--nav-link-font-weight, 400); color: var(--nav-link-color); text-decoration: none; -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; @@ -4341,22 +4333,22 @@ fieldset:disabled .btn { } .nav-link.disabled { - color: var(--nav-link-disabled-color); + color: var(--nav-link-disabled-color, #6c757d); pointer-events: none; cursor: default; } .nav-tabs { /* Values defined in light.standard.css / dark.standard.css */ - border-bottom: var(--nav-tabs-border-width) solid var(--nav-tabs-border-color); + border-bottom: var(--nav-tabs-border-width, 1px) solid var(--nav-tabs-border-color); } .nav-tabs .nav-link { - margin-bottom: calc(-1 * var(--nav-tabs-border-width)); + margin-bottom: calc(-1 * var(--nav-tabs-border-width, 1px)); background: none; - border: var(--nav-tabs-border-width) solid transparent; - border-top-left-radius: var(--nav-tabs-border-radius); - border-top-right-radius: var(--nav-tabs-border-radius); + border: var(--nav-tabs-border-width, 1px) solid transparent; + border-top-left-radius: var(--nav-tabs-border-radius, 0.25rem); + border-top-right-radius: var(--nav-tabs-border-radius, 0.25rem); } .nav-tabs .nav-link:active, @@ -4367,7 +4359,7 @@ fieldset:disabled .btn { .nav-tabs .nav-link.disabled, .nav-tabs .nav-link:disabled { - color: var(--nav-link-disabled-color); + color: var(--nav-link-disabled-color, #6c757d); background-color: transparent; border-color: transparent; } @@ -4380,7 +4372,7 @@ fieldset:disabled .btn { } .nav-tabs .dropdown-menu { - margin-top: calc(-1 * var(--nav-tabs-border-width)); + margin-top: calc(-1 * var(--nav-tabs-border-width, 1px)); border-top-left-radius: 0; border-top-right-radius: 0; } @@ -4392,11 +4384,11 @@ fieldset:disabled .btn { .nav-pills .nav-link { background: none; border: 0; - border-radius: var(--nav-pills-border-radius); + border-radius: var(--nav-pills-border-radius, 0.25rem); } .nav-pills .nav-link:disabled { - color: var(--nav-link-disabled-color); + color: var(--nav-link-disabled-color, #6c757d); background-color: transparent; border-color: transparent; } @@ -4404,7 +4396,7 @@ fieldset:disabled .btn { .nav-pills .nav-link.active, .nav-pills .show>.nav-link { color: var(--nav-pills-link-active-color); - background-color: var(--nav-pills-link-active-bg); + background-color: var(--nav-pills-link-active-bg, hsl(240, 98%, 17%)); } .nav-fill>.nav-link, @@ -4451,7 +4443,7 @@ fieldset:disabled .btn { -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; - padding: var(--navbar-padding-y) var(--navbar-padding-x); + padding: var(--navbar-padding-y, 0.5rem) var(--navbar-padding-x, 1rem); } .navbar>.container, @@ -4475,10 +4467,10 @@ fieldset:disabled .btn { } .navbar-brand { - padding-top: var(--navbar-brand-padding-y); - padding-bottom: var(--navbar-brand-padding-y); - margin-right: var(--navbar-brand-margin-end); - font-size: var(--navbar-brand-font-size); + padding-top: var(--navbar-brand-padding-y, 0.3125rem); + padding-bottom: var(--navbar-brand-padding-y, 0.3125rem); + margin-right: var(--navbar-brand-margin-end, 1rem); + font-size: var(--navbar-brand-font-size, 1.25rem); color: var(--navbar-brand-color); text-decoration: none; white-space: nowrap; @@ -4535,15 +4527,15 @@ fieldset:disabled .btn { } .navbar-toggler { - padding: var(--navbar-toggler-padding-y) var(--navbar-toggler-padding-x); - font-size: var(--navbar-toggler-font-size); + padding: var(--navbar-toggler-padding-y, 0.25rem) var(--navbar-toggler-padding-x, 0.75rem); + font-size: var(--navbar-toggler-font-size, 1.25rem); line-height: 1; color: var(--navbar-color); background-color: transparent; border: 0; - -webkit-transition: var(--navbar-toggler-transition); - -o-transition: var(--navbar-toggler-transition); - transition: var(--navbar-toggler-transition); + -webkit-transition: var(--navbar-toggler-transition, box-shadow 0.15s ease-in-out); + -o-transition: var(--navbar-toggler-transition, box-shadow 0.15s ease-in-out); + transition: var(--navbar-toggler-transition, box-shadow 0.15s ease-in-out); } @media (prefers-reduced-motion: reduce) { @@ -4561,7 +4553,7 @@ fieldset:disabled .btn { .navbar-toggler:focus { text-decoration: none; outline: 0; - color: var(--color-primary); + color: var(--color-primary, #112855); } .navbar-toggler-icon { @@ -4600,8 +4592,8 @@ fieldset:disabled .btn { } .navbar-expand-sm .navbar-nav .nav-link { - padding-right: var(--navbar-nav-link-padding-x); - padding-left: var(--navbar-nav-link-padding-x); + padding-right: var(--navbar-nav-link-padding-x, 0.5rem); + padding-left: var(--navbar-nav-link-padding-x, 0.5rem); } .navbar-expand-sm .navbar-nav-scroll { @@ -4675,8 +4667,8 @@ fieldset:disabled .btn { } .navbar-expand-md .navbar-nav .nav-link { - padding-right: var(--navbar-nav-link-padding-x); - padding-left: var(--navbar-nav-link-padding-x); + padding-right: var(--navbar-nav-link-padding-x, 0.5rem); + padding-left: var(--navbar-nav-link-padding-x, 0.5rem); } .navbar-expand-md .navbar-nav-scroll { @@ -4750,8 +4742,8 @@ fieldset:disabled .btn { } .navbar-expand-lg .navbar-nav .nav-link { - padding-right: var(--navbar-nav-link-padding-x); - padding-left: var(--navbar-nav-link-padding-x); + padding-right: var(--navbar-nav-link-padding-x, 0.5rem); + padding-left: var(--navbar-nav-link-padding-x, 0.5rem); } .navbar-expand-lg .navbar-nav-scroll { @@ -4825,8 +4817,8 @@ fieldset:disabled .btn { } .navbar-expand-xl .navbar-nav .nav-link { - padding-right: var(--navbar-nav-link-padding-x); - padding-left: var(--navbar-nav-link-padding-x); + padding-right: var(--navbar-nav-link-padding-x, 0.5rem); + padding-left: var(--navbar-nav-link-padding-x, 0.5rem); } .navbar-expand-xl .navbar-nav-scroll { @@ -4900,8 +4892,8 @@ fieldset:disabled .btn { } .navbar-expand-xxl .navbar-nav .nav-link { - padding-right: var(--navbar-nav-link-padding-x); - padding-left: var(--navbar-nav-link-padding-x); + padding-right: var(--navbar-nav-link-padding-x, 0.5rem); + padding-left: var(--navbar-nav-link-padding-x, 0.5rem); } .navbar-expand-xxl .navbar-nav-scroll { @@ -4974,8 +4966,8 @@ fieldset:disabled .btn { } .navbar-expand .navbar-nav .nav-link { - padding-right: var(--navbar-nav-link-padding-x); - padding-left: var(--navbar-nav-link-padding-x); + padding-right: var(--navbar-nav-link-padding-x, 0.5rem); + padding-left: var(--navbar-nav-link-padding-x, 0.5rem); } .navbar-expand .navbar-nav-scroll { @@ -5037,12 +5029,12 @@ fieldset:disabled .btn { -ms-flex-direction: column; flex-direction: column; min-width: 0; - height: var(--card-height); + height: var(--card-height, auto); word-wrap: break-word; background-color: var(--card-bg); background-clip: border-box; - border: var(--card-border-width) solid var(--card-border-color); - border-radius: var(--card-border-radius); + border: var(--card-border-width, 1px) solid var(--card-border-color); + border-radius: var(--card-border-radius, .25rem); } .card>hr { @@ -5057,14 +5049,14 @@ fieldset:disabled .btn { .card>.list-group:first-child { border-top-width: 0; - border-top-left-radius: var(--card-inner-border-radius); - border-top-right-radius: var(--card-inner-border-radius); + border-top-left-radius: var(--card-inner-border-radius, calc(var(--border-radius) - 1px)); + border-top-right-radius: var(--card-inner-border-radius, calc(var(--border-radius) - 1px)); } .card>.list-group:last-child { border-bottom-width: 0; - border-bottom-right-radius: var(--card-inner-border-radius); - border-bottom-left-radius: var(--card-inner-border-radius); + border-bottom-right-radius: var(--card-inner-border-radius, calc(var(--border-radius) - 1px)); + border-bottom-left-radius: var(--card-inner-border-radius, calc(var(--border-radius) - 1px)); } .card>.card-header+.list-group, @@ -5076,16 +5068,16 @@ fieldset:disabled .btn { -webkit-box-flex: 1; -ms-flex: 1 1 auto; flex: 1 1 auto; - padding: var(--card-spacer-y) var(--card-spacer-x); + padding: var(--card-spacer-y, 1rem) var(--card-spacer-x, 1rem); color: var(--card-color); } .card-title { - margin-bottom: var(--card-title-spacer-y); + margin-bottom: var(--card-title-spacer-y, 0.5rem); } .card-subtitle { - margin-top: calc(-0.5 * var(--card-title-spacer-y)); + margin-top: calc(-0.5 * var(--card-title-spacer-y, 0.5rem)); margin-bottom: 0; } @@ -5094,36 +5086,36 @@ fieldset:disabled .btn { } .card-link+.card-link { - margin-left: var(--card-spacer-x); + margin-left: var(--card-spacer-x, 1rem); } .card-header { - padding: var(--card-cap-padding-y) var(--card-cap-padding-x); + padding: var(--card-cap-padding-y, 0.5rem) var(--card-cap-padding-x, 1rem); margin-bottom: 0; color: var(--card-cap-color); - background-color: var(--card-cap-bg); - border-bottom: var(--card-border-width) solid var(--card-border-color); + background-color: var(--card-cap-bg, rgba(255, 255, 255, 0.03)); + border-bottom: var(--card-border-width, 1px) solid var(--card-border-color); } .card-header:first-child { - border-radius: var(--card-inner-border-radius) var(--card-inner-border-radius) 0 0; + border-radius: var(--card-inner-border-radius, calc(var(--border-radius) - 1px)) var(--card-inner-border-radius, calc(var(--border-radius) - 1px)) 0 0; } .card-footer { - padding: var(--card-cap-padding-y) var(--card-cap-padding-x); + padding: var(--card-cap-padding-y, 0.5rem) var(--card-cap-padding-x, 1rem); color: var(--card-cap-color); - background-color: var(--card-cap-bg); - border-top: var(--card-border-width) solid var(--card-border-color); + background-color: var(--card-cap-bg, rgba(255, 255, 255, 0.03)); + border-top: var(--card-border-width, 1px) solid var(--card-border-color); } .card-footer:last-child { - border-radius: 0 0 var(--card-inner-border-radius) var(--card-inner-border-radius); + border-radius: 0 0 var(--card-inner-border-radius, calc(var(--border-radius) - 1px)) var(--card-inner-border-radius, calc(var(--border-radius) - 1px)); } .card-header-tabs { - margin-right: calc(-0.5 * var(--card-cap-padding-x)); - margin-bottom: calc(-1 * var(--card-cap-padding-y)); - margin-left: calc(-0.5 * var(--card-cap-padding-x)); + margin-right: calc(-0.5 * var(--card-cap-padding-x, 1rem)); + margin-bottom: calc(-1 * var(--card-cap-padding-y, 0.5rem)); + margin-left: calc(-0.5 * var(--card-cap-padding-x, 1rem)); border-bottom: 0; } @@ -5133,8 +5125,8 @@ fieldset:disabled .btn { } .card-header-pills { - margin-right: calc(-0.5 * var(--card-cap-padding-x)); - margin-left: calc(-0.5 * var(--card-cap-padding-x)); + margin-right: calc(-0.5 * var(--card-cap-padding-x, 1rem)); + margin-left: calc(-0.5 * var(--card-cap-padding-x, 1rem)); } .card-img-overlay { @@ -5143,8 +5135,8 @@ fieldset:disabled .btn { right: 0; bottom: 0; left: 0; - padding: var(--card-img-overlay-padding); - border-radius: var(--card-inner-border-radius); + padding: var(--card-img-overlay-padding, 1rem); + border-radius: var(--card-inner-border-radius, calc(var(--border-radius) - 1px)); } .card-img, @@ -5155,18 +5147,18 @@ fieldset:disabled .btn { .card-img, .card-img-top { - border-top-left-radius: var(--card-inner-border-radius); - border-top-right-radius: var(--card-inner-border-radius); + border-top-left-radius: var(--card-inner-border-radius, calc(var(--border-radius) - 1px)); + border-top-right-radius: var(--card-inner-border-radius, calc(var(--border-radius) - 1px)); } .card-img, .card-img-bottom { - border-bottom-right-radius: var(--card-inner-border-radius); - border-bottom-left-radius: var(--card-inner-border-radius); + border-bottom-right-radius: var(--card-inner-border-radius, calc(var(--border-radius) - 1px)); + border-bottom-left-radius: var(--card-inner-border-radius, calc(var(--border-radius) - 1px)); } .card-group>.card { - margin-bottom: var(--card-group-margin); + margin-bottom: var(--card-group-margin, 0.75rem); } @media (min-width: 576px) { @@ -5236,7 +5228,7 @@ fieldset:disabled .btn { -ms-flex-align: center; align-items: center; width: 100%; - padding: var(--accordion-btn-padding-y) var(--accordion-btn-padding-x); + padding: var(--accordion-btn-padding-y, 1rem) var(--accordion-btn-padding-x, 1.25rem); font-size: 1rem; color: var(--accordion-btn-color); text-align: left; @@ -5260,29 +5252,29 @@ fieldset:disabled .btn { .accordion-button:not(.collapsed) { color: var(--accordion-active-color); background-color: var(--accordion-active-bg); - -webkit-box-shadow: inset 0 calc(-1 * var(--accordion-border-width)) 0 var(--accordion-border-color); - box-shadow: inset 0 calc(-1 * var(--accordion-border-width)) 0 var(--accordion-border-color); + -webkit-box-shadow: inset 0 calc(-1 * var(--accordion-border-width, 1px)) 0 var(--accordion-border-color); + box-shadow: inset 0 calc(-1 * var(--accordion-border-width, 1px)) 0 var(--accordion-border-color); } .accordion-button:not(.collapsed)::after { background-image: var(--accordion-btn-active-icon); - -webkit-transform: var(--accordion-btn-icon-transform); - transform: var(--accordion-btn-icon-transform); + -webkit-transform: var(--accordion-btn-icon-transform, rotate(-180deg)); + transform: var(--accordion-btn-icon-transform, rotate(-180deg)); } .accordion-button::after { -ms-flex-negative: 0; flex-shrink: 0; - width: var(--accordion-btn-icon-width); - height: var(--accordion-btn-icon-width); + width: var(--accordion-btn-icon-width, 1.25rem); + height: var(--accordion-btn-icon-width, 1.25rem); margin-left: auto; content: ""; background-image: var(--accordion-btn-icon); background-repeat: no-repeat; - background-size: var(--accordion-btn-icon-width); - -webkit-transition: var(--accordion-btn-icon-transition); - -o-transition: var(--accordion-btn-icon-transition); - transition: var(--accordion-btn-icon-transition); + background-size: var(--accordion-btn-icon-width, 1.25rem); + -webkit-transition: var(--accordion-btn-icon-transition, transform 0.2s ease-in-out); + -o-transition: var(--accordion-btn-icon-transition, transform 0.2s ease-in-out); + transition: var(--accordion-btn-icon-transition, transform 0.2s ease-in-out); } @media (prefers-reduced-motion: reduce) { @@ -5301,8 +5293,8 @@ fieldset:disabled .btn { z-index: 3; border-color: var(--accordion-btn-focus-border-color); outline: 0; - -webkit-box-shadow: var(--accordion-btn-focus-box-shadow); - box-shadow: var(--accordion-btn-focus-box-shadow); + -webkit-box-shadow: var(--accordion-btn-focus-box-shadow, 0 0 0 0.25rem rgba(84, 114, 255, 0.25)); + box-shadow: var(--accordion-btn-focus-box-shadow, 0 0 0 0.25rem rgba(84, 114, 255, 0.25)); } .accordion-header { @@ -5312,17 +5304,17 @@ fieldset:disabled .btn { .accordion-item { color: var(--accordion-color); background-color: var(--accordion-bg); - border: var(--accordion-border-width) solid var(--accordion-border-color); + border: var(--accordion-border-width, 1px) solid var(--accordion-border-color); } .accordion-item:first-of-type { - border-top-left-radius: var(--accordion-border-radius); - border-top-right-radius: var(--accordion-border-radius); + border-top-left-radius: var(--accordion-border-radius, 0.25rem); + border-top-right-radius: var(--accordion-border-radius, 0.25rem); } .accordion-item:first-of-type .accordion-button { - border-top-left-radius: var(--accordion-inner-border-radius); - border-top-right-radius: var(--accordion-inner-border-radius); + border-top-left-radius: var(--accordion-inner-border-radius, calc(0.25rem - 1px)); + border-top-right-radius: var(--accordion-inner-border-radius, calc(0.25rem - 1px)); } .accordion-item:not(:first-of-type) { @@ -5330,22 +5322,22 @@ fieldset:disabled .btn { } .accordion-item:last-of-type { - border-bottom-right-radius: var(--accordion-border-radius); - border-bottom-left-radius: var(--accordion-border-radius); + border-bottom-right-radius: var(--accordion-border-radius, 0.25rem); + border-bottom-left-radius: var(--accordion-border-radius, 0.25rem); } .accordion-item:last-of-type .accordion-button.collapsed { - border-bottom-right-radius: var(--accordion-inner-border-radius); - border-bottom-left-radius: var(--accordion-inner-border-radius); + border-bottom-right-radius: var(--accordion-inner-border-radius, calc(0.25rem - 1px)); + border-bottom-left-radius: var(--accordion-inner-border-radius, calc(0.25rem - 1px)); } .accordion-item:last-of-type .accordion-collapse { - border-bottom-right-radius: var(--accordion-border-radius); - border-bottom-left-radius: var(--accordion-border-radius); + border-bottom-right-radius: var(--accordion-border-radius, 0.25rem); + border-bottom-left-radius: var(--accordion-border-radius, 0.25rem); } .accordion-body { - padding: var(--accordion-body-padding-y) var(--accordion-body-padding-x); + padding: var(--accordion-body-padding-y, 1rem) var(--accordion-body-padding-x, 1.25rem); } .accordion-flush .accordion-collapse { @@ -5378,24 +5370,23 @@ fieldset:disabled .btn { display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; - padding: var(--breadcrumb-padding-y) var(--breadcrumb-padding-x); - margin-bottom: var(--breadcrumb-margin-bottom); + padding: var(--breadcrumb-padding-y, 0) var(--breadcrumb-padding-x, 0); + margin-bottom: var(--breadcrumb-margin-bottom, 1rem); font-size: var(--breadcrumb-font-size); list-style: none; - background-color: var(--breadcrumb-bg); - border-radius: var(--breadcrumb-border-radius); + background-color: var(--breadcrumb-bg, ); + border-radius: var(--breadcrumb-border-radius, ); } .breadcrumb-item+.breadcrumb-item { - padding-left: var(--breadcrumb-item-padding-x); + padding-left: var(--breadcrumb-item-padding-x, 0.5rem); } .breadcrumb-item+.breadcrumb-item::before { float: left; - padding-right: var(--breadcrumb-item-padding-x); + padding-right: var(--breadcrumb-item-padding-x, 0.5rem); color: var(--breadcrumb-divider-color); - content: var(--breadcrumb-divider, "/") - /* rtl: var(--breadcrumb-divider, "/") */ + content: var(--breadcrumb-divider, "\00a0/\00a0"); ; } @@ -5415,12 +5406,12 @@ fieldset:disabled .btn { .page-link { position: relative; display: block; - padding: var(--pagination-padding-y) var(--pagination-padding-x); - font-size: var(--pagination-font-size); + padding: var(--pagination-padding-y, 0.375rem) var(--pagination-padding-x, 0.75rem); + font-size: var(--pagination-font-size, 1rem); color: var(--pagination-color); text-decoration: none; background-color: var(--pagination-bg); - border: var(--pagination-border-width) solid var(--pagination-border-color); + border: var(--pagination-border-width, 1px) solid var(--pagination-border-color); -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; -o-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; @@ -5439,8 +5430,8 @@ fieldset:disabled .btn { .page-link:active { z-index: 2; color: var(--pagination-active-color); - background-color: var(--pagination-active-bg); - border-color: var(--pagination-active-border-color); + background-color: var(--pagination-active-bg, hsl(240, 98%, 17%)); + border-color: var(--pagination-active-border-color, hsl(240, 98%, 17%)); } .page-link:focus { @@ -5448,16 +5439,16 @@ fieldset:disabled .btn { color: var(--pagination-focus-color); background-color: var(--pagination-focus-bg); outline: 0; - -webkit-box-shadow: var(--pagination-focus-box-shadow); - box-shadow: var(--pagination-focus-box-shadow); + -webkit-box-shadow: var(--pagination-focus-box-shadow, 0 0 0 0.25rem rgba(84, 114, 255, 0.25)); + box-shadow: var(--pagination-focus-box-shadow, 0 0 0 0.25rem rgba(84, 114, 255, 0.25)); } .page-link.active, .active>.page-link { z-index: 3; color: var(--pagination-active-color); - background-color: var(--pagination-active-bg); - border-color: var(--pagination-active-border-color); + background-color: var(--pagination-active-bg, hsl(240, 98%, 17%)); + border-color: var(--pagination-active-border-color, hsl(240, 98%, 17%)); } .page-link.disabled, @@ -5473,13 +5464,13 @@ fieldset:disabled .btn { } .page-item:first-child .page-link { - border-top-left-radius: var(--pagination-border-radius); - border-bottom-left-radius: var(--pagination-border-radius); + border-top-left-radius: var(--pagination-border-radius, 0.25rem); + border-bottom-left-radius: var(--pagination-border-radius, 0.25rem); } .page-item:last-child .page-link { - border-top-right-radius: var(--pagination-border-radius); - border-bottom-right-radius: var(--pagination-border-radius); + border-top-right-radius: var(--pagination-border-radius, 0.25rem); + border-bottom-right-radius: var(--pagination-border-radius, 0.25rem); } .pagination-lg { @@ -5499,15 +5490,15 @@ fieldset:disabled .btn { .badge { /* Values defined in light.standard.css / dark.standard.css */ display: inline-block; - padding: var(--badge-padding-y) var(--badge-padding-x); - font-size: var(--badge-font-size); - font-weight: var(--badge-font-weight); + padding: var(--badge-padding-y, 0.35em) var(--badge-padding-x, 0.65em); + font-size: var(--badge-font-size, 0.75em); + font-weight: var(--badge-font-weight, 700); line-height: 1; color: var(--badge-color); text-align: center; white-space: nowrap; vertical-align: baseline; - border-radius: var(--badge-border-radius); + border-radius: var(--badge-border-radius, 0.25rem); } .badge:empty { @@ -5522,12 +5513,12 @@ fieldset:disabled .btn { .alert { /* Values defined in light.standard.css / dark.standard.css */ position: relative; - padding: var(--alert-padding-y) var(--alert-padding-x); - margin-bottom: var(--alert-margin-bottom); - color: var(--alert-color); - background-color: var(--alert-bg); - border: var(--alert-border); - border-radius: var(--alert-border-radius); + padding: var(--alert-padding-y, 1rem) var(--alert-padding-x, 1rem); + margin-bottom: var(--alert-margin-bottom, 1rem); + color: var(--alert-color, inherit); + background-color: var(--alert-bg, transparent); + border: var(--alert-border, 1px solid var(--alert-border-color)); + border-radius: var(--alert-border-radius, 0.25rem); } .alert-heading { @@ -5557,7 +5548,7 @@ fieldset:disabled .btn { } .alert-primary .alert-link { - color: var(--alert-primary-link-color); + color: var(--alert-primary-link-color, #b3c1ff); } .alert-secondary { @@ -5567,7 +5558,7 @@ fieldset:disabled .btn { } .alert-secondary .alert-link { - color: var(--alert-secondary-link-color); + color: var(--alert-secondary-link-color, #9fa6ad); } .alert-success { @@ -5577,7 +5568,7 @@ fieldset:disabled .btn { } .alert-success .alert-link { - color: var(--alert-success-link-color); + color: var(--alert-success-link-color, #a0e5b3); } .alert-info { @@ -5587,7 +5578,7 @@ fieldset:disabled .btn { } .alert-info .alert-link { - color: var(--alert-info-link-color); + color: var(--alert-info-link-color, #8eccf2); } .alert-warning { @@ -5597,7 +5588,7 @@ fieldset:disabled .btn { } .alert-warning .alert-link { - color: var(--alert-warning-link-color); + color: var(--alert-warning-link-color, #ffe4a0); } .alert-danger { @@ -5607,7 +5598,7 @@ fieldset:disabled .btn { } .alert-danger .alert-link { - color: var(--alert-danger-link-color); + color: var(--alert-danger-link-color, #ffa8a3); } .alert-light { @@ -5617,7 +5608,7 @@ fieldset:disabled .btn { } .alert-light .alert-link { - color: var(--alert-light-link-color); + color: var(--alert-light-link-color, #f0f4f8); } .alert-dark { @@ -5627,7 +5618,7 @@ fieldset:disabled .btn { } .alert-dark .alert-link { - color: var(--alert-dark-link-color); + color: var(--alert-dark-link-color, #9fa6ad); } @-webkit-keyframes progress-bar-stripes { @@ -5647,11 +5638,11 @@ fieldset:disabled .btn { display: -webkit-box; display: -ms-flexbox; display: flex; - height: var(--progress-height); + height: var(--progress-height, 1rem); overflow: hidden; - font-size: var(--progress-font-size); + font-size: var(--progress-font-size, 0.75rem); background-color: var(--progress-bg); - border-radius: var(--progress-border-radius); + border-radius: var(--progress-border-radius, 0.25rem); } .progress-bar { @@ -5669,10 +5660,10 @@ fieldset:disabled .btn { color: var(--progress-bar-color); text-align: center; white-space: nowrap; - background-color: var(--progress-bar-bg); - -webkit-transition: var(--progress-bar-transition); - -o-transition: var(--progress-bar-transition); - transition: var(--progress-bar-transition); + background-color: var(--progress-bar-bg, hsl(240, 98%, 40%)); + -webkit-transition: var(--progress-bar-transition, width 0.6s ease); + -o-transition: var(--progress-bar-transition, width 0.6s ease); + transition: var(--progress-bar-transition, width 0.6s ease); } @media (prefers-reduced-motion: reduce) { @@ -5686,7 +5677,7 @@ fieldset:disabled .btn { .progress-bar-striped { background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: var(--progress-height) var(--progress-height); + background-size: var(--progress-height, 1rem) var(--progress-height, 1rem); } .progress-bar-animated { @@ -5712,7 +5703,7 @@ fieldset:disabled .btn { flex-direction: column; padding-left: 0; margin-bottom: 0; - border-radius: var(--list-group-border-radius); + border-radius: var(--list-group-border-radius, 0.25rem); } .list-group-numbered { @@ -5747,11 +5738,11 @@ fieldset:disabled .btn { .list-group-item { position: relative; display: block; - padding: var(--list-group-item-padding-y) var(--list-group-item-padding-x); + padding: var(--list-group-item-padding-y, 0.5rem) var(--list-group-item-padding-x, 1rem); color: var(--list-group-color); text-decoration: none; background-color: var(--list-group-bg); - border: var(--list-group-border-width) solid var(--list-group-border-color); + border: var(--list-group-border-width, 1px) solid var(--list-group-border-color, rgba(var(--white-rgb), 0.125)); } .list-group-item:first-child { @@ -5774,8 +5765,8 @@ fieldset:disabled .btn { .list-group-item.active { z-index: 2; color: var(--list-group-active-color); - background-color: var(--list-group-active-bg); - border-color: var(--list-group-active-border-color); + background-color: var(--list-group-active-bg, hsl(240, 98%, 17%)); + border-color: var(--list-group-active-border-color, hsl(240, 98%, 17%)); } .list-group-item+.list-group-item { @@ -5783,8 +5774,8 @@ fieldset:disabled .btn { } .list-group-item+.list-group-item.active { - margin-top: calc(-1 * var(--list-group-border-width)); - border-top-width: var(--list-group-border-width); + margin-top: calc(-1 * var(--list-group-border-width, 1px)); + border-top-width: var(--list-group-border-width, 1px); } .list-group-horizontal { @@ -5795,12 +5786,12 @@ fieldset:disabled .btn { } .list-group-horizontal>.list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--list-group-border-radius); + border-bottom-left-radius: var(--list-group-border-radius, 0.25rem); border-top-right-radius: 0; } .list-group-horizontal>.list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--list-group-border-radius); + border-top-right-radius: var(--list-group-border-radius, 0.25rem); border-bottom-left-radius: 0; } @@ -5809,13 +5800,13 @@ fieldset:disabled .btn { } .list-group-horizontal>.list-group-item+.list-group-item { - border-top-width: var(--list-group-border-width); + border-top-width: var(--list-group-border-width, 1px); border-left-width: 0; } .list-group-horizontal>.list-group-item+.list-group-item.active { - margin-left: calc(-1 * var(--list-group-border-width)); - border-left-width: var(--list-group-border-width); + margin-left: calc(-1 * var(--list-group-border-width, 1px)); + border-left-width: var(--list-group-border-width, 1px); } @media (min-width: 576px) { @@ -5827,12 +5818,12 @@ fieldset:disabled .btn { } .list-group-horizontal-sm>.list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--list-group-border-radius); + border-bottom-left-radius: var(--list-group-border-radius, 0.25rem); border-top-right-radius: 0; } .list-group-horizontal-sm>.list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--list-group-border-radius); + border-top-right-radius: var(--list-group-border-radius, 0.25rem); border-bottom-left-radius: 0; } @@ -5841,13 +5832,13 @@ fieldset:disabled .btn { } .list-group-horizontal-sm>.list-group-item+.list-group-item { - border-top-width: var(--list-group-border-width); + border-top-width: var(--list-group-border-width, 1px); border-left-width: 0; } .list-group-horizontal-sm>.list-group-item+.list-group-item.active { - margin-left: calc(-1 * var(--list-group-border-width)); - border-left-width: var(--list-group-border-width); + margin-left: calc(-1 * var(--list-group-border-width, 1px)); + border-left-width: var(--list-group-border-width, 1px); } } @@ -5860,12 +5851,12 @@ fieldset:disabled .btn { } .list-group-horizontal-md>.list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--list-group-border-radius); + border-bottom-left-radius: var(--list-group-border-radius, 0.25rem); border-top-right-radius: 0; } .list-group-horizontal-md>.list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--list-group-border-radius); + border-top-right-radius: var(--list-group-border-radius, 0.25rem); border-bottom-left-radius: 0; } @@ -5874,13 +5865,13 @@ fieldset:disabled .btn { } .list-group-horizontal-md>.list-group-item+.list-group-item { - border-top-width: var(--list-group-border-width); + border-top-width: var(--list-group-border-width, 1px); border-left-width: 0; } .list-group-horizontal-md>.list-group-item+.list-group-item.active { - margin-left: calc(-1 * var(--list-group-border-width)); - border-left-width: var(--list-group-border-width); + margin-left: calc(-1 * var(--list-group-border-width, 1px)); + border-left-width: var(--list-group-border-width, 1px); } } @@ -5893,12 +5884,12 @@ fieldset:disabled .btn { } .list-group-horizontal-lg>.list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--list-group-border-radius); + border-bottom-left-radius: var(--list-group-border-radius, 0.25rem); border-top-right-radius: 0; } .list-group-horizontal-lg>.list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--list-group-border-radius); + border-top-right-radius: var(--list-group-border-radius, 0.25rem); border-bottom-left-radius: 0; } @@ -5907,13 +5898,13 @@ fieldset:disabled .btn { } .list-group-horizontal-lg>.list-group-item+.list-group-item { - border-top-width: var(--list-group-border-width); + border-top-width: var(--list-group-border-width, 1px); border-left-width: 0; } .list-group-horizontal-lg>.list-group-item+.list-group-item.active { - margin-left: calc(-1 * var(--list-group-border-width)); - border-left-width: var(--list-group-border-width); + margin-left: calc(-1 * var(--list-group-border-width, 1px)); + border-left-width: var(--list-group-border-width, 1px); } } @@ -5926,12 +5917,12 @@ fieldset:disabled .btn { } .list-group-horizontal-xl>.list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--list-group-border-radius); + border-bottom-left-radius: var(--list-group-border-radius, 0.25rem); border-top-right-radius: 0; } .list-group-horizontal-xl>.list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--list-group-border-radius); + border-top-right-radius: var(--list-group-border-radius, 0.25rem); border-bottom-left-radius: 0; } @@ -5940,13 +5931,13 @@ fieldset:disabled .btn { } .list-group-horizontal-xl>.list-group-item+.list-group-item { - border-top-width: var(--list-group-border-width); + border-top-width: var(--list-group-border-width, 1px); border-left-width: 0; } .list-group-horizontal-xl>.list-group-item+.list-group-item.active { - margin-left: calc(-1 * var(--list-group-border-width)); - border-left-width: var(--list-group-border-width); + margin-left: calc(-1 * var(--list-group-border-width, 1px)); + border-left-width: var(--list-group-border-width, 1px); } } @@ -5959,12 +5950,12 @@ fieldset:disabled .btn { } .list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--list-group-border-radius); + border-bottom-left-radius: var(--list-group-border-radius, 0.25rem); border-top-right-radius: 0; } .list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--list-group-border-radius); + border-top-right-radius: var(--list-group-border-radius, 0.25rem); border-bottom-left-radius: 0; } @@ -5973,13 +5964,13 @@ fieldset:disabled .btn { } .list-group-horizontal-xxl>.list-group-item+.list-group-item { - border-top-width: var(--list-group-border-width); + border-top-width: var(--list-group-border-width, 1px); border-left-width: 0; } .list-group-horizontal-xxl>.list-group-item+.list-group-item.active { - margin-left: calc(-1 * var(--list-group-border-width)); - border-left-width: var(--list-group-border-width); + margin-left: calc(-1 * var(--list-group-border-width, 1px)); + border-left-width: var(--list-group-border-width, 1px); } } @@ -5988,7 +5979,7 @@ fieldset:disabled .btn { } .list-group-flush>.list-group-item { - border-width: 0 0 var(--list-group-border-width); + border-width: 0 0 var(--list-group-border-width, 1px); } .list-group-flush>.list-group-item:last-child { @@ -5996,139 +5987,139 @@ fieldset:disabled .btn { } .list-group-item-primary { - color: var(--list-group-item-primary-color); - background-color: var(--list-group-item-primary-bg); + color: var(--list-group-item-primary-color, #8ca3ff); + background-color: var(--list-group-item-primary-bg, #1a2550); } .list-group-item-primary.list-group-item-action:active, .list-group-item-primary.list-group-item-action:focus { - color: var(--list-group-item-primary-color); - background-color: var(--list-group-item-primary-active-bg); + color: var(--list-group-item-primary-color, #8ca3ff); + background-color: var(--list-group-item-primary-active-bg, #223066); } .list-group-item-primary.list-group-item-action.active { - color: var(--body-color); - background-color: var(--list-group-item-primary-color); - border-color: var(--list-group-item-primary-color); + color: var(--body-color, #e6ebf1); + background-color: var(--list-group-item-primary-color, #8ca3ff); + border-color: var(--list-group-item-primary-color, #8ca3ff); } .list-group-item-secondary { - color: var(--list-group-item-secondary-color); - background-color: var(--list-group-item-secondary-bg); + color: var(--list-group-item-secondary-color, #9fa6ad); + background-color: var(--list-group-item-secondary-bg, #2b323b); } .list-group-item-secondary.list-group-item-action:active, .list-group-item-secondary.list-group-item-action:focus { - color: var(--list-group-item-secondary-color); - background-color: var(--list-group-item-secondary-active-bg); + color: var(--list-group-item-secondary-color, #9fa6ad); + background-color: var(--list-group-item-secondary-active-bg, #363d47); } .list-group-item-secondary.list-group-item-action.active { - color: var(--body-color); - background-color: var(--list-group-item-secondary-color); - border-color: var(--list-group-item-secondary-color); + color: var(--body-color, #e6ebf1); + background-color: var(--list-group-item-secondary-color, #9fa6ad); + border-color: var(--list-group-item-secondary-color, #9fa6ad); } .list-group-item-success { - color: var(--list-group-item-success-color); - background-color: var(--list-group-item-success-bg); + color: var(--list-group-item-success-color, #a0e5b3); + background-color: var(--list-group-item-success-bg, #1e3d2d); } .list-group-item-success.list-group-item-action:active, .list-group-item-success.list-group-item-action:focus { - color: var(--list-group-item-success-color); - background-color: var(--list-group-item-success-active-bg); + color: var(--list-group-item-success-color, #a0e5b3); + background-color: var(--list-group-item-success-active-bg, #275538); } .list-group-item-success.list-group-item-action.active { - color: var(--body-color); - background-color: var(--list-group-item-success-color); - border-color: var(--list-group-item-success-color); + color: var(--body-color, #e6ebf1); + background-color: var(--list-group-item-success-color, #a0e5b3); + border-color: var(--list-group-item-success-color, #a0e5b3); } .list-group-item-info { - color: var(--list-group-item-info-color); - background-color: var(--list-group-item-info-bg); + color: var(--list-group-item-info-color, #8eccf2); + background-color: var(--list-group-item-info-bg, #1a3448); } .list-group-item-info.list-group-item-action:active, .list-group-item-info.list-group-item-action:focus { - color: var(--list-group-item-info-color); - background-color: var(--list-group-item-info-active-bg); + color: var(--list-group-item-info-color, #8eccf2); + background-color: var(--list-group-item-info-active-bg, #234459); } .list-group-item-info.list-group-item-action.active { - color: var(--body-color); - background-color: var(--list-group-item-info-color); - border-color: var(--list-group-item-info-color); + color: var(--body-color, #e6ebf1); + background-color: var(--list-group-item-info-color, #8eccf2); + border-color: var(--list-group-item-info-color, #8eccf2); } .list-group-item-warning { - color: var(--list-group-item-warning-color); - background-color: var(--list-group-item-warning-bg); + color: var(--list-group-item-warning-color, #ffe4a0); + background-color: var(--list-group-item-warning-bg, #4a3410); } .list-group-item-warning.list-group-item-action:active, .list-group-item-warning.list-group-item-action:focus { - color: var(--list-group-item-warning-color); - background-color: var(--list-group-item-warning-active-bg); + color: var(--list-group-item-warning-color, #ffe4a0); + background-color: var(--list-group-item-warning-active-bg, #5c4216); } .list-group-item-warning.list-group-item-action.active { - color: var(--body-color); - background-color: var(--list-group-item-warning-color); - border-color: var(--list-group-item-warning-color); + color: var(--body-color, #e6ebf1); + background-color: var(--list-group-item-warning-color, #ffe4a0); + border-color: var(--list-group-item-warning-color, #ffe4a0); } .list-group-item-danger { - color: var(--list-group-item-danger-color); - background-color: var(--list-group-item-danger-bg); + color: var(--list-group-item-danger-color, #ffa8a3); + background-color: var(--list-group-item-danger-bg, #4a1e1c); } .list-group-item-danger.list-group-item-action:active, .list-group-item-danger.list-group-item-action:focus { - color: var(--list-group-item-danger-color); - background-color: var(--list-group-item-danger-active-bg); + color: var(--list-group-item-danger-color, #ffa8a3); + background-color: var(--list-group-item-danger-active-bg, #5c2823); } .list-group-item-danger.list-group-item-action.active { - color: var(--body-color); - background-color: var(--list-group-item-danger-color); - border-color: var(--list-group-item-danger-color); + color: var(--body-color, #e6ebf1); + background-color: var(--list-group-item-danger-color, #ffa8a3); + border-color: var(--list-group-item-danger-color, #ffa8a3); } .list-group-item-light { - color: var(--list-group-item-light-color); - background-color: var(--list-group-item-light-bg); + color: var(--list-group-item-light-color, #e9ecef); + background-color: var(--list-group-item-light-bg, #1e2430); } .list-group-item-light.list-group-item-action:active, .list-group-item-light.list-group-item-action:focus { - color: var(--list-group-item-light-color); - background-color: var(--list-group-item-light-active-bg); + color: var(--list-group-item-light-color, #e9ecef); + background-color: var(--list-group-item-light-active-bg, #282f3d); } .list-group-item-light.list-group-item-action.active { - color: var(--body-color); - background-color: var(--list-group-item-light-color); - border-color: var(--list-group-item-light-color); + color: var(--body-color, #e6ebf1); + background-color: var(--list-group-item-light-color, #e9ecef); + border-color: var(--list-group-item-light-color, #e9ecef); } .list-group-item-dark { - color: var(--list-group-item-dark-color); - background-color: var(--list-group-item-dark-bg); + color: var(--list-group-item-dark-color, #48525d); + background-color: var(--list-group-item-dark-bg, #0e1318); } .list-group-item-dark.list-group-item-action:active, .list-group-item-dark.list-group-item-action:focus { - color: var(--list-group-item-dark-color); - background-color: var(--list-group-item-dark-active-bg); + color: var(--list-group-item-dark-color, #48525d); + background-color: var(--list-group-item-dark-active-bg, #161b22); } .list-group-item-dark.list-group-item-action.active { - color: var(--body-color); - background-color: var(--list-group-item-dark-color); - border-color: var(--list-group-item-dark-color); + color: var(--body-color, #e6ebf1); + background-color: var(--list-group-item-dark-color, #48525d); + border-color: var(--list-group-item-dark-color, #48525d); } .btn-close { @@ -6137,7 +6128,7 @@ fieldset:disabled .btn { width: 1em; height: 1em; padding: 0.25em 0.25em; - color: hsl(0, 0%, 0%); + color: var(--body-color, #e6ebf1); background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='hsl%280, 0%, 0%%29'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; border: 0; border-radius: 0.25rem; @@ -6145,7 +6136,6 @@ fieldset:disabled .btn { } .btn-close:active { - color: hsl(0, 0%, 0%); text-decoration: none; opacity: 0.75; } @@ -6174,17 +6164,17 @@ fieldset:disabled .btn { .toast { /* Values defined in light.standard.css / dark.standard.css */ - width: var(--toast-max-width); + width: var(--toast-max-width, 350px); max-width: 100%; - font-size: var(--toast-font-size); - color: var(--toast-color); + font-size: var(--toast-font-size, 0.875rem); + color: var(--toast-color, ); pointer-events: auto; - background-color: var(--toast-bg); + background-color: var(--toast-bg, rgba(21, 27, 34, 0.9)); background-clip: padding-box; - border: var(--toast-border-width) solid var(--toast-border-color); - -webkit-box-shadow: var(--toast-box-shadow); - box-shadow: var(--toast-box-shadow); - border-radius: var(--toast-border-radius); + border: var(--toast-border-width, 1px) solid var(--toast-border-color); + -webkit-box-shadow: var(--toast-box-shadow, 0 0.5rem 1rem var(--shadow-color-medium)); + box-shadow: var(--toast-box-shadow, 0 0.5rem 1rem var(--shadow-color-medium)); + border-radius: var(--toast-border-radius, 0.25rem); } .toast.showing { @@ -6198,7 +6188,7 @@ fieldset:disabled .btn { .toast-container { --toast-zindex: 1090; position: absolute; - z-index: var(--toast-zindex); + z-index: var(--toast-zindex, 1090); width: -webkit-max-content; width: -moz-max-content; width: max-content; @@ -6207,7 +6197,7 @@ fieldset:disabled .btn { } .toast-container> :not(:last-child) { - margin-bottom: var(--toast-spacing); + margin-bottom: var(--toast-spacing, 1em); } .toast-header { @@ -6217,22 +6207,22 @@ fieldset:disabled .btn { -webkit-box-align: center; -ms-flex-align: center; align-items: center; - padding: var(--toast-padding-y) var(--toast-padding-x); + padding: var(--toast-padding-y, 0.5rem) var(--toast-padding-x, 0.75rem); color: var(--toast-header-color); - background-color: var(--toast-header-bg); + background-color: var(--toast-header-bg, rgba(21, 27, 34, 0.85)); background-clip: padding-box; - border-bottom: var(--toast-border-width) solid var(--toast-header-border-color); - border-top-left-radius: calc(var(--toast-border-radius) - var(--toast-border-width)); - border-top-right-radius: calc(var(--toast-border-radius) - var(--toast-border-width)); + border-bottom: var(--toast-border-width, 1px) solid var(--toast-header-border-color, rgba(var(--white-rgb), var(--opacity-10))); + border-top-left-radius: calc(var(--toast-border-radius, 0.25rem) - var(--toast-border-width, 1px)); + border-top-right-radius: calc(var(--toast-border-radius, 0.25rem) - var(--toast-border-width, 1px)); } .toast-header .btn-close { - margin-right: calc(-0.5 * var(--toast-padding-x)); - margin-left: var(--toast-padding-x); + margin-right: calc(-0.5 * var(--toast-padding-x, 0.75rem)); + margin-left: var(--toast-padding-x, 0.75rem); } .toast-body { - padding: var(--toast-padding-x); + padding: var(--toast-padding-x, 0.75rem); word-wrap: break-word; } @@ -6241,7 +6231,7 @@ fieldset:disabled .btn { position: fixed; top: 0; left: 0; - z-index: var(--modal-zindex); + z-index: var(--modal-zindex, 1050); display: none; width: 100%; height: 100%; @@ -6253,7 +6243,7 @@ fieldset:disabled .btn { .modal-dialog { position: relative; width: auto; - margin: var(--modal-margin); + margin: var(--modal-margin, 0.5rem); pointer-events: none; } @@ -6286,7 +6276,7 @@ fieldset:disabled .btn { } .modal-dialog-scrollable { - height: calc(100% - var(--modal-margin) * 2); + height: calc(100% - var(--modal-margin, 0.5rem) * 2); } .modal-dialog-scrollable .modal-content { @@ -6305,7 +6295,7 @@ fieldset:disabled .btn { -webkit-box-align: center; -ms-flex-align: center; align-items: center; - min-height: calc(100% - var(--modal-margin) * 2); + min-height: calc(100% - var(--modal-margin, 0.5rem) * 2); } .modal-content { @@ -6318,12 +6308,12 @@ fieldset:disabled .btn { -ms-flex-direction: column; flex-direction: column; width: 100%; - color: var(--modal-color); + color: var(--modal-color, ); pointer-events: auto; background-color: var(--modal-bg); background-clip: padding-box; - border: var(--modal-border-width) solid var(--modal-border-color); - border-radius: var(--modal-border-radius); + border: var(--modal-border-width, 1px) solid var(--modal-border-color); + border-radius: var(--modal-border-radius, 0.3rem); outline: 0; } @@ -6332,10 +6322,10 @@ fieldset:disabled .btn { position: fixed; top: 0; left: 0; - z-index: var(--backdrop-zindex); + z-index: var(--backdrop-zindex, 1040); width: 100vw; height: 100vh; - background-color: var(--backdrop-bg); + background-color: var(--backdrop-bg, hsl(0, 0%, 0%)); } .modal-backdrop.fade { @@ -6343,7 +6333,7 @@ fieldset:disabled .btn { } .modal-backdrop.show { - opacity: var(--backdrop-opacity); + opacity: var(--backdrop-opacity, 0.5); } .modal-header { @@ -6358,20 +6348,20 @@ fieldset:disabled .btn { -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; - padding: var(--modal-header-padding); - border-bottom: var(--modal-header-border-width) solid var(--modal-header-border-color); - border-top-left-radius: var(--modal-inner-border-radius); - border-top-right-radius: var(--modal-inner-border-radius); + padding: var(--modal-header-padding, 1rem 1rem); + border-bottom: var(--modal-header-border-width, 1px) solid var(--modal-header-border-color); + border-top-left-radius: var(--modal-inner-border-radius, calc(0.3rem - 1px)); + border-top-right-radius: var(--modal-inner-border-radius, calc(0.3rem - 1px)); } .modal-header .btn-close { - padding: calc(var(--modal-header-padding-y) * 0.5) calc(var(--modal-header-padding-x) * 0.5); - margin: calc(-0.5 * var(--modal-header-padding-y)) calc(-0.5 * var(--modal-header-padding-x)) calc(-0.5 * var(--modal-header-padding-y)) auto; + padding: calc(var(--modal-header-padding-y, 1rem) * 0.5) calc(var(--modal-header-padding-x, 1rem) * 0.5); + margin: calc(-0.5 * var(--modal-header-padding-y, 1rem)) calc(-0.5 * var(--modal-header-padding-x, 1rem)) calc(-0.5 * var(--modal-header-padding-y, 1rem)) auto; } .modal-title { margin-bottom: 0; - line-height: var(--modal-title-line-height); + line-height: var(--modal-title-line-height, 1.5); } .modal-body { @@ -6379,7 +6369,7 @@ fieldset:disabled .btn { -webkit-box-flex: 1; -ms-flex: 1 1 auto; flex: 1 1 auto; - padding: var(--modal-padding); + padding: var(--modal-padding, 1rem); } .modal-footer { @@ -6396,15 +6386,15 @@ fieldset:disabled .btn { -webkit-box-pack: end; -ms-flex-pack: end; justify-content: flex-end; - padding: calc(var(--modal-padding) - var(--modal-footer-gap) * 0.5); - background-color: var(--modal-footer-bg); - border-top: var(--modal-footer-border-width) solid var(--modal-footer-border-color); - border-bottom-right-radius: var(--modal-inner-border-radius); - border-bottom-left-radius: var(--modal-inner-border-radius); + padding: calc(var(--modal-padding, 1rem) - var(--modal-footer-gap, 0.5rem) * 0.5); + background-color: var(--modal-footer-bg, ); + border-top: var(--modal-footer-border-width, 1px) solid var(--modal-footer-border-color); + border-bottom-right-radius: var(--modal-inner-border-radius, calc(0.3rem - 1px)); + border-bottom-left-radius: var(--modal-inner-border-radius, calc(0.3rem - 1px)); } .modal-footer>* { - margin: calc(var(--modal-footer-gap) * 0.5); + margin: calc(var(--modal-footer-gap, 0.5rem) * 0.5); } @media (min-width: 576px) { @@ -6414,7 +6404,7 @@ fieldset:disabled .btn { } .modal-dialog { - max-width: var(--modal-width); + max-width: var(--modal-width, 500px); margin-right: auto; margin-left: auto; } @@ -6582,10 +6572,10 @@ fieldset:disabled .btn { .tooltip { /* Values defined in light.standard.css / dark.standard.css */ - z-index: var(--tooltip-zindex); + z-index: var(--tooltip-zindex, 1070); display: block; - padding: var(--tooltip-arrow-height); - margin: var(--tooltip-margin); + padding: var(--tooltip-arrow-height, 0.4rem); + margin: var(--tooltip-margin, ); font-family: v-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-style: normal; font-weight: 400; @@ -6600,19 +6590,19 @@ fieldset:disabled .btn { white-space: normal; word-spacing: normal; line-break: auto; - font-size: var(--tooltip-font-size); + font-size: var(--tooltip-font-size, 0.875rem); word-wrap: break-word; opacity: 0; } .tooltip.show { - opacity: var(--tooltip-opacity); + opacity: var(--tooltip-opacity, 0.9); } .tooltip .tooltip-arrow { display: block; - width: var(--tooltip-arrow-width); - height: var(--tooltip-arrow-height); + width: var(--tooltip-arrow-width, 0.8rem); + height: var(--tooltip-arrow-height, 0.4rem); } .tooltip .tooltip-arrow::before { @@ -6630,23 +6620,23 @@ fieldset:disabled .btn { .bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { top: -1px; - border-width: var(--tooltip-arrow-height) calc(var(--tooltip-arrow-width) * 0.5) 0; - border-top-color: var(--tooltip-bg); + border-width: var(--tooltip-arrow-height, 0.4rem) calc(var(--tooltip-arrow-width, 0.8rem) * 0.5) 0; + border-top-color: var(--tooltip-bg, hsl(0, 0%, 0%)); } /* rtl:begin:ignore */ .bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { left: 0; - width: var(--tooltip-arrow-height); - height: var(--tooltip-arrow-width); + width: var(--tooltip-arrow-height, 0.4rem); + height: var(--tooltip-arrow-width, 0.8rem); } .bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { right: -1px; - border-width: calc(var(--tooltip-arrow-width) * 0.5) var(--tooltip-arrow-height) calc(var(--tooltip-arrow-width) * 0.5) 0; - border-right-color: var(--tooltip-bg); + border-width: calc(var(--tooltip-arrow-width, 0.8rem) * 0.5) var(--tooltip-arrow-height, 0.4rem) calc(var(--tooltip-arrow-width, 0.8rem) * 0.5) 0; + border-right-color: var(--tooltip-bg, hsl(0, 0%, 0%)); } /* rtl:end:ignore */ @@ -6658,40 +6648,40 @@ fieldset:disabled .btn { .bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { bottom: -1px; - border-width: 0 calc(var(--tooltip-arrow-width) * 0.5) var(--tooltip-arrow-height); - border-bottom-color: var(--tooltip-bg); + border-width: 0 calc(var(--tooltip-arrow-width, 0.8rem) * 0.5) var(--tooltip-arrow-height, 0.4rem); + border-bottom-color: var(--tooltip-bg, hsl(0, 0%, 0%)); } /* rtl:begin:ignore */ .bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { right: 0; - width: var(--tooltip-arrow-height); - height: var(--tooltip-arrow-width); + width: var(--tooltip-arrow-height, 0.4rem); + height: var(--tooltip-arrow-width, 0.8rem); } .bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { left: -1px; - border-width: calc(var(--tooltip-arrow-width) * 0.5) 0 calc(var(--tooltip-arrow-width) * 0.5) var(--tooltip-arrow-height); - border-left-color: var(--tooltip-bg); + border-width: calc(var(--tooltip-arrow-width, 0.8rem) * 0.5) 0 calc(var(--tooltip-arrow-width, 0.8rem) * 0.5) var(--tooltip-arrow-height, 0.4rem); + border-left-color: var(--tooltip-bg, hsl(0, 0%, 0%)); } /* rtl:end:ignore */ .tooltip-inner { - max-width: var(--tooltip-max-width); - padding: var(--tooltip-padding-y) var(--tooltip-padding-x); + max-width: var(--tooltip-max-width, 200px); + padding: var(--tooltip-padding-y, 0.25rem) var(--tooltip-padding-x, 0.5rem); color: var(--tooltip-color); text-align: center; - background-color: var(--tooltip-bg); - border-radius: var(--tooltip-border-radius); + background-color: var(--tooltip-bg, hsl(0, 0%, 0%)); + border-radius: var(--tooltip-border-radius, 0.25rem); } .popover { /* Values defined in light.standard.css / dark.standard.css */ - z-index: var(--popover-zindex); + z-index: var(--popover-zindex, 1060); display: block; - max-width: var(--popover-max-width); + max-width: var(--popover-max-width, 276px); font-family: var(--font-family-body, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); font-style: normal; font-weight: 400; @@ -6706,18 +6696,18 @@ fieldset:disabled .btn { white-space: normal; word-spacing: normal; line-break: auto; - font-size: var(--popover-font-size); + font-size: var(--popover-font-size, 0.875rem); word-wrap: break-word; background-color: var(--popover-bg); background-clip: padding-box; - border: var(--popover-border-width) solid var(--popover-border-color); - border-radius: var(--popover-border-radius); + border: var(--popover-border-width, 1px) solid var(--popover-border-color); + border-radius: var(--popover-border-radius, 0.3rem); } .popover .popover-arrow { display: block; - width: var(--popover-arrow-width); - height: var(--popover-arrow-height); + width: var(--popover-arrow-width, 1rem); + height: var(--popover-arrow-height, 0.5rem); } .popover .popover-arrow::before, @@ -6732,14 +6722,14 @@ fieldset:disabled .btn { .bs-popover-top>.popover-arrow, .bs-popover-auto[data-popper-placement^=top]>.popover-arrow { - bottom: calc(-1 * (var(--popover-arrow-height)) - var(--popover-border-width)); + bottom: calc(-1 * (var(--popover-arrow-height, 0.5rem)) - var(--popover-border-width, 1px)); } .bs-popover-top>.popover-arrow::before, .bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before, .bs-popover-top>.popover-arrow::after, .bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after { - border-width: var(--popover-arrow-height) calc(var(--popover-arrow-width) * 0.5) 0; + border-width: var(--popover-arrow-height, 0.5rem) calc(var(--popover-arrow-width, 1rem) * 0.5) 0; } .bs-popover-top>.popover-arrow::before, @@ -6750,23 +6740,23 @@ fieldset:disabled .btn { .bs-popover-top>.popover-arrow::after, .bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after { - bottom: var(--popover-border-width); + bottom: var(--popover-border-width, 1px); border-top-color: var(--popover-bg); } /* rtl:begin:ignore */ .bs-popover-end>.popover-arrow, .bs-popover-auto[data-popper-placement^=right]>.popover-arrow { - left: calc(-1 * (var(--popover-arrow-height)) - var(--popover-border-width)); - width: var(--popover-arrow-height); - height: var(--popover-arrow-width); + left: calc(-1 * (var(--popover-arrow-height, 0.5rem)) - var(--popover-border-width, 1px)); + width: var(--popover-arrow-height, 0.5rem); + height: var(--popover-arrow-width, 1rem); } .bs-popover-end>.popover-arrow::before, .bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before, .bs-popover-end>.popover-arrow::after, .bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after { - border-width: calc(var(--popover-arrow-width) * 0.5) var(--popover-arrow-height) calc(var(--popover-arrow-width) * 0.5) 0; + border-width: calc(var(--popover-arrow-width, 1rem) * 0.5) var(--popover-arrow-height, 0.5rem) calc(var(--popover-arrow-width, 1rem) * 0.5) 0; } .bs-popover-end>.popover-arrow::before, @@ -6777,21 +6767,21 @@ fieldset:disabled .btn { .bs-popover-end>.popover-arrow::after, .bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after { - left: var(--popover-border-width); + left: var(--popover-border-width, 1px); border-right-color: var(--popover-bg); } /* rtl:end:ignore */ .bs-popover-bottom>.popover-arrow, .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow { - top: calc(-1 * (var(--popover-arrow-height)) - var(--popover-border-width)); + top: calc(-1 * (var(--popover-arrow-height, 0.5rem)) - var(--popover-border-width, 1px)); } .bs-popover-bottom>.popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before, .bs-popover-bottom>.popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after { - border-width: 0 calc(var(--popover-arrow-width) * 0.5) var(--popover-arrow-height); + border-width: 0 calc(var(--popover-arrow-width, 1rem) * 0.5) var(--popover-arrow-height, 0.5rem); } .bs-popover-bottom>.popover-arrow::before, @@ -6802,7 +6792,7 @@ fieldset:disabled .btn { .bs-popover-bottom>.popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after { - top: var(--popover-border-width); + top: var(--popover-border-width, 1px); border-bottom-color: var(--popover-bg); } @@ -6812,25 +6802,25 @@ fieldset:disabled .btn { top: 0; left: 50%; display: block; - width: var(--popover-arrow-width); - margin-left: calc(-0.5 * var(--popover-arrow-width)); + width: var(--popover-arrow-width, 1rem); + margin-left: calc(-0.5 * var(--popover-arrow-width, 1rem)); content: ""; - border-bottom: var(--popover-border-width) solid var(--popover-header-bg); + border-bottom: var(--popover-border-width, 1px) solid var(--popover-header-bg); } /* rtl:begin:ignore */ .bs-popover-start>.popover-arrow, .bs-popover-auto[data-popper-placement^=left]>.popover-arrow { - right: calc(-1 * (var(--popover-arrow-height)) - var(--popover-border-width)); - width: var(--popover-arrow-height); - height: var(--popover-arrow-width); + right: calc(-1 * (var(--popover-arrow-height, 0.5rem)) - var(--popover-border-width, 1px)); + width: var(--popover-arrow-height, 0.5rem); + height: var(--popover-arrow-width, 1rem); } .bs-popover-start>.popover-arrow::before, .bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before, .bs-popover-start>.popover-arrow::after, .bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after { - border-width: calc(var(--popover-arrow-width) * 0.5) 0 calc(var(--popover-arrow-width) * 0.5) var(--popover-arrow-height); + border-width: calc(var(--popover-arrow-width, 1rem) * 0.5) 0 calc(var(--popover-arrow-width, 1rem) * 0.5) var(--popover-arrow-height, 0.5rem); } .bs-popover-start>.popover-arrow::before, @@ -6841,20 +6831,20 @@ fieldset:disabled .btn { .bs-popover-start>.popover-arrow::after, .bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after { - right: var(--popover-border-width); + right: var(--popover-border-width, 1px); border-left-color: var(--popover-bg); } /* rtl:end:ignore */ .popover-header { - padding: var(--popover-header-padding-y) var(--popover-header-padding-x); + padding: var(--popover-header-padding-y, 0.5rem) var(--popover-header-padding-x, 1rem); margin-bottom: 0; - font-size: var(--popover-header-font-size); - color: var(--popover-header-color); + font-size: var(--popover-header-font-size, 1rem); + color: var(--popover-header-color, ); background-color: var(--popover-header-bg); - border-bottom: var(--popover-border-width) solid var(--popover-border-color); - border-top-left-radius: var(--popover-inner-border-radius); - border-top-right-radius: var(--popover-inner-border-radius); + border-bottom: var(--popover-border-width, 1px) solid var(--popover-border-color); + border-top-left-radius: var(--popover-inner-border-radius, calc(0.3rem - 1px)); + border-top-right-radius: var(--popover-inner-border-radius, calc(0.3rem - 1px)); } .popover-header:empty { @@ -6862,7 +6852,7 @@ fieldset:disabled .btn { } .popover-body { - padding: var(--popover-body-padding-y) var(--popover-body-padding-x); + padding: var(--popover-body-padding-y, 1rem) var(--popover-body-padding-x, 1rem); color: var(--popover-body-color); } @@ -6980,7 +6970,7 @@ fieldset:disabled .btn { justify-content: center; width: 15%; padding: 0; - color: var(--body-color); + color: var(--body-color, #e6ebf1); text-align: center; background: none; border: 0; @@ -7004,7 +6994,7 @@ fieldset:disabled .btn { .carousel-control-prev:focus, .carousel-control-next:active, .carousel-control-next:focus { - color: var(--body-color); + color: var(--body-color, #e6ebf1); text-decoration: none; outline: 0; opacity: 0.9; @@ -7076,7 +7066,7 @@ fieldset:disabled .btn { margin-left: 0.1875rem; text-indent: -999px; cursor: pointer; - background-color: var(--body-color); + background-color: var(--body-color, #e6ebf1); background-clip: padding-box; border: 0; border-top: 10px solid transparent; @@ -7106,7 +7096,7 @@ fieldset:disabled .btn { left: 15%; padding-top: 1.25rem; padding-bottom: 1.25rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); text-align: center; } @@ -7127,12 +7117,12 @@ fieldset:disabled .btn { .spinner-grow, .spinner-border { display: inline-block; - width: var(--spinner-width); - height: var(--spinner-height); - vertical-align: var(--spinner-vertical-align); + width: var(--spinner-width, 2rem); + height: var(--spinner-height, 2rem); + vertical-align: var(--spinner-vertical-align, -0.125em); border-radius: 50%; - -webkit-animation: var(--spinner-animation-speed) linear infinite var(--spinner-animation-name); - animation: var(--spinner-animation-speed) linear infinite var(--spinner-animation-name); + -webkit-animation: var(--spinner-animation-speed, 0.75s) linear infinite var(--spinner-animation-name); + animation: var(--spinner-animation-speed, 0.75s) linear infinite var(--spinner-animation-name); } @-webkit-keyframes spinner-border { @@ -7160,7 +7150,7 @@ fieldset:disabled .btn { .spinner-border { /* Values defined in light.standard.css / dark.standard.css */ --spinner-animation-name: spinner-border; - border: var(--spinner-border-width) solid currentcolor; + border: var(--spinner-border-width, 0.25em) solid currentcolor; border-right-color: transparent; } @@ -7229,7 +7219,7 @@ fieldset:disabled .btn { .offcanvas-sm { position: fixed; bottom: 0; - z-index: var(--offcanvas-zindex); + z-index: var(--offcanvas-zindex, 1045); display: -webkit-box; display: -ms-flexbox; display: flex; @@ -7263,8 +7253,8 @@ fieldset:disabled .btn { .offcanvas-sm.offcanvas-start { top: 0; left: 0; - width: var(--offcanvas-width); - border-right: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-right: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(-100%); transform: translateX(-100%); } @@ -7274,8 +7264,8 @@ fieldset:disabled .btn { .offcanvas-sm.offcanvas-end { top: 0; right: 0; - width: var(--offcanvas-width); - border-left: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-left: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(100%); transform: translateX(100%); } @@ -7286,9 +7276,9 @@ fieldset:disabled .btn { top: 0; right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-bottom: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-bottom: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(-100%); transform: translateY(-100%); } @@ -7298,9 +7288,9 @@ fieldset:disabled .btn { .offcanvas-sm.offcanvas-bottom { right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-top: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-top: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(100%); transform: translateY(100%); } @@ -7352,7 +7342,7 @@ fieldset:disabled .btn { .offcanvas-md { position: fixed; bottom: 0; - z-index: var(--offcanvas-zindex); + z-index: var(--offcanvas-zindex, 1045); display: -webkit-box; display: -ms-flexbox; display: flex; @@ -7386,8 +7376,8 @@ fieldset:disabled .btn { .offcanvas-md.offcanvas-start { top: 0; left: 0; - width: var(--offcanvas-width); - border-right: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-right: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(-100%); transform: translateX(-100%); } @@ -7397,8 +7387,8 @@ fieldset:disabled .btn { .offcanvas-md.offcanvas-end { top: 0; right: 0; - width: var(--offcanvas-width); - border-left: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-left: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(100%); transform: translateX(100%); } @@ -7409,9 +7399,9 @@ fieldset:disabled .btn { top: 0; right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-bottom: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-bottom: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(-100%); transform: translateY(-100%); } @@ -7421,9 +7411,9 @@ fieldset:disabled .btn { .offcanvas-md.offcanvas-bottom { right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-top: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-top: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(100%); transform: translateY(100%); } @@ -7475,7 +7465,7 @@ fieldset:disabled .btn { .offcanvas-lg { position: fixed; bottom: 0; - z-index: var(--offcanvas-zindex); + z-index: var(--offcanvas-zindex, 1045); display: -webkit-box; display: -ms-flexbox; display: flex; @@ -7509,8 +7499,8 @@ fieldset:disabled .btn { .offcanvas-lg.offcanvas-start { top: 0; left: 0; - width: var(--offcanvas-width); - border-right: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-right: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(-100%); transform: translateX(-100%); } @@ -7520,8 +7510,8 @@ fieldset:disabled .btn { .offcanvas-lg.offcanvas-end { top: 0; right: 0; - width: var(--offcanvas-width); - border-left: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-left: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(100%); transform: translateX(100%); } @@ -7532,9 +7522,9 @@ fieldset:disabled .btn { top: 0; right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-bottom: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-bottom: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(-100%); transform: translateY(-100%); } @@ -7544,9 +7534,9 @@ fieldset:disabled .btn { .offcanvas-lg.offcanvas-bottom { right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-top: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-top: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(100%); transform: translateY(100%); } @@ -7598,7 +7588,7 @@ fieldset:disabled .btn { .offcanvas-xl { position: fixed; bottom: 0; - z-index: var(--offcanvas-zindex); + z-index: var(--offcanvas-zindex, 1045); display: -webkit-box; display: -ms-flexbox; display: flex; @@ -7632,8 +7622,8 @@ fieldset:disabled .btn { .offcanvas-xl.offcanvas-start { top: 0; left: 0; - width: var(--offcanvas-width); - border-right: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-right: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(-100%); transform: translateX(-100%); } @@ -7643,8 +7633,8 @@ fieldset:disabled .btn { .offcanvas-xl.offcanvas-end { top: 0; right: 0; - width: var(--offcanvas-width); - border-left: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-left: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(100%); transform: translateX(100%); } @@ -7655,9 +7645,9 @@ fieldset:disabled .btn { top: 0; right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-bottom: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-bottom: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(-100%); transform: translateY(-100%); } @@ -7667,9 +7657,9 @@ fieldset:disabled .btn { .offcanvas-xl.offcanvas-bottom { right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-top: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-top: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(100%); transform: translateY(100%); } @@ -7721,7 +7711,7 @@ fieldset:disabled .btn { .offcanvas-xxl { position: fixed; bottom: 0; - z-index: var(--offcanvas-zindex); + z-index: var(--offcanvas-zindex, 1045); display: -webkit-box; display: -ms-flexbox; display: flex; @@ -7755,8 +7745,8 @@ fieldset:disabled .btn { .offcanvas-xxl.offcanvas-start { top: 0; left: 0; - width: var(--offcanvas-width); - border-right: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-right: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(-100%); transform: translateX(-100%); } @@ -7766,8 +7756,8 @@ fieldset:disabled .btn { .offcanvas-xxl.offcanvas-end { top: 0; right: 0; - width: var(--offcanvas-width); - border-left: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-left: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(100%); transform: translateX(100%); } @@ -7778,9 +7768,9 @@ fieldset:disabled .btn { top: 0; right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-bottom: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-bottom: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(-100%); transform: translateY(-100%); } @@ -7790,9 +7780,9 @@ fieldset:disabled .btn { .offcanvas-xxl.offcanvas-bottom { right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-top: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-top: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(100%); transform: translateY(100%); } @@ -7843,7 +7833,7 @@ fieldset:disabled .btn { .offcanvas { position: fixed; bottom: 0; - z-index: var(--offcanvas-zindex); + z-index: var(--offcanvas-zindex, 1045); display: -webkit-box; display: -ms-flexbox; display: flex; @@ -7875,8 +7865,8 @@ fieldset:disabled .btn { .offcanvas.offcanvas-start { top: 0; left: 0; - width: var(--offcanvas-width); - border-right: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-right: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(-100%); transform: translateX(-100%); } @@ -7884,8 +7874,8 @@ fieldset:disabled .btn { .offcanvas.offcanvas-end { top: 0; right: 0; - width: var(--offcanvas-width); - border-left: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + width: var(--offcanvas-width, 400px); + border-left: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateX(100%); transform: translateX(100%); } @@ -7894,9 +7884,9 @@ fieldset:disabled .btn { top: 0; right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-bottom: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-bottom: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(-100%); transform: translateY(-100%); } @@ -7904,9 +7894,9 @@ fieldset:disabled .btn { .offcanvas.offcanvas-bottom { right: 0; left: 0; - height: var(--offcanvas-height); + height: var(--offcanvas-height, 30vh); max-height: 100%; - border-top: var(--offcanvas-border-width) solid var(--offcanvas-border-color); + border-top: var(--offcanvas-border-width, 1px) solid var(--offcanvas-border-color); -webkit-transform: translateY(100%); transform: translateY(100%); } @@ -7951,14 +7941,16 @@ fieldset:disabled .btn { -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; - padding: var(--offcanvas-padding-y) var(--offcanvas-padding-x); + padding: var(--offcanvas-padding-y, 1rem) var(--offcanvas-padding-x, 1rem); } .offcanvas-header .btn-close { - padding: calc(var(--offcanvas-padding-y) * 0.5) calc(var(--offcanvas-padding-x) * 0.5); - margin-top: calc(-0.5 * var(--offcanvas-padding-y)); - margin-right: calc(-0.5 * var(--offcanvas-padding-x)); - margin-bottom: calc(-0.5 * var(--offcanvas-padding-y)); + padding: calc(var(--offcanvas-padding-y, 1rem) * 0.5) calc(var(--offcanvas-padding-x, 1rem) * 0.5); + margin-top: calc(-0.5 * var(--offcanvas-padding-y, 1rem)); + margin-right: calc(-0.5 * var(--offcanvas-padding-x, 1rem)); + margin-bottom: calc(-0.5 * var(--offcanvas-padding-y, 1rem)); + color: var(--mainmenu-nav-link-color, #fff); + background-color: var(--offcanvas-bg); } .offcanvas-title { @@ -7970,7 +7962,7 @@ fieldset:disabled .btn { -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; - padding: var(--offcanvas-padding-y) var(--offcanvas-padding-x); + padding: var(--offcanvas-padding-y, 1rem) var(--offcanvas-padding-x, 1rem); overflow-y: auto; } @@ -8047,33 +8039,33 @@ fieldset:disabled .btn { } .text-bg-primary { - color: var(--body-color); - background-color: var(--primary); + color: var(--body-color, #e6ebf1); + background-color: var(--primary, #010156); } .text-bg-secondary { - color: var(--body-color) ; + color: var(--body-color, #e6ebf1) ; background-color: RGBA(109, 117, 126, var(--bg-opacity, 1)) ; } .text-bg-success { - color: var(--body-color) ; + color: var(--body-color, #e6ebf1) ; background-color: RGBA(68, 131, 68, var(--bg-opacity, 1)) ; } .text-bg-info { - color: var(--body-color) ; + color: var(--body-color, #e6ebf1) ; background-color: RGBA(48, 99, 141, var(--bg-opacity, 1)) ; } .text-bg-warning { - color: var(--body-color) ; + color: var(--body-color, #e6ebf1) ; background-color: RGBA(173, 98, 0, var(--bg-opacity, 1)) ; } .text-bg-danger { - color: var(--body-color) ; + color: var(--body-color, #e6ebf1) ; background-color: RGBA(165, 31, 24, var(--bg-opacity, 1)) ; } @@ -8083,80 +8075,80 @@ fieldset:disabled .btn { } .text-bg-dark { - color: var(--body-color) ; + color: var(--body-color, #e6ebf1) ; background-color: RGBA(53, 59, 65, var(--bg-opacity, 1)) ; } .link-primary { - color: var(--link-primary-color); + color: var(--link-primary-color, hsl(240, 98%, 50%)); } .link-primary:active, .link-primary:focus { - color: var(--link-primary-hover-color); + color: var(--link-primary-hover-color, hsl(240, 98%, 45%)); } .link-secondary { - color: var(--link-secondary-color); + color: var(--link-secondary-color, hsl(210, 15%, 70%)); } .link-secondary:active, .link-secondary:focus { - color: var(--link-secondary-hover-color); + color: var(--link-secondary-hover-color, hsl(210, 15%, 65%)); } .link-success { - color: var(--link-success-color); + color: var(--link-success-color, hsl(120, 40%, 60%)); } .link-success:active, .link-success:focus { - color: var(--link-success-hover-color); + color: var(--link-success-hover-color, hsl(120, 40%, 55%)); } .link-info { - color: var(--link-info-color); + color: var(--link-info-color, hsl(207, 60%, 65%)); } .link-info:active, .link-info:focus { - color: var(--link-info-hover-color); + color: var(--link-info-hover-color, hsl(207, 60%, 60%)); } .link-warning { - color: var(--link-warning-color); + color: var(--link-warning-color, hsl(38, 100%, 65%)); } .link-warning:active, .link-warning:focus { - color: var(--link-warning-hover-color); + color: var(--link-warning-hover-color, hsl(38, 100%, 60%)); } .link-danger { - color: var(--link-danger-color); + color: var(--link-danger-color, hsl(3, 85%, 65%)); } .link-danger:active, .link-danger:focus { - color: var(--link-danger-hover-color); + color: var(--link-danger-hover-color, hsl(3, 85%, 60%)); } .link-light { - color: var(--link-light-color); + color: var(--link-light-color, hsl(210, 20%, 90%)); } .link-light:active, .link-light:focus { - color: var(--link-light-hover-color); + color: var(--link-light-hover-color, hsl(210, 20%, 85%)); } .link-dark { - color: var(--link-dark-color); + color: var(--link-dark-color, hsl(210, 10%, 35%)); } .link-dark:active, .link-dark:focus { - color: var(--link-dark-hover-color); + color: var(--link-dark-hover-color, hsl(210, 10%, 30%)); } .ratio { @@ -8583,7 +8575,7 @@ fieldset:disabled .btn { } .border { - border: var(--border-width) var(--border-style) var(--border-color) ; + border: var(--border-width, 1px) var(--border-style, solid) var(--border-color, #2b323b) ; } .border-0 { @@ -8591,7 +8583,7 @@ fieldset:disabled .btn { } .border-top { - border-top: var(--border-width) var(--border-style) var(--border-color) ; + border-top: var(--border-width, 1px) var(--border-style, solid) var(--border-color, #2b323b) ; } .border-top-0 { @@ -8599,7 +8591,7 @@ fieldset:disabled .btn { } .border-end { - border-right: var(--border-width) var(--border-style) var(--border-color) ; + border-right: var(--border-width, 1px) var(--border-style, solid) var(--border-color, #2b323b) ; } .border-end-0 { @@ -8607,7 +8599,7 @@ fieldset:disabled .btn { } .border-bottom { - border-bottom: var(--border-width) var(--border-style) var(--border-color) ; + border-bottom: var(--border-width, 1px) var(--border-style, solid) var(--border-color, #2b323b) ; } .border-bottom-0 { @@ -8615,7 +8607,7 @@ fieldset:disabled .btn { } .border-start { - border-left: var(--border-width) var(--border-style) var(--border-color) ; + border-left: var(--border-width, 1px) var(--border-style, solid) var(--border-color, #2b323b) ; } .border-start-0 { @@ -8624,47 +8616,47 @@ fieldset:disabled .btn { .border-primary { --border-opacity: 1; - border-color: rgba(var(--primary-rgb), var(--border-opacity)) ; + border-color: rgba(var(--primary-rgb, 1,1,86), var(--border-opacity)) ; } .border-secondary { --border-opacity: 1; - border-color: rgba(var(--secondary-rgb), var(--border-opacity)) ; + border-color: rgba(var(--secondary-rgb, 72,82,93), var(--border-opacity)) ; } .border-success { --border-opacity: 1; - border-color: rgba(var(--success-rgb), var(--border-opacity)) ; + border-color: rgba(var(--success-rgb, 74,166,100), var(--border-opacity)) ; } .border-info { --border-opacity: 1; - border-color: rgba(var(--info-rgb), var(--border-opacity)) ; + border-color: rgba(var(--info-rgb, 79,122,160), var(--border-opacity)) ; } .border-warning { --border-opacity: 1; - border-color: rgba(var(--warning-rgb), var(--border-opacity)) ; + border-color: rgba(var(--warning-rgb, 199,122,0), var(--border-opacity)) ; } .border-danger { --border-opacity: 1; - border-color: rgba(var(--danger-rgb), var(--border-opacity)) ; + border-color: rgba(var(--danger-rgb, 194,58,49), var(--border-opacity)) ; } .border-light { --border-opacity: 1; - border-color: rgba(var(--light-rgb), var(--border-opacity)) ; + border-color: rgba(var(--light-rgb, 27,32,39), var(--border-opacity)) ; } .border-dark { --border-opacity: 1; - border-color: rgba(var(--dark-rgb), var(--border-opacity)) ; + border-color: rgba(var(--dark-rgb, 15,19,24), var(--border-opacity)) ; } .border-white { --border-opacity: 1; - border-color: rgba(var(--white-rgb), var(--border-opacity)) ; + border-color: rgba(var(--white-rgb, 255, 255, 255), var(--border-opacity)) ; } .border-1 { @@ -9171,31 +9163,38 @@ fieldset:disabled .btn { .mb-0 { margin-bottom: 0 ; + margin-top: 0 ; } .mb-1 { - margin-bottom: 0.25rem ; + margin-bottom: 0.1rem ; + margin-top: 0.1rem ; } .mb-2 { - margin-bottom: 0.5rem ; + margin-bottom: 0.2rem ; + margin-top: 0.2rem ; } .mb-3, .form-group { - margin-bottom: 1rem ; + margin-bottom: 0.3rem ; + margin-top: 0.3rem ; } .mb-4 { - margin-bottom: 1.5rem ; + margin-bottom: 0.4rem ; + margin-top: 0.4rem ; } .mb-5 { - margin-bottom: 3rem ; + margin-bottom: 0.5rem ; + margin-top: 0.5rem ; } .mb-auto { margin-bottom: auto ; + margin-top: auto ; } .ms-0 { @@ -9559,57 +9558,57 @@ fieldset:disabled .btn { /* rtl:end:remove */ .text-primary { --text-opacity: 1; - color: rgba(var(--primary-rgb), var(--text-opacity)) ; + color: rgba(var(--primary-rgb, 1,1,86), var(--text-opacity)) ; } .text-secondary { --text-opacity: 1; - color: rgba(var(--secondary-rgb), var(--text-opacity)) ; + color: rgba(var(--secondary-rgb, 72,82,93), var(--text-opacity)) ; } .text-success { --text-opacity: 1; - color: rgba(var(--success-rgb), var(--text-opacity)) ; + color: rgba(var(--success-rgb, 74,166,100), var(--text-opacity)) ; } .text-info { --text-opacity: 1; - color: rgba(var(--info-rgb), var(--text-opacity)) ; + color: rgba(var(--info-rgb, 79,122,160), var(--text-opacity)) ; } .text-warning { --text-opacity: 1; - color: rgba(var(--warning-rgb), var(--text-opacity)) ; + color: rgba(var(--warning-rgb, 199,122,0), var(--text-opacity)) ; } .text-danger { --text-opacity: 1; - color: rgba(var(--danger-rgb), var(--text-opacity)) ; + color: rgba(var(--danger-rgb, 194,58,49), var(--text-opacity)) ; } .text-light { --text-opacity: 1; - color: rgba(var(--light-rgb), var(--text-opacity)) ; + color: rgba(var(--light-rgb, 27,32,39), var(--text-opacity)) ; } .text-dark { --text-opacity: 1; - color: rgba(var(--dark-rgb), var(--text-opacity)) ; + color: rgba(var(--dark-rgb, 15,19,24), var(--text-opacity)) ; } .text-black { --text-opacity: 1; - color: rgba(var(--black-rgb), var(--text-opacity)) ; + color: rgba(var(--black-rgb, 0, 0, 0), var(--text-opacity)) ; } .text-white { --text-opacity: 1; - color: rgba(var(--white-rgb), var(--text-opacity)) ; + color: rgba(var(--white-rgb, 255, 255, 255), var(--text-opacity)) ; } .text-body { --text-opacity: 1; - color: rgba(var(--body-color-rgb), var(--text-opacity)) ; + color: rgba(var(--body-color-rgb, 230, 235, 241), var(--text-opacity)) ; } .text-muted { @@ -9629,7 +9628,6 @@ fieldset:disabled .btn { .text-reset { --text-opacity: 1; - color: inherit ; } .text-opacity-25 { @@ -9650,57 +9648,57 @@ fieldset:disabled .btn { .bg-primary { --bg-opacity: 1; - background-color: rgba(var(--primary-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--primary-rgb, 1,1,86), var(--bg-opacity, 1)) ; } .bg-secondary { --bg-opacity: 1; - background-color: rgba(var(--secondary-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--secondary-rgb, 72,82,93), var(--bg-opacity, 1)) ; } .bg-success { --bg-opacity: 1; - background-color: rgba(var(--success-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--success-rgb, 74,166,100), var(--bg-opacity, 1)) ; } .bg-info { --bg-opacity: 1; - background-color: rgba(var(--info-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--info-rgb, 79,122,160), var(--bg-opacity, 1)) ; } .bg-warning { --bg-opacity: 1; - background-color: rgba(var(--warning-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--warning-rgb, 199,122,0), var(--bg-opacity, 1)) ; } .bg-danger { --bg-opacity: 1; - background-color: rgba(var(--danger-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--danger-rgb, 194,58,49), var(--bg-opacity, 1)) ; } .bg-light { --bg-opacity: 1; - background-color: rgba(var(--light-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--light-rgb, 27,32,39), var(--bg-opacity, 1)) ; } .bg-dark { --bg-opacity: 1; - background-color: rgba(var(--dark-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--dark-rgb, 15,19,24), var(--bg-opacity, 1)) ; } .bg-black { --bg-opacity: 1; - background-color: rgba(var(--black-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--black-rgb, 0, 0, 0), var(--bg-opacity, 1)) ; } .bg-white { --bg-opacity: 1; - background-color: rgba(var(--white-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--white-rgb, 255, 255, 255), var(--bg-opacity, 1)) ; } .bg-body { --bg-opacity: 1; - background-color: rgba(var(--body-bg-rgb), var(--bg-opacity)) ; + background-color: rgba(var(--body-bg-rgb, 14, 19, 24), var(--bg-opacity, 1)) ; } .bg-transparent { @@ -9729,7 +9727,7 @@ fieldset:disabled .btn { } .bg-gradient { - background-image: var(--gradient) ; + background-image: var(--gradient, none) ; } .user-select-all { @@ -9761,7 +9759,7 @@ fieldset:disabled .btn { } .rounded { - border-radius: var(--border-radius) ; + border-radius: var(--border-radius, .25rem) ; } .rounded-0 { @@ -9769,19 +9767,19 @@ fieldset:disabled .btn { } .rounded-1 { - border-radius: var(--border-radius-sm) ; + border-radius: var(--border-radius-sm, .2rem) ; } .rounded-2 { - border-radius: var(--border-radius) ; + border-radius: var(--border-radius, .25rem) ; } .rounded-3 { - border-radius: var(--border-radius-lg) ; + border-radius: var(--border-radius-lg, .3rem) ; } .rounded-4 { - border-radius: var(--border-radius-xl) ; + border-radius: var(--border-radius-xl, .3rem) ; } .rounded-5 { @@ -9793,27 +9791,27 @@ fieldset:disabled .btn { } .rounded-pill { - border-radius: var(--border-radius-pill) ; + border-radius: var(--border-radius-pill, 50rem) ; } .rounded-top { - border-top-left-radius: var(--border-radius) ; - border-top-right-radius: var(--border-radius) ; + border-top-left-radius: var(--border-radius, .25rem) ; + border-top-right-radius: var(--border-radius, .25rem) ; } .rounded-end { - border-top-right-radius: var(--border-radius) ; - border-bottom-right-radius: var(--border-radius) ; + border-top-right-radius: var(--border-radius, .25rem) ; + border-bottom-right-radius: var(--border-radius, .25rem) ; } .rounded-bottom { - border-bottom-right-radius: var(--border-radius) ; - border-bottom-left-radius: var(--border-radius) ; + border-bottom-right-radius: var(--border-radius, .25rem) ; + border-bottom-left-radius: var(--border-radius, .25rem) ; } .rounded-start { - border-bottom-left-radius: var(--border-radius) ; - border-top-left-radius: var(--border-radius) ; + border-bottom-left-radius: var(--border-radius, .25rem) ; + border-top-left-radius: var(--border-radius, .25rem) ; } .visible { @@ -13556,7 +13554,7 @@ span.minicolors-swatch-color { } html { - background-color: var(--body-bg); + background-color: var(--body-bg, #0e1318); } body { @@ -13606,7 +13604,7 @@ h6, } a { - color: var(--color-link); + color: var(--color-link, white); } a:not([class]) { @@ -13623,8 +13621,8 @@ a.navbar-brand { } .btn-primary { - background-color: var(--color-primary); - border-color: var(--color-primary); + background-color: var(--color-primary, #112855); + border-color: var(--color-primary, #112855); } .btn-primary:active, @@ -13680,7 +13678,7 @@ th dd { } [data-bs-theme='dark'] .com-contact__thumbnail { - background-color: var(--nav-text-color); + background-color: var(--nav-text-color, gray); } @media (min-width: 1200px) { @@ -13783,11 +13781,11 @@ meter { } .page-link { - color: var(--color-link); + color: var(--color-link, white); } .page-link:active { - color: var(--color-link); + color: var(--color-link, white); } .pager .pagination { @@ -13857,7 +13855,7 @@ meter { padding: 0.5em; color: var(--color-primary, hsl(220, 67%, 20%)); pointer-events: all; - background-color: var(--white, var(--body-color)); + background-color: var(--white, var(--body-color, #e6ebf1)); border: 1px solid var(--color-primary, hsl(220, 67%, 20%)); border-radius: 0.25rem; opacity: 0; @@ -13872,9 +13870,9 @@ meter { .back-to-top-link:active, .back-to-top-link:focus { - color: var(--white, var(--body-color)); + color: var(--white, var(--body-color, #e6ebf1)); background-color: var(--color-active); - border-color: var(--white, var(--body-color)); + border-color: var(--white, var(--body-color, #e6ebf1)); } .container-banner img { @@ -13883,35 +13881,28 @@ meter { } .container-banner .banner-overlay { - height: var(--hero-height, 70vh); - color: var(--hero-color, var(--body-color)); + height: var(--hero-height, 60vh); + color: var(--hero-color, var(--body-color, #e6ebf1)); background-repeat: var(--hero-bg-repeat, no-repeat); background-attachment: var(--hero-bg-attachment, fixed); background-position: var(--hero-bg-position, top center); background-size: var(--hero-bg-size, cover); - border-bottom: var(--hero-border-bottom, solid var(--accent-color-secondary)); + border-bottom: var(--hero-border-bottom, solid var(--accent-color-secondary, #6fb3ff)); } /* Legacy: standard Cassiopeia banner with an explicit .overlay child */ .container-banner .banner-overlay .overlay { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; flex-direction: column; - -webkit-box-align: center; - -ms-flex-align: center; align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; justify-content: center; height: 100%; - padding: var(--hero-overlay-padding, 1em); text-align: var(--hero-overlay-text-align, center); - color: var(--hero-overlay-text-color, var(--body-color)); + color: var(--hero-overlay-text-color, var(--body-color, #e6ebf1)); background-color: var(--hero-overlay-bg, hsla(0, 0%, 0%, 0.5)); + background-position: var(--hero-overlay-bg-position, center); + background-size: var(--hero-overlay-bg-size, cover); + background-repeat: no-repeat; } /* Hero layout (hero.php): outer wrapper — visual overlay is handled by the .overlay child */ @@ -13929,7 +13920,7 @@ meter { height: 4px; margin: 1rem auto 2rem; content: ""; - background: var(--body-color); + background: var(--body-color, #e6ebf1); } .container-banner .banner-overlay .overlay .text-thin .lead { @@ -13942,46 +13933,91 @@ meter { } } -/* ── HERO VARIANT BASE ── */ +/* ── HERO CARD BASE ── */ .hero { + max-width: var(--hero-card-max-width, 600px); + padding: var(--hero-card-padding-y, 3rem) var(--hero-card-padding-x, 2rem); + background-color: var(--hero-card-bg, var(--hero-primary-bg-color, #0d1e3a)); + background-image: var(--hero-card-overlay, none); background-size: cover; background-position: center; - overflow: hidden; - border-radius: .5rem; + color: var(--hero-card-color, var(--hero-primary-color, #f1f5f9)); + border-radius: var(--hero-card-border-radius, .5rem); } -/* ── PRIMARY VARIANT ── */ +/* ── PRIMARY VARIANT (uses default card vars) ── */ .hero#primary { - background-color: var(--hero-primary-bg-color); - background-image: var(--hero-primary-overlay); - color: var(--hero-primary-color); + background-color: var(--hero-card-bg, #0d1e3a); + background-image: var(--hero-card-overlay, none); + color: var(--hero-card-color, #f1f5f9); } -/* ── SECONDARY VARIANT ── */ +/* ── SECONDARY / ALTERNATIVE VARIANT ── */ .hero#secondary { - background-color: var(--hero-secondary-bg-color); - background-image: var(--hero-secondary-overlay); - color: var(--hero-secondary-color); + max-width: var(--hero-alt-card-max-width, 600px); + padding: var(--hero-alt-card-padding-y, 3rem) var(--hero-alt-card-padding-x, 2rem); + background-color: var(--hero-alt-card-bg, #080f1e); + background-image: var(--hero-alt-card-overlay, none); + color: var(--hero-alt-card-color, #f1f5f9); + border-radius: var(--hero-alt-card-border-radius, .5rem); +} + +/* ── HERO MOBILE: hide photo bg, full-bleed card ── */ +@media (max-width: 767.98px) { + .container-banner .banner-overlay { + height: auto; + background-image: none !important; + background-attachment: scroll; + border-bottom: none; + } + .container-banner .banner-overlay .overlay { + background-color: transparent; + background-image: none; + } + .hero { + max-width: 100%; + width: 100%; + min-height: 100vh; + min-height: 100dvh; + border-radius: 0; + display: flex; + flex-direction: column; + justify-content: center; + } } .footer { margin-top: 1em; - color: var(--body-color); - background: var(--color-primary); + color: var(--body-bg, #e6ebf1); + background-color: var(--nav-bg-color); + padding-left: 100px; + padding-right: 60px; + padding-bottom: 60px; +} + +/* Increase footer right padding when floating controls are present */ +body[data-theme-fab-enabled="1"] .footer { + padding-right: 220px; +} + +body[data-theme-fab-enabled="1"][data-a11y-toolbar="1"] .footer { + padding-right: 420px; } .footer .grid-child { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + width: 100%; padding: 2.5rem 0.5em; } .footer a { - color: currentColor; + color: var(--mainmenu-nav-link-color, #fff); } .footer .mod-menu { @@ -13989,7 +14025,7 @@ meter { } .footer .metismenu.mod-menu .mm-collapse { - background: var(--color-primary); + background: var(--color-primary, #112855); } @media (max-width: 991.98px) { @@ -14084,7 +14120,7 @@ td .form-control { margin: 0.5em; color: hsl(0, 0%, 0%); text-align: start; - background: var(--body-color); + background: var(--body-color, #e6ebf1); border: 1px solid hsl(210, 7%, 46%); border-radius: 0.25rem; -webkit-box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.8); @@ -14168,39 +14204,42 @@ fieldset>* { right: 0; left: auto; z-index: 900; - color: var(--color-link); + color: var(--color-link, white); background-color: rgba(255, 255, 255, 0.5); border: 1px solid #58595a; border-radius: 0.25rem; + --btn-padding-x: 0.25rem; + --btn-padding-y: 0.1rem; } .container-header { - position: relative; z-index: 100; - background: var(--header-background-image); - background-size: var(--header-background-size); - -webkit-box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; + background: var(--header-background-image, url('../../../../../../media/templates/site/mokocassiopeia/images/bg.svg')); + background-size: var(--header-background-size, auto); box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; - background-repeat: var(--header-background-repeat); + background-repeat: var(--header-background-repeat, repeat); } +/* Sticky header: override z-index to stay above all content */ +.container-header.sticky-top { + z-index: 1020; +} + +/* Disable sticky on mobile — full-width header works better as static */ @media (max-width: 991.98px) { - .container-header { - position: relative ; + .container-header.sticky-top { + position: relative; + z-index: 100; } } .container-header .grid-child { - padding: var(--padding-x) var(--padding-y); -} - -.container-header nav { - padding: 0 2rem; + padding: var(--padding-x, 0.15rem) var(--padding-y, 0.15rem); } .container-header .site-description { font-size: 1rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); white-space: normal; } @@ -14223,13 +14262,13 @@ fieldset>* { padding-top: 0.3125rem; padding-bottom: 0.3125rem; font-size: 2rem; - color: var(--nav-text-color); + color: var(--nav-text-color, gray); -webkit-margin-end: auto; margin-inline-end: auto; } .container-header .navbar-brand a { - color: var(--nav-text-color); + color: var(--nav-text-color, gray); } .navbar-brand img { @@ -14241,7 +14280,17 @@ fieldset>* { .container-header .navbar-brand:active, .container-header .navbar-brand:focus { - color: var(--nav-text-color); + color: var(--nav-text-color, gray); +} + +.container-header .container-nav a { + color: var(--mainmenu-nav-link-color, #fff); + text-decoration: none; +} + +.container-header .container-nav a:hover, +.container-header .container-nav a:focus { + color: var(--link-hover-color, #c3d6ff); } .container-header .container-nav { @@ -14251,9 +14300,9 @@ fieldset>* { -ms-flex-pack: justify; justify-content: space-between; background-color: var(--nav-bg-color); - border-width: var(--border-width); - border-top: solid var(--accent-color-primary); - border-bottom: solid var(--accent-color-secondary); + border-width: var(--border-width, 1px); + border-top: solid var(--accent-color-primary, #3f8ff0); + border-bottom: solid var(--accent-color-secondary, #6fb3ff); border-left: none; border-right: none; } @@ -14285,7 +14334,7 @@ fieldset>* { flex: 1 0 100%; padding: 0; margin: 0; - color: var(--mainmenu-nav-link-color); + color: var(--mainmenu-nav-link-color, #fff); list-style: none; font-size: 1.2em; } @@ -14321,12 +14370,21 @@ li.current a { } .container-header .mod-menu>li>a, -.container-header .mod-menu>li>span { +.container-header .mod-menu>li>span, +.container-header .nav-link, +.container-header .mod-menu-main__link { position: relative; - color: var(--mainmenu-nav-link-color); + color: var(--mainmenu-nav-link-color, #fff); text-decoration: none; } +.container-header .nav-link:hover, +.container-header .nav-link:focus, +.container-header .mod-menu-main__link:hover, +.container-header .mod-menu-main__link:focus { + color: var(--link-hover-color, #c3d6ff); +} + @media (min-width: 992px) { .container-header .mod-menu>li::after { position: absolute; @@ -14420,40 +14478,45 @@ li.current a { } .container-header .navbar-toggler { - color: var(--body-color); + color: var(--mainmenu-nav-link-color, #fff); + border-color: var(--mainmenu-nav-link-color, #fff); + font-size: 1.25rem; cursor: pointer; } .container-header .container-search { margin-top: 0.75em; + width: 100%; } -.container-header .mod-finder { - color: var(--body-color); +.container-header .container-search .mod-finder, +.container-header .container-search .mod-finder__form, +.container-header .container-search .mod-finder__search { + width: 100%; +} + +.container-header .mod-finder, .container-header .mod-finder a, .container-header .mod-finder form { + color: var(--mainmenu-nav-link-color, #e6ebf1); margin-block-end: 0; } -.container-header .mod-finder a { - color: var(--body-color); -} - .container-header .mod-finder a:active, .container-header .mod-finder a:focus { - color: var(--mod-finder-link-hover); + color: var(--mod-finder-link-hover, #5a6470); } .container-header .mod-finder .awesomplete { - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .container-header .mod-finder .awesomplete>ul { - background: -webkit-gradient(linear, left top, right bottom, from(var(--body-color)), to(hsla(0, 0%, 100%, 0.9))); - background: -o-linear-gradient(top left, var(--body-color), hsla(0, 0%, 100%, 0.9)); - background: linear-gradient(to bottom right, var(--body-color), hsla(0, 0%, 100%, 0.9)); + background: -webkit-gradient(linear, left top, right bottom, from(var(--body-color, #e6ebf1)), to(hsla(0, 0%, 100%, 0.9))); + background: -o-linear-gradient(top left, var(--body-color, #e6ebf1), hsla(0, 0%, 100%, 0.9)); + background: linear-gradient(to bottom right, var(--body-color, #e6ebf1), hsla(0, 0%, 100%, 0.9)); } .icon-white { - color: var(--body-bg); + color: var(--body-bg, #0e1318); } .input-group-text::before { @@ -14522,7 +14585,7 @@ li.current a { } .plg_system_webauthn_login_button svg path { - fill: var(--black); + fill: var(--black, #000); } iframe { @@ -14545,6 +14608,164 @@ iframe { position: relative; } +/* ── MODULE TITLES ── */ +/* Shared styles for module titles rendered by MokoCassiopeia overrides */ +[class*="__title"] { + margin-top: 0; + margin-bottom: .75rem; + font-weight: 600; + color: var(--body-color, #212529); + line-height: 1.3; +} + +/* ── MODULE: Statistics ── */ +.mod-stats__list { + margin: 0; + padding: 0; +} + +.mod-stats__label { + font-weight: 600; + margin-bottom: 0; +} + +.mod-stats__data { + margin-left: 0; + margin-bottom: .5rem; + color: var(--body-font-color, #666); +} + +/* Article list modules */ +.mod-articles-latest__list, +.mod-articles-popular__list, +.mod-articles-category__list, +.mod-related-items__list, +.mod-tags-similar__list { + list-style: none; + padding-left: 0; + margin-bottom: 0; +} + +.mod-articles-latest__item, +.mod-articles-popular__item, +.mod-articles-category__item, +.mod-related-items__item, +.mod-tags-similar__item { + padding: .4rem 0; + border-bottom: 1px solid var(--border-color, #dee2e6); +} + +.mod-articles-latest__item:last-child, +.mod-articles-popular__item:last-child, +.mod-articles-category__item:last-child, +.mod-related-items__item:last-child, +.mod-tags-similar__item:last-child { + border-bottom: 0; +} + +.mod-articles-latest__item a, +.mod-articles-popular__item a, +.mod-articles-category__link, +.mod-related-items__item a, +.mod-tags-similar__item a { + text-decoration: none; + color: var(--link-color, #0d6efd); +} + +.mod-articles-latest__item a:hover, +.mod-articles-popular__item a:hover, +.mod-articles-category__link:hover, +.mod-related-items__item a:hover, +.mod-tags-similar__item a:hover { + color: var(--link-hover-color, #0a58ca); + text-decoration: underline; +} + +/* Article category module extras */ +.mod-articles-category__date, +.mod-related-items__date { + display: block; + font-size: .85em; + color: var(--secondary-color, #6c757d); +} + +.mod-articles-category__author { + font-size: .85em; + color: var(--secondary-color, #6c757d); +} + +.mod-articles-category__intro, +.mod-articles-news__intro { + margin-top: .25rem; + font-size: .9em; + color: var(--body-color, #212529); +} + +.mod-articles-category__readmore, +.mod-articles-news__readmore { + display: inline-block; + margin-top: .25rem; + font-size: .85em; + font-weight: 600; +} + +/* Newsflash module */ +.mod-articles-news__item { + padding: .75rem 0; + border-bottom: 1px solid var(--border-color, #dee2e6); +} + +.mod-articles-news__item:last-child { + border-bottom: 0; +} + +.mod-articles-news__item-title { + margin-bottom: .25rem; + font-size: 1.1em; +} + +/* Tags module */ +.mod-tags-popular__tag { + font-size: .85rem; + transition: background-color .15s ease; +} + +.mod-tags-popular__tag:hover { + filter: brightness(1.15); +} + +/* Search / Finder module */ +.mod-finder__form .input-group { + border-radius: var(--border-radius, .25rem); +} + +/* Login module */ +.mod-login__greeting { + margin-bottom: 1rem; + font-weight: 500; +} + +.mod-login__options { + margin-top: .5rem; +} + +.mod-login__options li + li { + margin-top: .25rem; +} + +/* Breadcrumbs module */ +.mod-breadcrumbs .breadcrumb { + background: transparent; + padding: 0; + margin-bottom: 0; +} + +/* Footer module */ +.mod-footer__content { + font-size: .9em; + color: var(--secondary-color, #6c757d); +} + /* HERO CONTAINER */ .hero-overlay { position: relative; @@ -14597,8 +14818,8 @@ iframe { position: relative; z-index: 0; - border-top: var(--border-width) var(--border-style) var(--accent-color-primary); - border-bottom: var(--border-width) var(--border-style) var(--accent-color-secondary); + border-top: var(--border-width, 1px) var(--border-style, solid) var(--accent-color-primary, #3f8ff0); + border-bottom: var(--border-width, 1px) var(--border-style, solid) var(--accent-color-secondary, #6fb3ff); background-color: rgba(111, 117, 123, 0.55); background-image: linear-gradient( @@ -14609,12 +14830,12 @@ iframe { } .container-topbar { - color: var(--body-color); - background-color: var(--color-primary); + color: var(--body-color, #e6ebf1); + background-color: var(--color-primary, #112855); } .container-topbar a { - color: var(--body-color) ; + color: var(--body-color, #e6ebf1) ; } @@ -14676,14 +14897,14 @@ iframe { .container-bottom-a > .card:nth-child(2), .container-bottom-b > .card:nth-child(2) { background-color: var(--block-color-2); - color: var(--block-text-2); + color: var(--block-text-2, #fff); } .container-top-a > .card:nth-child(3), .container-top-b > .card:nth-child(3), .container-bottom-a > .card:nth-child(3), .container-bottom-b > .card:nth-child(3) { - background-color: var(--block-color-3); + background-color: var(--block-color-3, rgba(238, 194, 52, .15)); color: var(--block-text-3); } @@ -14691,7 +14912,7 @@ iframe { .container-top-b > .card:nth-child(4), .container-bottom-a > .card:nth-child(4), .container-bottom-b > .card:nth-child(4) { - background-color: var(--block-color-4); + background-color: var(--block-color-4, rgba(74, 166, 100, .15)); color: var(--block-text-4); } @@ -14701,7 +14922,7 @@ iframe { .container-bottom-a #block-highlight, .container-bottom-b #block-highlight { background-color: var(--block-highlight-bg); - color: var(--block-highlight-text); + color: var(--block-highlight-text, #fff); } .container-top-a #block-cta, @@ -14709,7 +14930,7 @@ iframe { .container-bottom-a #block-cta, .container-bottom-b #block-cta { background-color: var(--block-cta-bg); - color: var(--block-cta-text); + color: var(--block-cta-text, #f1f5f9); } .container-top-a #block-alert, @@ -14717,7 +14938,7 @@ iframe { .container-bottom-a #block-alert, .container-bottom-b #block-alert { background-color: var(--block-alert-bg); - color: var(--block-alert-text); + color: var(--block-alert-text, #fff); } .container-component nav { @@ -14809,9 +15030,9 @@ iframe { width: 100%; padding: 1vw 2vw; margin-bottom: 1rem; - color: var(--form-legend-color); - background-color: var(--body-color); - border: 1px solid var(--border-gray); + color: var(--form-legend-color, #9fa6ad); + background-color: var(--body-color, #e6ebf1); + border: 1px solid var(--border-gray, #3a4250); } .options-form>legend { @@ -14819,8 +15040,8 @@ iframe { width: auto; padding: 0 0.5rem; font-weight: 700; - color: var(--form-legend-color); - background-color: var(--body-color); + color: var(--form-legend-color, #9fa6ad); + background-color: var(--body-color, #e6ebf1); } .modal .btn { @@ -14829,12 +15050,12 @@ iframe { .modal .btn-primary:not([href]), .modal .btn-success:not([href]) { - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .modal .btn-primary:not([href]):active, .modal .btn-success:not([href]):active { - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .modal-header { @@ -14937,6 +15158,11 @@ iframe { } } +/* Hide empty system message container */ +#system-message-container:empty { + display: none; +} + .blog-items { display: -webkit-box; display: -ms-flexbox; @@ -14968,6 +15194,10 @@ iframe { text-align: right; } +.blog-items .readmore a { + width: 100%; +} + .blog-item { display: -webkit-box; display: -ms-flexbox; @@ -14976,17 +15206,31 @@ iframe { -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; + -webkit-box-flex: 1; + -ms-flex: 1 1 0%; + flex: 1 1 0%; + height: 100%; padding: 0 0.5em 1em; overflow: hidden; } +.blog-item .item-content { + display: flex; + flex-direction: column; + flex: 1; +} + +.blog-item .readmore { + margin-top: auto; +} + .boxed .blog-item { background-color: var(--bs-body-bg); } .boxed .blog-item figure.item-image { - border-top: solid 0.25em var(--accent-color-primary); - border-bottom: solid 0.25em var(--accent-color-secondary); + border-top: solid 0.25em var(--accent-color-primary, #3f8ff0); + border-bottom: solid 0.25em var(--accent-color-secondary, #6fb3ff); } .boxed .blog-item .item-content { @@ -14997,7 +15241,11 @@ iframe { margin-top: 0.1875rem; margin-bottom: 0.9375rem; overflow: hidden; - max-height: 500px; + max-height: 250px; +} + +.blog-item .item-image img{ + width: 100%; } .boxed .blog-item .item-image { @@ -15206,7 +15454,7 @@ ul.tags { } .mod-list li { - padding: 0.25em 0; + padding: 0.25em 0.5rem; } .mod-list li a { @@ -15272,10 +15520,10 @@ joomla-alert { width: auto; min-height: 43px; padding: 0.25rem; - color: var(--subhead-color); - background: var(--body-color); - -webkit-box-shadow: -3px -2px 22px var(--box-shadow-gray); - box-shadow: -3px -2px 22px var(--box-shadow-gray); + color: var(--subhead-color, #9fa6ad); + background: var(--body-color, #e6ebf1); + -webkit-box-shadow: -3px -2px 22px var(--box-shadow-gray, #1a2027); + box-shadow: -3px -2px 22px var(--box-shadow-gray, #1a2027); } .subhead .row { @@ -15309,13 +15557,13 @@ joomla-alert { } .subhead .btn { - --subhead-btn-accent: var(--subhead-color); + --subhead-btn-accent: var(--subhead-color, #9fa6ad); padding: 0 1rem; margin: 0.3125rem 0; font-size: 1rem; line-height: 2.45rem; - color: var(--subhead-color); - background: var(--body-color); + color: var(--subhead-color, #9fa6ad); + background: var(--body-color, #e6ebf1); border-color: hsl(210, 11%, 71%); } @@ -15339,11 +15587,11 @@ joomla-alert { } .subhead .btn.btn-success { - --subhead-btn-accent: var(--success); + --subhead-btn-accent: var(--success, #4aa664); } .subhead .btn.btn-danger { - --subhead-btn-accent: var(--danger); + --subhead-btn-accent: var(--danger, #c23a31); } .subhead .btn.btn-primary { @@ -15506,8 +15754,8 @@ body.wrapper-fluid .grid-child { body.wrapper-fluid header>.grid-child, body.wrapper-fluid footer>.grid-child { - padding-right: 2em; - padding-left: 2em; + padding-right: var(--navbar-padding-x, 1rem); + padding-left: var(--navbar-padding-x, 1rem); padding-top: 0; padding-bottom: 0; } @@ -15597,6 +15845,37 @@ body:not(.has-sidebar-right) .site-grid .container-component { grid-area: side-r; } +/* Sidebar accordion */ +.container-sidebar-left.accordion .card, +.container-sidebar-right.accordion .card { + border: none; + border-bottom: 1px solid var(--border-color, #dee2e6); + border-radius: 0; +} + +.container-sidebar-left.accordion .card-header, +.container-sidebar-right.accordion .card-header { + padding: 0; + background: none; + border: none; +} + +.container-sidebar-left.accordion .accordion-button, +.container-sidebar-right.accordion .accordion-button { + padding: .75rem 1rem; + font-weight: 600; + font-size: .95rem; + background: var(--bs-body-bg, #fff); + color: var(--body-font-color, #444); +} + +.container-sidebar-left.accordion .accordion-button:not(.collapsed), +.container-sidebar-right.accordion .accordion-button:not(.collapsed) { + background: var(--bs-body-bg, #fff); + color: var(--link-color, #3565e5); + box-shadow: none; +} + .container-main-top { grid-area: main-t; } @@ -15670,14 +15949,14 @@ body:not(.has-sidebar-right) .site-grid .container-component { .btn-secondary { color: var(--btn-color); - background-color: var(--btn-bg); - border-color: var(--btn-border-color); + background-color: var(--btn-bg, transparent); + border-color: var(--btn-border-color, transparent); } .btn-secondary:active { color: var(--btn-active-color); - background-color: var(--btn-active-bg); - border-color: var(--btn-active-border-color); + background-color: var(--btn-active-bg, hsl(210, 10%, 30%)); + border-color: var(--btn-active-border-color, transparent); } .btn-secondary:focus, @@ -15685,20 +15964,20 @@ body:not(.has-sidebar-right) .site-grid .container-component { color: var(--btn-focus-color); background-color: var(--btn-focus-bg); border-color: var(--btn-focus-border-color); - box-shadow: 1px 5px 100px 1px var(--btn-focus-shadow-rgb); + box-shadow: 1px 5px 100px 1px var(--btn-focus-shadow-rgb, 84, 114, 255); } .btn-secondary:active { color: var(--btn-active-color); - background-color: var(--btn-active-bg); - border-color: var(--btn-active-border-color); + background-color: var(--btn-active-bg, hsl(210, 10%, 30%)); + border-color: var(--btn-active-border-color, transparent); box-shadow: 1px 5px 100px 1px var(--btn-active-shadow-rgb); } .article-info .association .btn-secondary, .cat-list-association .btn-secondary { font-weight: 700; - color: var(--body-color); + color: var(--body-color, #e6ebf1); background-color: hsl(210, 7%, 46%); border-color: hsl(210, 14%, 83%); } @@ -15707,7 +15986,7 @@ body:not(.has-sidebar-right) .site-grid .container-component { .article-info .association .btn-secondary:focus, .cat-list-association .btn-secondary:active, .cat-list-association .btn-secondary:focus { - color: var(--body-color); + color: var(--body-color, #e6ebf1); background-color: hsl(210, 10%, 23%); } @@ -15743,7 +16022,7 @@ body:not(.has-sidebar-right) .site-grid .container-component { .form-select:focus, .custom-select:focus { - border-color: var(--black); + border-color: var(--black, #000); -webkit-box-shadow: 0 0 0 0.25rem rgba(1, 1, 86, 0.25); box-shadow: 0 0 0 0.25rem rgba(1, 1, 86, 0.25); } @@ -15751,19 +16030,19 @@ body:not(.has-sidebar-right) .site-grid .container-component { .form-select[multiple], [multiple].custom-select { padding: 0; - background-color: var(--body-color); + background-color: var(--body-color, #e6ebf1); } .form-select[multiple] option, [multiple].custom-select option { padding: 0.3rem 1rem; - background-color: var(--body-color); + background-color: var(--body-color, #e6ebf1); } .form-select[multiple] option:checked, [multiple].custom-select option:checked { - color: var(--body-color); - background-color: var(--color-primary) ; + color: var(--body-color, #e6ebf1); + background-color: var(--color-primary, #112855) ; } .form-select.form-select-success, @@ -15779,7 +16058,7 @@ body:not(.has-sidebar-right) .site-grid .container-component { .form-select.custom-select-success option, .custom-select-success.custom-select option { color: hsl(210, 11%, 15%); - background-color: var(--body-color); + background-color: var(--body-color, #e6ebf1); } .form-select.form-select-danger, @@ -15795,15 +16074,15 @@ body:not(.has-sidebar-right) .site-grid .container-component { .form-select.custom-select-danger option, .custom-select-danger.custom-select option { color: hsl(210, 11%, 15%); - background-color: var(--body-color); + background-color: var(--body-color, #e6ebf1); } .form-select optgroup, .custom-select optgroup, .form-select option, .custom-select option { - color: var(--dark); - background-color: var(--body-color); + color: var(--dark, #0f1318); + background-color: var(--body-color, #e6ebf1); } .accordion .card-header { @@ -15814,13 +16093,13 @@ body:not(.has-sidebar-right) .site-grid .container-component { } .accordion .list-group-item { - color: var(--color-link); + color: var(--color-link, white); } .dropdown-menu { padding: 0.2rem 0; margin-top: 0.5rem; - background-color: var(--body-color); + background-color: var(--body-color, #e6ebf1); border-color: hsl(210, 14%, 89%); } @@ -15847,7 +16126,7 @@ body:not(.has-sidebar-right) .site-grid .container-component { } .list-group-item { - background-color: var(--body-color); + background-color: var(--body-color, #e6ebf1); } .list-unstyled .list-unstyled { @@ -15955,8 +16234,8 @@ body:not(.has-sidebar-right) .site-grid .container-component { border: 1px solid hsl(210, 14%, 89%); border-bottom: 0; border-radius: 0.25rem 0.25rem 0 0; - -webkit-box-shadow: 0 1px var(--body-color) inset, 0 2px 3px -3px hsla(0, 0%, 0%, 0.15), 0 -4px 0 hsla(0, 0%, 0%, 0.05) inset, 1px 1px 4px hsla(0, 0%, 0%, 0.1); - box-shadow: 0 1px var(--body-color) inset, 0 2px 3px -3px hsla(0, 0%, 0%, 0.15), 0 -4px 0 hsla(0, 0%, 0%, 0.05) inset, 1px 1px 4px hsla(0, 0%, 0%, 0.1); + -webkit-box-shadow: 0 1px var(--body-color, #e6ebf1) inset, 0 2px 3px -3px hsla(0, 0%, 0%, 0.15), 0 -4px 0 hsla(0, 0%, 0%, 0.05) inset, 1px 1px 4px hsla(0, 0%, 0%, 0.1); + box-shadow: 0 1px var(--body-color, #e6ebf1) inset, 0 2px 3px -3px hsla(0, 0%, 0%, 0.15), 0 -4px 0 hsla(0, 0%, 0%, 0.05) inset, 1px 1px 4px hsla(0, 0%, 0%, 0.1); } .nav.nav-tabs .nav-item { @@ -15983,7 +16262,7 @@ body:not(.has-sidebar-right) .site-grid .container-component { .nav.nav-tabs .nav-link { position: relative; padding: 0.75em 1em; - color: var(--color-primary); + color: var(--color-primary, #112855); border: 0; border-top-left-radius: 0; border-top-right-radius: 0; @@ -16011,13 +16290,13 @@ body:not(.has-sidebar-right) .site-grid .container-component { left: 0; height: 5px; content: ""; - background-color: var(--color-primary); + background-color: var(--color-primary, #112855); opacity: 0.8; } .nav-tabs+.tab-content { padding: 0.9375rem; - background: var(--body-color); + background: var(--body-color, #e6ebf1); border: 1px solid; border-color: hsl(210, 14%, 89%); border-radius: 0 0 0.25rem 0.25rem; @@ -16078,7 +16357,7 @@ body:not(.has-sidebar-right) .site-grid .container-component { } .chosen-container.chosen-container-single .chosen-single:focus { - border-color: var(--input-focus-border-color); + border-color: var(--input-focus-border-color, #5472ff); outline: none; } @@ -16092,7 +16371,7 @@ body:not(.has-sidebar-right) .site-grid .container-component { } .chosen-container.chosen-container-single .chosen-drop { - background: var(--body-color); + background: var(--body-color, #e6ebf1); border: 1px solid hsl(210, 14%, 83%); } @@ -16110,13 +16389,13 @@ body:not(.has-sidebar-right) .site-grid .container-component { min-height: calc(1.5em + 1.2rem + 2px); font-size: 1rem; line-height: 1.5; - background-image: var(--body-color); + background-image: var(--body-color, #e6ebf1); } .chosen-container.chosen-container-multi .chosen-choices li.search-choice { padding: 0.3125rem 2.0625rem 0.3125rem 0.625rem; - color: var(--body-color); - background: var(--primary); + color: var(--body-color, #e6ebf1); + background: var(--primary, #010156); border: 0; -webkit-box-shadow: 1px 1px 4px hsla(0, 0%, 0%, 0.1); box-shadow: 1px 1px 4px hsla(0, 0%, 0%, 0.1); @@ -16137,7 +16416,7 @@ body:not(.has-sidebar-right) .site-grid .container-component { top: 6px; right: 5px; font-size: 1rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); content: "×"; } @@ -16174,7 +16453,16 @@ body:not(.has-sidebar-right) .site-grid .container-component { display: table-cell; } -.metismenu.menu-horizontal { +.menu-horizontal { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -ms-flex-wrap: wrap; + flex-wrap: wrap; -webkit-box-flex: 1; -ms-flex: 1 0 100%; flex: 1 0 100%; @@ -16184,28 +16472,19 @@ body:not(.has-sidebar-right) .site-grid .container-component { } @media (min-width: 992px) { - .metismenu.menu-horizontal { - display: -webkit-box; - display: -ms-flexbox; - display: flex; + .menu-horizontal { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; -webkit-box-flex: 1; -ms-flex: 1 1 0%; flex: 1 1 0%; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; } } -.metismenu.menu-horizontal>li { +.menu-horizontal>li { position: relative; } -.metismenu.menu-horizontal .level-1>ul { - min-width: 12rem; -} - .metismenu.mod-menu { margin: 0; } @@ -16304,7 +16583,7 @@ body:not(.has-sidebar-right) .site-grid .container-component { .metismenu.mod-menu .mm-collapse { position: absolute; - background-color: var(--body-color); + background-color: var(--body-color, #e6ebf1); -webkit-box-shadow: 1px 1px 4px hsla(0, 0%, 0%, 0.1); box-shadow: 1px 1px 4px hsla(0, 0%, 0%, 0.1); } @@ -16460,10 +16739,10 @@ body:not(.has-sidebar-right) .site-grid .container-component { :root { --template-sidebar-bg: var(--template-bg-dark-80); - --template-sidebar-font-color: var(--body-color); - --template-sidebar-link-color: var(--body-color); + --template-sidebar-font-color: var(--body-color, #e6ebf1); + --template-sidebar-link-color: var(--body-color, #e6ebf1); --template-bg-light: #f0f4fb; - --template-text-light: var(--body-color); + --template-text-light: var(--body-color, #e6ebf1); --template-special-color: #132f53; --template-link-color: #2a69b8; --template-link-active-color: #173a65; @@ -16487,127 +16766,127 @@ body:not(.has-sidebar-right) .site-grid .container-component { } .border-primary { - border-color: var(--primary) ; + border-color: var(--primary, #010156) ; } .border-secondary { - border-color: var(--secondary) ; + border-color: var(--secondary, #48525d) ; } .border-success { - border-color: var(--success) ; + border-color: var(--success, #4aa664) ; } .border-info { - border-color: var(--info) ; + border-color: var(--info, #4f7aa0) ; } .border-warning { - border-color: var(--warning) ; + border-color: var(--warning, #c77a00) ; } .border-danger { - border-color: var(--danger) ; + border-color: var(--danger, #c23a31) ; } .border-light { - border-color: var(--light) ; + border-color: var(--light, #1b2027) ; } .border-dark { - border-color: var(--dark) ; + border-color: var(--dark, #0f1318) ; } .border-white { - border-color: var(--white) ; + border-color: var(--white, #fff) ; } .text-primary { - color: var(--primary) ; + color: var(--primary, #010156) ; } .text-secondary { - color: var(--secondary) ; + color: var(--secondary, #48525d) ; } .text-success { - color: var(--success) ; + color: var(--success, #4aa664) ; } .text-info { - color: var(--info) ; + color: var(--info, #4f7aa0) ; } .text-warning { - color: var(--warning) ; + color: var(--warning, #c77a00) ; } .text-danger { - color: var(--danger) ; + color: var(--danger, #c23a31) ; } .text-light { - color: var(--light) ; + color: var(--light, #1b2027) ; } .text-dark { - color: var(--dark) ; + color: var(--dark, #0f1318) ; } .text-black { - color: var(--black) ; + color: var(--black, #000) ; } .text-white { - color: var(--white) ; + color: var(--white, #fff) ; } .text-body { - color: var(--body-color) ; + color: var(--body-color, #e6ebf1) ; } .bg-primary { - background-color: var(--primary) ; + background-color: var(--primary, #010156) ; } .bg-secondary { - background-color: var(--secondary) ; + background-color: var(--secondary, #48525d) ; } .bg-success { - background-color: var(--success) ; + background-color: var(--success, #4aa664) ; } .bg-info { - background-color: var(--info) ; + background-color: var(--info, #4f7aa0) ; } .bg-warning { - background-color: var(--warning) ; + background-color: var(--warning, #c77a00) ; } .bg-danger { - background-color: var(--danger) ; + background-color: var(--danger, #c23a31) ; } .bg-light { - background-color: var(--light) ; + background-color: var(--light, #1b2027) ; } .bg-dark { - background-color: var(--dark) ; + background-color: var(--dark, #0f1318) ; } .bg-black { - background-color: var(--black) ; + background-color: var(--black, #000) ; } .bg-white { - background-color: var(--white) ; + background-color: var(--white, #fff) ; } .bg-body { - background-color: var(--body-bg) ; + background-color: var(--body-bg, #0e1318) ; } /*! VM BASIC */ @@ -16623,12 +16902,13 @@ body:not(.has-sidebar-right) .site-grid .container-component { } .dropdown-toggle::after { - content: ""; + font-family: "Font Awesome 6 Free", "Font Awesome 6 Pro", "FontAwesome"; + font-weight: 900; + content: "\f078"; + display: inline-block; border: none; - background-image: url('data:image/svg+xml,'); - background-repeat: no-repeat; - width: 10px; - height: 10px + font-size: 0.65em; + vertical-align: middle; } .btn { @@ -16667,7 +16947,7 @@ body:not(.has-sidebar-right) .site-grid .container-component { .btn.show, .btn:first-child:active, :not(.btn-check)+.btn:active { - color: var(--btn-active-text-gray); + color: var(--btn-active-text-gray, #7a8490); } .form-control, @@ -16677,98 +16957,98 @@ body:not(.has-sidebar-right) .site-grid .container-component { form .form-control, form .form-select { - border-color: var(--input-border-color); + border-color: var(--input-border-color, #3a4250); } .container-below-topbar { - padding: var(--padding-x) var(--padding-y); - background-image: var(--container-below-topbar-bg-image); - background-color: var(--container-below-topbar-bg-color); - background-size: var(--container-below-topbar-bg-size); + padding: var(--padding-x, 0.15rem) var(--padding-y, 0.15rem); + background-image: var(--container-below-topbar-bg-image, none); + background-color: var(--container-below-topbar-bg-color, transparent); + background-size: var(--container-below-topbar-bg-size, cover); -webkit-box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; background-repeat: var(--container-below-topbar-background-repeat); - -webkit-border-radius: var(--container-below-topbar-border-radius); - -moz-border-radius: var(--container-below-topbar-border-radius); - border-radius: var(--container-below-topbar-border-radius); - border: var(--container-below-topbar-border); - color: var(--color-primary); + -webkit-border-radius: var(--container-below-topbar-border-radius, 0); + -moz-border-radius: var(--container-below-topbar-border-radius, 0); + border-radius: var(--container-below-topbar-border-radius, 0); + border: var(--container-below-topbar-border, none); + color: var(--color-primary, #112855); } .container-top-a { - padding-left: var(--padding-x); - padding-right: var(--padding-x); - background-image: var(--container-top-a-bg-image); - background-color: var(--container-top-a-bg-color); - background-size: var(--container-top-a-bg-size); + padding-left: var(--padding-x, 0.15rem); + padding-right: var(--padding-x, 0.15rem); + background-image: var(--container-top-a-bg-image, none); + background-color: var(--container-top-a-bg-color, transparent); + background-size: var(--container-top-a-bg-size, cover); -webkit-box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; background-repeat: var(--container-top-a-background-repeat); - -webkit-border-radius: var(--container-top-a-border-radius); - -moz-border-radius: var(--container-top-a-border-radius); - border-radius: var(--container-top-a-border-radius); - border: var(--container-top-a-border); + -webkit-border-radius: var(--container-top-a-border-radius, 0); + -moz-border-radius: var(--container-top-a-border-radius, 0); + border-radius: var(--container-top-a-border-radius, 0); + border: var(--container-top-a-border, none); } .container-top-b { - padding-left: var(--padding-x); - padding-right: var(--padding-x); - background-image: var(--container-top-b-bg-image); - background-color: var(--container-top-b-bg-color); - background-size: var(--container-top-b-bg-size); + padding-left: var(--padding-x, 0.15rem); + padding-right: var(--padding-x, 0.15rem); + background-image: var(--container-top-b-bg-image, none); + background-color: var(--container-top-b-bg-color, transparent); + background-size: var(--container-top-b-bg-size, cover); -webkit-box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; background-repeat: var(--container-top-b-background-repeat); - -webkit-border-radius: var(--container-top-b-border-radius); - -moz-border-radius: var(--container-top-b-border-radius); - border-radius: var(--container-top-b-border-radius); - border: var(--container-top-b-border); + -webkit-border-radius: var(--container-top-b-border-radius, 0); + -moz-border-radius: var(--container-top-b-border-radius, 0); + border-radius: var(--container-top-b-border-radius, 0); + border: var(--container-top-b-border, none); } .container-sidebar-left, .container-sidebar-right { - padding-left: var(--padding-x); - padding-right: var(--padding-x); - background-image: var(--container-sidebar-bg-image); - background-color: var(--container-sidebar-bg-color); - background-size: var(--container-sidebar-bg-size); + padding-left: var(--padding-x, 0.15rem); + padding-right: var(--padding-x, 0.15rem); + background-image: var(--container-sidebar-bg-image, none); + background-color: var(--container-sidebar-bg-color, transparent); + background-size: var(--container-sidebar-bg-size, auto); -webkit-box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; background-repeat: var(--container-sidebar-background-repeat); - -webkit-border-radius: var(--container-sidebar-border-radius); - -moz-border-radius: var(--container-sidebar-border-radius); - border-radius: var(--container-sidebar-border-radius); - border: var(--container-sidebar-border); + -webkit-border-radius: var(--container-sidebar-border-radius, 0); + -moz-border-radius: var(--container-sidebar-border-radius, 0); + border-radius: var(--container-sidebar-border-radius, 0); + border: var(--container-sidebar-border, none); } .container-bottom-a { - padding-left: var(--padding-x); - padding-right: var(--padding-x); - background-image: var(--container-bottom-a-bg-image); - background-color: var(--container-bottom-a-bg-color); - background-size: var(--container-bottom-a-bg-size); + padding-left: var(--padding-x, 0.15rem); + padding-right: var(--padding-x, 0.15rem); + background-image: var(--container-bottom-a-bg-image, none); + background-color: var(--container-bottom-a-bg-color, transparent); + background-size: var(--container-bottom-a-bg-size, cover); -webkit-box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; background-repeat: var(--container-bottom-a-background-repeat); - -webkit-border-radius: var(--container-bottom-a-border-radius); - -moz-border-radius: var(--container-bottom-a-border-radius); - border-radius: var(--container-bottom-a-border-radius); - border: var(--container-bottom-a-border); + -webkit-border-radius: var(--container-bottom-a-border-radius, 5px); + -moz-border-radius: var(--container-bottom-a-border-radius, 5px); + border-radius: var(--container-bottom-a-border-radius, 5px); + border: var(--container-bottom-a-border, none); } .container-bottom-b { - padding-left: var(--padding-x); - padding-right: var(--padding-x); - background-image: var(--container-bottom-b-bg-image); - background-color: var(--container-bottom-b-bg-color); - background-size: var(--container-bottom-b-bg-size); + padding-left: var(--padding-x, 0.15rem); + padding-right: var(--padding-x, 0.15rem); + background-image: var(--container-bottom-b-bg-image, none); + background-color: var(--container-bottom-b-bg-color, transparent); + background-size: var(--container-bottom-b-bg-size, cover); -webkit-box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; box-shadow: 0 5px 5px hsla(0, 0%, 0%, 0.03) inset; background-repeat: var(--container-bottom-b-background-repeat); - -webkit-border-radius: var(--container-bottom-b-border-radius); - -moz-border-radius: var(--container-bottom-b-border-radius); - border-radius: var(--container-bottom-b-border-radius); - border: var(--container-bottom-b-border); + -webkit-border-radius: var(--container-bottom-b-border-radius, 0); + -moz-border-radius: var(--container-bottom-b-border-radius, 0); + border-radius: var(--container-bottom-b-border-radius, 0); + border: var(--container-bottom-b-border, none); } /* Moko Theme FAB */ @@ -16781,10 +17061,10 @@ form .form-select { padding: calc(var(--padding-x, 0.25rem) * 2) calc(var(--padding-y, 0.25rem) * 3) calc(var(--padding-x, 0.25rem) * 2) calc(var(--padding-y, 0.25rem) * 8); border-radius: 999px; border: none; - background: var(--muted-color); - box-shadow: var(--box-shadow); + background: var(--muted-color, #6d757e); + box-shadow: var(--box-shadow, 0 .5rem 1rem #00000066); font: inherit; - color: var(--body-bg); + color: var(--body-bg, #0e1318); font-weight: 600px; } @@ -16814,9 +17094,9 @@ form .form-select { position: relative; width: 44px; height: 24px; - background: var(--secondary-color); + background: var(--secondary-color, #e6ebf1bf); transition: background .2s, border-color .2s; - border-radius: var(--border-radius-xxl); + border-radius: var(--border-radius-xxl, 2rem); } #mokoThemeFab .knob { @@ -16825,9 +17105,9 @@ form .form-select { left: 2px; width: 20px; height: 20px; - border-radius: var(--border-radius-xxl); + border-radius: var(--border-radius-xxl, 2rem); background: var(--bs-body-bg, #fff); - box-shadow: var(--box-shadow); + box-shadow: var(--box-shadow, 0 .5rem 1rem #00000066); transition: transform .2s ease; } @@ -16836,7 +17116,7 @@ form .form-select { } #mokoThemeFab [role="switch"][aria-checked="true"] .switch { - background: rgba(var(--secondary-color), .15); + background: rgba(var(--secondary-color, #e6ebf1bf), .15); } button#mokoThemeSwitch { @@ -16850,7 +17130,7 @@ button#mokoThemeSwitch { } #mokoThemeFab button { - color: var(--body-bg); + color: var(--body-bg, #0e1318); } body.site.error-page { @@ -16883,7 +17163,7 @@ body.site.error-page { } .error-brand .brand-logo { - background-color: invert(var(--body-bg)); + background-color: invert(var(--body-bg, #0e1318)); padding: var(--border-radius-sxl); border-radius: var(--border-radius-2xl); } @@ -16979,9 +17259,9 @@ body.site.error-page { left: 2px; width: 20px; height: 20px; - border-radius: var(--border-radius-xxl); + border-radius: var(--border-radius-xxl, 2rem); background: var(--bs-body-bg, #fff); - box-shadow: var(--box-shadow); + box-shadow: var(--box-shadow, 0 .5rem 1rem #00000066); transition: transform .2s ease; } @@ -16990,7 +17270,7 @@ body.site.error-page { } #mokoThemeFab [role="switch"][aria-checked="true"] .switch { - background: rgba(var(--secondary-color), .15); + background: rgba(var(--secondary-color, #e6ebf1bf), .15); } button#mokoThemeSwitch { @@ -17004,26 +17284,210 @@ button#mokoThemeSwitch { } #mokoThemeFab.debug-outline { - outline: 2px dashed var(--pink); + outline: 2px dashed var(--pink, #ff8fc0); outline-offset: 2px; } +/* ================================================================ + ACCESSIBILITY TOOLBAR + ================================================================ */ + +/* Color inversion */ +html.a11y-inverted { + filter: invert(1) hue-rotate(180deg); +} + +html.a11y-inverted img, +html.a11y-inverted video, +html.a11y-inverted picture, +html.a11y-inverted svg, +html.a11y-inverted [style*="background-image"], +html.a11y-inverted .brand-logo img { + filter: invert(1) hue-rotate(180deg); +} + +/* High contrast */ +html.a11y-high-contrast { + filter: contrast(1.4); +} + +html.a11y-high-contrast img, +html.a11y-high-contrast video, +html.a11y-high-contrast picture { + filter: contrast(0.714); +} + +/* Highlight links */ +html.a11y-highlight-links a { + outline: 2px solid currentColor !important; + outline-offset: 2px !important; + text-decoration: underline !important; +} + +/* Readable font — system sans-serif stack for maximum clarity */ +html.a11y-readable-font, +html.a11y-readable-font * { + font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !important; + letter-spacing: 0.02em !important; + word-spacing: 0.05em !important; +} + +/* Pause animations */ +html.a11y-pause-animations *, +html.a11y-pause-animations *::before, +html.a11y-pause-animations *::after { + animation-duration: 0s !important; + animation-delay: 0s !important; + transition-duration: 0s !important; + transition-delay: 0s !important; + scroll-behavior: auto !important; +} + +/* Toolbar container */ +#mokoA11yToolbar { + position: fixed; + z-index: 1201; + display: flex; + flex-direction: column; + align-items: flex-end; + gap: .25rem; + font-family: inherit; + bottom: 1rem; + right: 2.5rem; +} + +/* When theme FAB is present, sit a11y toolbar to its left */ +body[data-theme-fab-enabled="1"] #mokoA11yToolbar { + right: auto; + left: 2.5rem; + bottom: 1rem; +} + +/* Toggle button */ +.a11y-toggle { + display: flex; + align-items: center; + justify-content: center; + width: 42px; + height: 42px; + border-radius: 50%; + border: 2px solid var(--link-color, #3565e5); + background: var(--bs-body-bg, #fff); + color: var(--link-color, #3565e5); + font-size: 1.25rem; + cursor: pointer; + transition: background .2s, color .2s, box-shadow .2s; + box-shadow: var(--box-shadow, 0 .25rem .5rem rgba(0,0,0,.15)); +} + +.a11y-toggle:hover, +.a11y-toggle:focus-visible { + background: var(--link-color, #3565e5); + color: #fff; +} + +.a11y-toggle.active { + background: var(--link-color, #3565e5); + color: #fff; +} + +/* Panel */ +.a11y-panel { + background: var(--bs-body-bg, #fff); + border: 1px solid var(--border-color, #dee2e6); + border-radius: var(--border-radius, .375rem); + padding: .75rem; + min-width: 200px; + box-shadow: var(--box-shadow-lg, 0 1rem 3rem rgba(0,0,0,.175)); +} + +.a11y-group { + margin-bottom: .5rem; +} + +.a11y-group:last-child { + margin-bottom: 0; +} + +.a11y-group-label { + display: block; + font-size: .75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: .05em; + margin-bottom: .35rem; + color: var(--body-font-color, #444); + opacity: .7; +} + +.a11y-btn-row { + display: flex; + align-items: center; + gap: .35rem; +} + +.a11y-btn { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 34px; + height: 34px; + border: 1px solid var(--border-color, #dee2e6); + border-radius: var(--border-radius, .375rem); + background: var(--bs-body-bg, #fff); + color: var(--body-font-color, #444); + font-size: .875rem; + cursor: pointer; + transition: background .15s, border-color .15s; +} + +.a11y-btn:hover, +.a11y-btn:focus-visible { + border-color: var(--link-color, #3565e5); + background: var(--link-color, #3565e5); + color: #fff; +} + +.a11y-size-display { + font-size: .8rem; + font-weight: 600; + min-width: 3ch; + text-align: center; + color: var(--body-font-color, #444); +} + +.a11y-btn-wide { + width: 100%; + gap: .5rem; + padding: .35rem .75rem; + justify-content: flex-start; +} + +.a11y-btn-wide.active { + background: var(--link-color, #3565e5); + border-color: var(--link-color, #3565e5); + color: #fff; +} + +@media (prefers-reduced-motion: reduce) { + .a11y-toggle, + .a11y-btn { + transition: none; + } +} + html.component body{ padding-top: 3.125rem; } -code { - background-color: var(--gab-gray1); -} - #view_gabble { - background-color: var(--gab-blue); + background-color: var(--gab-blue, #4d9fff); padding: 0.375rem; border-radius: 6px; } #mod_gabble { - background-color: var(--gab-blue); + background-color: var(--gab-blue, #4d9fff); padding: 0.1875rem; border-radius: 6px; } @@ -17031,8 +17495,8 @@ code { #lists_gabble { position: relative; height: 100%; - border: 4px solid var(--gab-red); - background-color: var(--gab-green); + border: 4px solid var(--gab-red, #ff6b6b); + background-color: var(--gab-green, #5cb85c); padding: 0.25rem; border-radius: 6px; } @@ -17059,8 +17523,8 @@ code { #windows_list { margin-left: 0; width: 100%; - border: 4px solid var(--gab-red); - background-color: var(--gab-green); + border: 4px solid var(--gab-red, #ff6b6b); + background-color: var(--gab-green, #5cb85c); padding: 0.25rem; border-radius: 6px; } @@ -17077,15 +17541,15 @@ code { width: 34px; height: 34px; cursor: pointer; - border: 3px solid var(--gab-gray3); - background-color: var(--white); + border: 3px solid var(--gab-gray3, #ced4da); + background-color: var(--white, #fff); border-radius: 17px; } #openai_btn:hover { width: 36px; height: 36px; - border: 3px solid var(--gab-gray3); + border: 3px solid var(--gab-gray3, #ced4da); border-radius: 18px; } @@ -17103,16 +17567,16 @@ code { .openai_logo_sm { width: 22px; height: 22px; - background-color: var(--white); - border: 3px solid var(--white); + background-color: var(--white, #fff); + border: 3px solid var(--white, #fff); border-radius: 11px; } .openai_logo_md { width: 34px; height: 34px; - background-color: var(--white); - border: 4px solid var(--white); + background-color: var(--white, #fff); + border: 4px solid var(--white, #fff); border-radius: 17px; } @@ -17140,13 +17604,13 @@ code { border: none; width:100%; outline: none; - background-color: var(--gab-gray1); + background-color: var(--gab-gray1, #868e96); padding: 0.375rem; border-radius: 6px; } .button_list:hover { - background-color: var(--gab-gray2); + background-color: var(--gab-gray2, #adb5bd); } .button_list_s { @@ -17154,8 +17618,8 @@ code { width: 100%; outline: none; cursor: pointer; - color: var(--white); - background-color: var(--gab-red); + color: var(--white, #fff); + background-color: var(--gab-red, #ff6b6b); padding: 0.375rem; border-radius: 6px; } @@ -17168,13 +17632,13 @@ code { outline: none; cursor: pointer; text-align: left; - background-color: var(--gab-gray1); + background-color: var(--gab-gray1, #868e96); padding: 0.375rem; border-radius: 6px; } .window_list:hover { - background-color: var(--gab-gray2); + background-color: var(--gab-gray2, #adb5bd); } .window_list_s { @@ -17185,8 +17649,8 @@ code { outline: none; cursor: pointer; text-align: left; - color: var(--white); - background-color: var(--gab-red); + color: var(--white, #fff); + background-color: var(--gab-red, #ff6b6b); padding: 0.375rem; border-radius: 6px; } @@ -17198,30 +17662,30 @@ code { padding-left: 0.0625rem; width: 16px; height: 16px; - color: var(--black); + color: var(--black, #000); font-size: 10px; text-align: center; - background-color: var(--gab-gray2); + background-color: var(--gab-gray2, #adb5bd); border-radius: 8px; } .btn_close:hover { - background-color: var(--gab-gray3); + background-color: var(--gab-gray3, #ced4da); } .iframe_list { width: 100%; height: 100%; - background-color: var(--white); - border: 4px solid var(--gab-red); + background-color: var(--white, #fff); + border: 4px solid var(--gab-red, #ff6b6b); border-radius: 6px; } .iframe_messages { width: 100%; height: 100%; - background-color: var(--white); - border: 4px solid var(--gab-red); + background-color: var(--white, #fff); + border: 4px solid var(--gab-red, #ff6b6b); border-radius: 6px; } @@ -17234,11 +17698,11 @@ code { right: 48px; top: 11px; cursor: pointer; - color: var(--gab-gray2); + color: var(--gab-gray2, #adb5bd); } .input_emoji:hover { - color: var(--gab-gray3); + color: var(--gab-gray3, #ced4da); } .emoji { @@ -17246,11 +17710,11 @@ code { float: left; cursor: pointer; padding: 0.125rem; - background-color: var(--white); + background-color: var(--white, #fff); } .emoji:hover { - background-color: var(--gab-orange); + background-color: var(--gab-orange, #ff9f5a); } .emojis_div { @@ -17259,8 +17723,8 @@ code { right: 0px; width: 200px; height: 92px; - border: 4px solid var(--gab-red); - background-color: var(--gab-gray1); + border: 4px solid var(--gab-red, #ff6b6b); + background-color: var(--gab-gray1, #868e96); border-radius: 6px; } @@ -17270,8 +17734,8 @@ code { height: 30px; font-size: 20px; text-align: center; - color: var(--white); - background-color: var(--gab-orange); + color: var(--white, #fff); + background-color: var(--gab-orange, #ff9f5a); border-radius: 15px; } @@ -17281,8 +17745,8 @@ code { height: 30px; font-size: 20px; text-align: center; - color: var(--white); - background-color: var(--gab-gray2); + color: var(--white, #fff); + background-color: var(--gab-gray2, #adb5bd); border-radius: 15px; } @@ -17318,14 +17782,14 @@ code { .item-list { display: inline-block; - color: var(--item-list-color); + color: var(--item-list-color, #2a2f34); margin-top: 0.3125rem; width: 50px; height: 50px; font-size: 30px; text-align: center; - border: 3px solid var(--gab-red); - background-color: var(--gab-blue); + border: 3px solid var(--gab-red, #ff6b6b); + background-color: var(--gab-blue, #4d9fff); border-radius: 25px; } @@ -17348,7 +17812,7 @@ code { right: -2px; width: 18px; height: 18px; - color: var(--white); + color: var(--white, #fff); font-size: 11px; font-weight: bold; text-align: center; @@ -17362,7 +17826,7 @@ code { right: -2px; width: 18px; height: 18px; - color: var(--white); + color: var(--white, #fff); font-size: 11px; font-weight: bold; text-align: center; @@ -17386,25 +17850,25 @@ code { .window-title { margin-left: 0.3125rem; display: inline-block; - color: var(--white); + color: var(--white, #fff); } .window-title-com { margin-left: 0.3125rem; display: inline-block; - color: var(--black); + color: var(--black, #000); } .window-icon { display: inline-block; - color: var(--white); + color: var(--white, #fff); } .window-header { padding: 0.375rem; width: 100%; height: 40px; - background-color: var(--gab-blue); + background-color: var(--gab-blue, #4d9fff); border-radius: 8px 8px 0px 0px; } @@ -17412,7 +17876,7 @@ code { padding: 0.25rem; width: 100%; height: 35px; - background-color: var(--gab-red); + background-color: var(--gab-red, #ff6b6b); border-radius: 8px 8px 0px 0px; } @@ -17421,7 +17885,7 @@ code { display: block; width: 100%; height: calc(100% - 80px); - background-color: var(--content-bg-gray); + background-color: var(--content-bg-gray, #2b323b); } .content-footer { @@ -17429,7 +17893,7 @@ code { padding: 0.3125rem; width: 100%; height: 40px; - background-color: var(--content-bg-gray); + background-color: var(--content-bg-gray, #2b323b); border-radius: 0px 0px 8px 8px; } @@ -17440,7 +17904,7 @@ code { float: right; width: 24px; height: 24px; - background-color: var(--content-bg-gray); + background-color: var(--content-bg-gray, #2b323b); border-radius: 12px; } @@ -17454,16 +17918,16 @@ code { } .taba-self { - border: 1px solid var(--white); - background-color: var(--taba-btn-green); + border: 1px solid var(--white, #fff); + background-color: var(--taba-btn-green, #5a9c2f); padding: 0.375rem; padding-top: 0.5625rem; border-radius: 10px; } .taba-others { - border: 1px solid var(--white); - background-color: var(--taba-btn-blue); + border: 1px solid var(--white, #fff); + background-color: var(--taba-btn-blue, #3d75a8); padding: 0.375rem; padding-top: 0.5625rem; border-radius: 10px; @@ -17472,30 +17936,30 @@ code { .taba-bot { - border: 1px solid var(--white); - background-color: var(--gab-gray3); + border: 1px solid var(--white, #fff); + background-color: var(--gab-gray3, #ced4da); padding: 0.375rem; padding-top: 0.5625rem; border-radius: 10px; } .taba-dice { - border: 1px solid var(--white); - background-color: var(--taba-btn-red); + border: 1px solid var(--white, #fff); + background-color: var(--taba-btn-red, #c43620); padding: 0.375rem; border-radius: 10px; } .taba-emoji { - border: 1px solid var(--white); - background-color: var(--taba-btn-blue); + border: 1px solid var(--white, #fff); + background-color: var(--taba-btn-blue, #3d75a8); padding: 0.375rem; border-radius: 10px; } .taba-user { - border: 1px solid var(--white); - background-color: var(--white); + border: 1px solid var(--white, #fff); + background-color: var(--white, #fff); padding: 0.375rem; border-radius: 6px; word-wrap: break-word; @@ -17503,34 +17967,34 @@ code { .taba-user-on { border: 1px solid #FFF; - background-color: var(--gab-green); + background-color: var(--gab-green, #5cb85c); padding: 0.375rem; border-radius: 8px; } .taba-feed { border: 1px solid #FFF; - background-color: var(--gab-blue); + background-color: var(--gab-blue, #4d9fff); padding: 0.375rem; border-radius: 8px; } .openai_error { border: 1px solid #FFF; - background-color: var(--gab-red); + background-color: var(--gab-red, #ff6b6b); padding: 0.375rem; border-radius: 8px; } .taba-msgsystem { - border: 1px solid var(--white); - background-color: var(--taba-btn-gray); + border: 1px solid var(--white, #fff); + background-color: var(--taba-btn-gray, #6a7080); padding: 0.375rem; border-radius: 10px; } .taba-msghead { - background-color: var(--taba-msg-bg); + background-color: var(--taba-msg-bg, #1e2430); padding: 0.25rem; padding-left: 0.625rem; padding-right: 0.375rem; @@ -17538,7 +18002,7 @@ code { } .taba-msg { - background-color: var(--taba-msg-bg); + background-color: var(--taba-msg-bg, #1e2430); padding: 0.5rem; border-radius: 0px 8px 8px 8px; word-wrap: break-word; @@ -17549,21 +18013,21 @@ nav[data-toggle=toc] .nav>li>a{ padding:0.25rem 1.25rem; font-size:13px; font-weight:500; - color: var(--toc-link-color); + color: var(--toc-link-color, #9fa6ad); } nav[data-toggle=toc] .nav>li>a:focus,nav[data-toggle=toc] .nav>li>a:hover{ padding-left:1.1875rem; - color: var(--toc-link-active-color); + color: var(--toc-link-active-color, #91a4ff); text-decoration:none; background-color:transparent; - border-left:1px solid var(--toc-link-active-color); + border-left:1px solid var(--toc-link-active-color, #91a4ff); } nav[data-toggle=toc] .nav-link.active,nav[data-toggle=toc] .nav-link.active:focus,nav[data-toggle=toc] .nav-link.active:hover{ padding-left:1.125rem; font-weight:700; - color: var(--toc-link-active-color); + color: var(--toc-link-active-color, #91a4ff); background-color:transparent; - border-left:2px solid var(--toc-link-active-color); + border-left:2px solid var(--toc-link-active-color, #91a4ff); } nav[data-toggle=toc] .nav-link+ul{ display:none; @@ -17608,7 +18072,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .choices.is-disabled .choices__inner, .choices.is-disabled .choices__input { - background-color: var(--choices-disabled-bg); + background-color: var(--choices-disabled-bg, #2b323b); cursor: not-allowed; -webkit-user-select: none; -moz-user-select: none; @@ -17632,7 +18096,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ display: block; width: 100%; padding: 0.625rem; - border-bottom: 1px solid var(--choices-border-light); + border-bottom: 1px solid var(--choices-border-light, #48525d); background-color: var(--choices-input-bg); margin: 0; } @@ -17665,7 +18129,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ height: 0; width: 0; border-style: solid; - border-color: var(--choices-arrow-color) transparent transparent transparent; + border-color: var(--choices-arrow-color, #9fa6ad) transparent transparent transparent; border-width: 5px; position: absolute; right: 11.5px; @@ -17674,7 +18138,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ pointer-events: none; } .choices[data-type*=select-one].is-open::after { - border-color: transparent transparent var(--choices-arrow-color) transparent; + border-color: transparent transparent var(--choices-arrow-color, #9fa6ad) transparent; margin-top: -0.46875rem; } .choices[data-type*=select-one][dir=rtl]::after { @@ -17719,16 +18183,16 @@ nav[data-toggle=toc] .nav-link.active+ul{ display: inline-block; vertical-align: top; width: 100%; - background-color: var(--choices-inner-bg); + background-color: var(--choices-inner-bg, #1a2027); padding: 0.46875rem 0.46875rem 0.234375rem; - border: 1px solid var(--choices-border-light); + border: 1px solid var(--choices-border-light, #48525d); border-radius: 2.5px; font-size: 14px; min-height: 44px; overflow: hidden; } .is-focused .choices__inner, .is-open .choices__inner { - border-color: var(--choices-focused-border); + border-color: var(--choices-focused-border, #5472ff); } .is-open .choices__inner { border-radius: 2.5px 2.5px 0 0; @@ -17768,9 +18232,9 @@ nav[data-toggle=toc] .nav-link.active+ul{ font-weight: 500; margin-right: 0.234375rem; margin-bottom: 0.234375rem; - background-color: var(--choices-item-bg); - border: 1px solid var(--choices-item-border); - color: var(--white); + background-color: var(--choices-item-bg, #1a5f75); + border: 1px solid var(--choices-item-border, #1a748f); + color: var(--white, #fff); word-break: break-all; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -17783,12 +18247,12 @@ nav[data-toggle=toc] .nav-link.active+ul{ margin-left: 0.234375rem; } .choices__list--multiple .choices__item.is-highlighted { - background-color: var(--choices-item-hover-bg); - border: 1px solid var(--choices-item-hover-border); + background-color: var(--choices-item-hover-bg, #1a748f); + border: 1px solid var(--choices-item-hover-border, #1a8aa8); } .is-disabled .choices__list--multiple .choices__item { - background-color: var(--choices-item-disabled-bg); - border: 1px solid var(--choices-item-disabled-border); + background-color: var(--choices-item-disabled-bg, #48525d); + border: 1px solid var(--choices-item-disabled-border, #36404a); } .choices__list--dropdown { @@ -17797,7 +18261,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ position: absolute; width: 100%; background-color: var(--choices-dropdown-bg); - border: 1px solid var(--choices-border-light); + border: 1px solid var(--choices-border-light, #48525d); top: 100%; margin-top: -0.0625rem; border-bottom-left-radius: 2.5px; @@ -17810,7 +18274,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ visibility: visible; } .is-open .choices__list--dropdown { - border-color: var(--choices-focused-border); + border-color: var(--choices-focused-border, #5472ff); } .is-flipped .choices__list--dropdown { top: auto; @@ -17859,7 +18323,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } } .choices__list--dropdown .choices__item--selectable.is-highlighted { - background-color: var(--choices-item-highlighted); + background-color: var(--choices-item-highlighted, #2b323b); } .choices__list--dropdown .choices__item--selectable.is-highlighted::after { opacity: 0.5; @@ -17908,7 +18372,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .choices__input { display: inline-block; vertical-align: baseline; - background-color: var(--choices-input-inner-bg); + background-color: var(--choices-input-inner-bg, #1a2027); font-size: 14px; margin-bottom: 0.3125rem; border: 0; @@ -17934,7 +18398,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ border-radius: 0.25rem; } .choices.is-focused { - border-color: var(--input-focus-border-color); + border-color: var(--input-focus-border-color, #5472ff); -webkit-box-shadow: 0 0 0 0.25rem rgba(1, 1, 86, 0.25); box-shadow: 0 0 0 0.25rem rgba(1, 1, 86, 0.25); } @@ -17981,14 +18445,14 @@ nav[data-toggle=toc] .nav-link.active+ul{ .choices__list--multiple .choices__item { position: relative; margin: 0.125rem; - background-color: var(--color-primary); + background-color: var(--color-primary, #112855); -webkit-margin-end: 0.125rem; margin-inline-end: 0.125rem; border: 0; border-radius: 0.25rem; } .choices__list--multiple .choices__item.is-highlighted { - background-color: var(--color-primary); + background-color: var(--color-primary, #112855); opacity: 0.9; } @@ -18094,7 +18558,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ font-weight: 600; font-size: 1.5rem; text-decoration: none; - margin-left: var(--padding-x); + margin-left: var(--padding-x, 0.15rem); } .container-header .navbar-brand .site-title { @@ -18113,9 +18577,9 @@ nav[data-toggle=toc] .nav-link.active+ul{ /* Enhanced search button styling */ .mod-finder__search.input-group button, .container-search button[type="submit"] { - background-color: var(--color-primary); - color: var(--mainmenu-nav-link-color); - border-color: var(--color-primary); + background-color: var(--color-primary, #112855); + color: var(--mainmenu-nav-link-color, #fff); + border-color: var(--color-primary, #112855); padding: 0.6rem 1rem; border-radius: 0 0.25rem 0.25rem 0; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; @@ -18123,14 +18587,14 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-finder__search.input-group button:hover, .container-search button[type="submit"]:hover { - background-color: var(--color-hover); - border-color: var(--color-hover); + background-color: var(--color-hover, gray); + border-color: var(--color-hover, gray); } .mod-finder__search.input-group button:focus, .container-search button[type="submit"]:focus { outline: 0; - box-shadow: 0 0 0 0.25rem rgba(var(--btn-focus-shadow-rgb), .5); + box-shadow: 0 0 0 0.25rem rgba(var(--btn-focus-shadow-rgb, 84, 114, 255), .5); } /* Enhanced container-search styling */ @@ -18161,7 +18625,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .container-search .form-control:focus, .container-search .awesomplete input:focus { - border-color: var(--input-focus-border-color); + border-color: var(--input-focus-border-color, #5472ff); box-shadow: none; } @@ -18176,7 +18640,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .container-search .icon-search { font-size: 1rem; - color: var(--nav-bg-color); + color: var(--nav-text-color, gray); } /* Responsive header menu and search layout improvements */ @@ -18187,7 +18651,6 @@ nav[data-toggle=toc] .nav-link.active+ul{ .container-header .container-nav nav { width: 100%; - margin-bottom: 1rem; } .container-header .container-search { @@ -18213,8 +18676,8 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .container-header .container-search { - flex: 0 0 auto; - min-width: 300px; + flex: 1 1 100%; + width: 100%; margin-top: 0; } } @@ -18247,214 +18710,311 @@ nav[data-toggle=toc] .nav-link.active+ul{ justify-content: center; } -/* Icon mappings */ -.icon-menu::before { content: "\f0c9"; } /* bars */ -.icon-search::before { content: "\f002"; } -.icon-user::before { content: "\f007"; } -.icon-edit::before { content: "\f044"; } -.icon-save::before { content: "\f0c7"; } -.icon-trash::before { content: "\f1f8"; } -.icon-cancel::before { content: "\f00d"; } -.icon-check::before { content: "\f00c"; } -.icon-plus::before { content: "\f067"; } -.icon-minus::before { content: "\f068"; } +/* IcoMoon → Font Awesome 7 compatibility layer. + Joomla core renders icon-* classes via IcoMoon; this maps them to + FA7 Free glyphs so icons render without loading a second icon font. */ +[class^="icon-"]::before, +[class*=" icon-"]::before { + font-family: "Font Awesome 7 Free", "Font Awesome 6 Free", sans-serif; + font-weight: 900; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display: inline-block; +} + +.icon-fw { width: 1.25em; text-align: center; } + +/* Navigation & UI */ +.icon-menu::before { content: "\f0c9"; } /* bars */ +.icon-search::before { content: "\f002"; } +.icon-home::before { content: "\f015"; } +.icon-arrow-up::before { content: "\f062"; } +.icon-arrow-down::before { content: "\f063"; } +.icon-arrow-left::before { content: "\f060"; } +.icon-arrow-right::before { content: "\f061"; } +.icon-chevron-up::before { content: "\f077"; } +.icon-chevron-down::before { content: "\f078"; } +.icon-chevron-left::before { content: "\f053"; } +.icon-chevron-right::before { content: "\f054"; } +.icon-caret-up::before { content: "\f0d8"; } +.icon-caret-down::before { content: "\f0d7"; } + +/* Actions */ +.icon-edit::before { content: "\f044"; } +.icon-save::before { content: "\f0c7"; } +.icon-trash::before { content: "\f1f8"; } +.icon-delete::before { content: "\f1f8"; } +.icon-cancel::before { content: "\f00d"; } +.icon-remove::before { content: "\f00d"; } +.icon-check::before { content: "\f00c"; } +.icon-plus::before { content: "\f067"; } +.icon-minus::before { content: "\f068"; } +.icon-copy::before { content: "\f0c5"; } +.icon-refresh::before { content: "\f021"; } +.icon-undo::before { content: "\f0e2"; } +.icon-download::before { content: "\f019"; } +.icon-upload::before { content: "\f093"; } +.icon-print::before { content: "\f02f"; } + +/* Objects */ +.icon-user::before { content: "\f007"; } +.icon-users::before { content: "\f0c0"; } +.icon-lock::before { content: "\f023"; } +.icon-unlock::before { content: "\f09c"; } +.icon-key::before { content: "\f084"; } +.icon-envelope::before { content: "\f0e0"; } +.icon-mail::before { content: "\f0e0"; } +.icon-calendar::before { content: "\f073"; } +.icon-clock::before { content: "\f017"; } +.icon-eye::before { content: "\f06e"; } +.icon-eye-close::before { content: "\f070"; } +.icon-star::before { content: "\f005"; } +.icon-star-empty::before { content: "\f005"; font-weight: 400; } +.icon-heart::before { content: "\f004"; } +.icon-comment::before { content: "\f075"; } +.icon-comments::before { content: "\f086"; } +.icon-folder::before { content: "\f07b"; } +.icon-folder-open::before { content: "\f07c"; } +.icon-file::before { content: "\f15b"; } +.icon-image::before { content: "\f03e"; } +.icon-camera::before { content: "\f030"; } +.icon-tag::before { content: "\f02b"; } +.icon-tags::before { content: "\f02c"; } +.icon-link::before { content: "\f0c1"; } +.icon-globe::before { content: "\f0ac"; } +.icon-flag::before { content: "\f024"; } + +/* Status & info */ +.icon-info::before { content: "\f129"; } +.icon-info-circle::before { content: "\f05a"; } +.icon-warning::before { content: "\f071"; } +.icon-exclamation-triangle::before { content: "\f071"; } +.icon-question::before { content: "\f128"; } +.icon-question-circle::before { content: "\f059"; } +.icon-ban-circle::before { content: "\f05e"; } + +/* Media & layout */ +.icon-cog::before { content: "\f013"; } +.icon-cogs::before { content: "\f085"; } +.icon-wrench::before { content: "\f0ad"; } +.icon-list::before { content: "\f03a"; } +.icon-th::before { content: "\f00a"; } +.icon-th-large::before { content: "\f009"; } +.icon-grid::before { content: "\f00a"; } +.icon-grid-2::before { content: "\f009"; } +.icon-bars::before { content: "\f0c9"; } +.icon-share::before { content: "\f064"; } +.icon-share-alt::before { content: "\f1e0"; } +.icon-rss::before { content: "\f09e"; } +.icon-feed::before { content: "\f09e"; } +.icon-external-link::before { content: "\f35d"; } +.icon-signup::before { content: "\f234"; } + +/* Publishing */ +.icon-publish::before { content: "\f00c"; } +.icon-unpublish::before { content: "\f00d"; } +.icon-featured::before { content: "\f005"; } +.icon-unfeatured::before { content: "\f005"; font-weight: 400; } +.icon-archive::before { content: "\f187"; } +.icon-unarchive::before { content: "\f187"; } /* ===== BOOTSTRAP & JOOMLA BUTTONS ===== */ .btn-primary { --btn-color: white; - --btn-bg: var(--color-primary); - --btn-border-color: var(--color-primary); - --btn-hover-bg: color-mix(in srgb, var(--color-primary) 85%, black); - --btn-hover-border-color: color-mix(in srgb, var(--color-primary) 85%, black); + --btn-bg: var(--color-primary, #112855); + --btn-border-color: var(--color-primary, #112855); + --btn-hover-bg: color-mix(in srgb, var(--color-primary, #112855) 85%, black); + --btn-hover-border-color: color-mix(in srgb, var(--color-primary, #112855) 85%, black); } .btn-secondary { - --btn-color: var(--body-bg); - --btn-bg: var(--secondary); - --btn-border-color: var(--secondary); - --btn-hover-bg: color-mix(in srgb, var(--secondary) 85%, black); - --btn-hover-border-color: color-mix(in srgb, var(--secondary) 85%, black); + --btn-color: var(--body-bg, #0e1318); + --btn-bg: var(--secondary, #48525d); + --btn-border-color: var(--secondary, #48525d); + --btn-hover-bg: color-mix(in srgb, var(--secondary, #48525d) 85%, black); + --btn-hover-border-color: color-mix(in srgb, var(--secondary, #48525d) 85%, black); } .btn-success { --btn-color: white; - --btn-bg: var(--success); - --btn-border-color: var(--success); - --btn-hover-bg: color-mix(in srgb, var(--success) 85%, black); - --btn-hover-border-color: color-mix(in srgb, var(--success) 85%, black); + --btn-bg: var(--success, #4aa664); + --btn-border-color: var(--success, #4aa664); + --btn-hover-bg: color-mix(in srgb, var(--success, #4aa664) 85%, black); + --btn-hover-border-color: color-mix(in srgb, var(--success, #4aa664) 85%, black); } .btn-info { --btn-color: white; - --btn-bg: var(--info); - --btn-border-color: var(--info); - --btn-hover-bg: color-mix(in srgb, var(--info) 85%, black); - --btn-hover-border-color: color-mix(in srgb, var(--info) 85%, black); + --btn-bg: var(--info, #4f7aa0); + --btn-border-color: var(--info, #4f7aa0); + --btn-hover-bg: color-mix(in srgb, var(--info, #4f7aa0) 85%, black); + --btn-hover-border-color: color-mix(in srgb, var(--info, #4f7aa0) 85%, black); } .btn-warning { --btn-color: white; - --btn-bg: var(--warning); - --btn-border-color: var(--warning); - --btn-hover-bg: color-mix(in srgb, var(--warning) 85%, black); - --btn-hover-border-color: color-mix(in srgb, var(--warning) 85%, black); + --btn-bg: var(--warning, #c77a00); + --btn-border-color: var(--warning, #c77a00); + --btn-hover-bg: color-mix(in srgb, var(--warning, #c77a00) 85%, black); + --btn-hover-border-color: color-mix(in srgb, var(--warning, #c77a00) 85%, black); } .btn-danger { --btn-color: white; - --btn-bg: var(--danger); - --btn-border-color: var(--danger); - --btn-hover-bg: color-mix(in srgb, var(--danger) 85%, black); - --btn-hover-border-color: color-mix(in srgb, var(--danger) 85%, black); + --btn-bg: var(--danger, #c23a31); + --btn-border-color: var(--danger, #c23a31); + --btn-hover-bg: color-mix(in srgb, var(--danger, #c23a31) 85%, black); + --btn-hover-border-color: color-mix(in srgb, var(--danger, #c23a31) 85%, black); } .btn-light { - --btn-color: var(--body-color); - --btn-bg: var(--light); - --btn-border-color: var(--light); - --btn-hover-bg: color-mix(in srgb, var(--light) 90%, black); - --btn-hover-border-color: color-mix(in srgb, var(--light) 90%, black); + --btn-color: var(--body-color, #e6ebf1); + --btn-bg: var(--light, #1b2027); + --btn-border-color: var(--light, #1b2027); + --btn-hover-bg: color-mix(in srgb, var(--light, #1b2027) 90%, black); + --btn-hover-border-color: color-mix(in srgb, var(--light, #1b2027) 90%, black); } .btn-dark { --btn-color: white; - --btn-bg: var(--dark); - --btn-border-color: var(--dark); - --btn-hover-bg: color-mix(in srgb, var(--dark) 85%, black); - --btn-hover-border-color: color-mix(in srgb, var(--dark) 85%, black); + --btn-bg: var(--dark, #0f1318); + --btn-border-color: var(--dark, #0f1318); + --btn-hover-bg: color-mix(in srgb, var(--dark, #0f1318) 85%, black); + --btn-hover-border-color: color-mix(in srgb, var(--dark, #0f1318) 85%, black); } /* Outline button variants */ .btn-outline-primary { - --btn-color: var(--color-primary); - --btn-border-color: var(--color-primary); + --btn-color: var(--color-primary, #112855); + --btn-border-color: var(--color-primary, #112855); --btn-hover-color: white; - --btn-hover-bg: var(--color-primary); - --btn-hover-border-color: var(--color-primary); + --btn-hover-bg: var(--color-primary, #112855); + --btn-hover-border-color: var(--color-primary, #112855); } .btn-outline-secondary { - --btn-color: var(--secondary); - --btn-border-color: var(--secondary); + --btn-color: var(--secondary, #48525d); + --btn-border-color: var(--secondary, #48525d); --btn-hover-color: white; - --btn-hover-bg: var(--secondary); - --btn-hover-border-color: var(--secondary); + --btn-hover-bg: var(--secondary, #48525d); + --btn-hover-border-color: var(--secondary, #48525d); } .btn-outline-success { - --btn-color: var(--success); - --btn-border-color: var(--success); + --btn-color: var(--success, #4aa664); + --btn-border-color: var(--success, #4aa664); --btn-hover-color: white; - --btn-hover-bg: var(--success); - --btn-hover-border-color: var(--success); + --btn-hover-bg: var(--success, #4aa664); + --btn-hover-border-color: var(--success, #4aa664); } .btn-outline-info { - --btn-color: var(--info); - --btn-border-color: var(--info); + --btn-color: var(--info, #4f7aa0); + --btn-border-color: var(--info, #4f7aa0); --btn-hover-color: white; - --btn-hover-bg: var(--info); - --btn-hover-border-color: var(--info); + --btn-hover-bg: var(--info, #4f7aa0); + --btn-hover-border-color: var(--info, #4f7aa0); } .btn-outline-warning { - --btn-color: var(--warning); - --btn-border-color: var(--warning); + --btn-color: var(--warning, #c77a00); + --btn-border-color: var(--warning, #c77a00); --btn-hover-color: white; - --btn-hover-bg: var(--warning); - --btn-hover-border-color: var(--warning); + --btn-hover-bg: var(--warning, #c77a00); + --btn-hover-border-color: var(--warning, #c77a00); } .btn-outline-danger { - --btn-color: var(--danger); - --btn-border-color: var(--danger); + --btn-color: var(--danger, #c23a31); + --btn-border-color: var(--danger, #c23a31); --btn-hover-color: white; - --btn-hover-bg: var(--danger); - --btn-hover-border-color: var(--danger); + --btn-hover-bg: var(--danger, #c23a31); + --btn-hover-border-color: var(--danger, #c23a31); } .btn-outline-light { - --btn-color: var(--light); - --btn-border-color: var(--light); - --btn-hover-color: var(--body-color); - --btn-hover-bg: var(--light); - --btn-hover-border-color: var(--light); + --btn-color: var(--light, #1b2027); + --btn-border-color: var(--light, #1b2027); + --btn-hover-color: var(--body-color, #e6ebf1); + --btn-hover-bg: var(--light, #1b2027); + --btn-hover-border-color: var(--light, #1b2027); } .btn-outline-dark { - --btn-color: var(--dark); - --btn-border-color: var(--dark); + --btn-color: var(--dark, #0f1318); + --btn-border-color: var(--dark, #0f1318); --btn-hover-color: white; - --btn-hover-bg: var(--dark); - --btn-hover-border-color: var(--dark); + --btn-hover-bg: var(--dark, #0f1318); + --btn-hover-border-color: var(--dark, #0f1318); } /* ===== BOOTSTRAP & JOOMLA ALERTS ===== */ .alert-primary { - --alert-bg: color-mix(in srgb, var(--primary) 10%, var(--body-bg)); - --alert-color: color-mix(in srgb, var(--primary) 90%, black); - --alert-border-color: color-mix(in srgb, var(--primary) 20%, var(--body-bg)); + --alert-bg: color-mix(in srgb, var(--primary, #010156) 10%, var(--body-bg, #0e1318)); + --alert-color: color-mix(in srgb, var(--primary, #010156) 90%, black); + --alert-border-color: color-mix(in srgb, var(--primary, #010156) 20%, var(--body-bg, #0e1318)); } .alert-secondary { - --alert-bg: color-mix(in srgb, var(--secondary) 10%, var(--body-bg)); - --alert-color: color-mix(in srgb, var(--secondary) 90%, black); - --alert-border-color: color-mix(in srgb, var(--secondary) 20%, var(--body-bg)); + --alert-bg: color-mix(in srgb, var(--secondary, #48525d) 10%, var(--body-bg, #0e1318)); + --alert-color: color-mix(in srgb, var(--secondary, #48525d) 90%, black); + --alert-border-color: color-mix(in srgb, var(--secondary, #48525d) 20%, var(--body-bg, #0e1318)); } .alert-success { - --alert-bg: color-mix(in srgb, var(--success) 10%, var(--body-bg)); - --alert-color: color-mix(in srgb, var(--success) 90%, black); - --alert-border-color: color-mix(in srgb, var(--success) 20%, var(--body-bg)); + --alert-bg: color-mix(in srgb, var(--success, #4aa664) 10%, var(--body-bg, #0e1318)); + --alert-color: color-mix(in srgb, var(--success, #4aa664) 90%, black); + --alert-border-color: color-mix(in srgb, var(--success, #4aa664) 20%, var(--body-bg, #0e1318)); } .alert-info { - --alert-bg: color-mix(in srgb, var(--info) 10%, var(--body-bg)); - --alert-color: color-mix(in srgb, var(--info) 90%, black); - --alert-border-color: color-mix(in srgb, var(--info) 20%, var(--body-bg)); + --alert-bg: color-mix(in srgb, var(--info, #4f7aa0) 10%, var(--body-bg, #0e1318)); + --alert-color: color-mix(in srgb, var(--info, #4f7aa0) 90%, black); + --alert-border-color: color-mix(in srgb, var(--info, #4f7aa0) 20%, var(--body-bg, #0e1318)); } .alert-warning { - --alert-bg: color-mix(in srgb, var(--warning) 10%, var(--body-bg)); - --alert-color: color-mix(in srgb, var(--warning) 90%, black); - --alert-border-color: color-mix(in srgb, var(--warning) 20%, var(--body-bg)); + --alert-bg: color-mix(in srgb, var(--warning, #c77a00) 10%, var(--body-bg, #0e1318)); + --alert-color: color-mix(in srgb, var(--warning, #c77a00) 90%, black); + --alert-border-color: color-mix(in srgb, var(--warning, #c77a00) 20%, var(--body-bg, #0e1318)); } .alert-danger { - --alert-bg: color-mix(in srgb, var(--danger) 10%, var(--body-bg)); - --alert-color: color-mix(in srgb, var(--danger) 90%, black); - --alert-border-color: color-mix(in srgb, var(--danger) 20%, var(--body-bg)); + --alert-bg: color-mix(in srgb, var(--danger, #c23a31) 10%, var(--body-bg, #0e1318)); + --alert-color: color-mix(in srgb, var(--danger, #c23a31) 90%, black); + --alert-border-color: color-mix(in srgb, var(--danger, #c23a31) 20%, var(--body-bg, #0e1318)); } .alert-light { - --alert-bg: var(--light); - --alert-color: var(--body-color); - --alert-border-color: color-mix(in srgb, var(--light) 85%, black); + --alert-bg: var(--light, #1b2027); + --alert-color: var(--body-color, #e6ebf1); + --alert-border-color: color-mix(in srgb, var(--light, #1b2027) 85%, black); } .alert-dark { - --alert-bg: var(--dark); + --alert-bg: var(--dark, #0f1318); --alert-color: white; - --alert-border-color: var(--dark); + --alert-border-color: var(--dark, #0f1318); } /* Joomla-specific alert mappings */ .alert-message { - --alert-bg: var(--alert-info, color-mix(in srgb, var(--info) 10%, var(--body-bg))); - --alert-color: color-mix(in srgb, var(--info) 90%, black); - --alert-border-color: color-mix(in srgb, var(--info) 20%, var(--body-bg)); + --alert-bg: var(--alert-info, color-mix(in srgb, var(--info, #4f7aa0) 10%, var(--body-bg, #0e1318))); + --alert-color: color-mix(in srgb, var(--info, #4f7aa0) 90%, black); + --alert-border-color: color-mix(in srgb, var(--info, #4f7aa0) 20%, var(--body-bg, #0e1318)); } .alert-error { - --alert-bg: var(--alert-danger, color-mix(in srgb, var(--danger) 10%, var(--body-bg))); - --alert-color: color-mix(in srgb, var(--danger) 90%, black); - --alert-border-color: color-mix(in srgb, var(--danger) 20%, var(--body-bg)); + --alert-bg: var(--alert-danger, color-mix(in srgb, var(--danger, #c23a31) 10%, var(--body-bg, #0e1318))); + --alert-color: color-mix(in srgb, var(--danger, #c23a31) 90%, black); + --alert-border-color: color-mix(in srgb, var(--danger, #c23a31) 20%, var(--body-bg, #0e1318)); } .alert-notice { - --alert-bg: var(--alert-warning, color-mix(in srgb, var(--warning) 10%, var(--body-bg))); - --alert-color: color-mix(in srgb, var(--warning) 90%, black); - --alert-border-color: color-mix(in srgb, var(--warning) 20%, var(--body-bg)); + --alert-bg: var(--alert-warning, color-mix(in srgb, var(--warning, #c77a00) 10%, var(--body-bg, #0e1318))); + --alert-color: color-mix(in srgb, var(--warning, #c77a00) 90%, black); + --alert-border-color: color-mix(in srgb, var(--warning, #c77a00) 20%, var(--body-bg, #0e1318)); } /* ===== MOD_SEARCH MOBILE RESPONSIVE STYLES ===== */ @@ -18616,14 +19176,14 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-vm-cart__count { font-weight: 600; - color: var(--vm-text-strong); + color: var(--vm-text-strong, #ffffff); font-size: 1rem; } .mod-vm-cart__total { color: var(--vm-price-color); font-weight: 700; - font-size: var(--vm-price-size); + font-size: var(--vm-price-size, 1.5rem); margin-top: 0.25rem; } @@ -18667,12 +19227,12 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-vm-cart__product-name a { - color: var(--vm-text-strong); + color: var(--vm-text-strong, #ffffff); text-decoration: none; } .mod-vm-cart__product-name a:hover { - color: var(--color-primary); + color: var(--color-primary, #112855); text-decoration: underline; } @@ -18706,15 +19266,15 @@ nav[data-toggle=toc] .nav-link.active+ul{ border-radius: 50%; background: var(--vm-surface); border: 1px solid var(--vm-border); - color: var(--danger); + color: var(--danger, #c23a31); text-decoration: none; transition: all 0.2s; } .mod-vm-cart__remove-btn:hover { - background: var(--danger); + background: var(--danger, #c23a31); color: white; - border-color: var(--danger); + border-color: var(--danger, #c23a31); } .mod-vm-cart__actions { @@ -18724,7 +19284,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-vm-cart__btn { - padding: var(--vm-btn-padding-y) var(--vm-btn-padding-x); + padding: var(--vm-btn-padding-y, 0.5rem) var(--vm-btn-padding-x, 1rem); border-radius: var(--vm-btn-radius); text-align: center; text-decoration: none; @@ -18816,19 +19376,19 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-vm-product__title { - font-size: var(--vm-product-title-size); - font-weight: var(--vm-product-title-weight); + font-size: var(--vm-product-title-size, 1.125rem); + font-weight: var(--vm-product-title-weight, 500); margin: 0 0 0.75rem 0; line-height: 1.4; } .mod-vm-product__title a { - color: var(--vm-text-strong); + color: var(--vm-text-strong, #ffffff); text-decoration: none; } .mod-vm-product__title a:hover { - color: var(--color-primary); + color: var(--color-primary, #112855); text-decoration: underline; } @@ -18840,7 +19400,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-vm-product__price { - font-size: var(--vm-price-detail-size); + font-size: var(--vm-price-detail-size, 1.125rem); font-weight: 700; color: var(--vm-price-color); margin-bottom: 1rem; @@ -18853,7 +19413,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-vm-product__btn { - padding: var(--vm-btn-padding-y) var(--vm-btn-padding-x); + padding: var(--vm-btn-padding-y, 0.5rem) var(--vm-btn-padding-x, 1rem); border-radius: var(--vm-btn-radius); text-align: center; text-decoration: none; @@ -18886,7 +19446,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-vm-currencies__label { font-weight: 600; - color: var(--vm-text-strong); + color: var(--vm-text-strong, #ffffff); font-size: 0.875rem; } @@ -18912,7 +19472,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-vm-currencies__select:focus { - border-color: var(--color-primary); + border-color: var(--color-primary, #112855); outline: 0; box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } @@ -18925,7 +19485,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-vm-currencies__submit { - padding: var(--vm-btn-padding-y) var(--vm-btn-padding-x); + padding: var(--vm-btn-padding-y, 0.5rem) var(--vm-btn-padding-x, 1rem); border-radius: var(--vm-btn-radius); min-height: 44px; } @@ -18967,14 +19527,14 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-vm-category__link:hover { background: var(--vm-surface-2); - border-color: var(--color-primary); - color: var(--color-primary); + border-color: var(--color-primary, #112855); + color: var(--color-primary, #112855); } .mod-vm-category__link--active { background: var(--vm-btn-primary-bg); border-color: var(--vm-btn-primary-bg); - color: var(--vm-btn-primary-text); + color: var(--vm-btn-primary-text, #ffffff); font-weight: 600; } @@ -19037,14 +19597,14 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-vm-category__sublink:hover { background: var(--vm-surface); - border-color: var(--color-primary); - color: var(--color-primary); + border-color: var(--color-primary, #112855); + color: var(--color-primary, #112855); } .mod-vm-category__sublink--active { background: var(--vm-btn-secondary-bg); border-color: var(--vm-btn-secondary-bg); - color: var(--vm-btn-secondary-text); + color: var(--vm-btn-secondary-text, #ffffff); font-weight: 600; } @@ -19118,13 +19678,13 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-vm-manufacturer__name { font-weight: 600; - color: var(--vm-text-strong); + color: var(--vm-text-strong, #ffffff); display: block; margin-bottom: 0.5rem; } .mod-vm-manufacturer__link:hover .mod-vm-manufacturer__name { - color: var(--color-primary); + color: var(--color-primary, #112855); } .mod-vm-manufacturer__description { @@ -19261,19 +19821,18 @@ nav[data-toggle=toc] .nav-link.active+ul{ /* === Main Menu - Collapsible Dropdown Bootstrap Responsive === */ .mod-menu-main { - background-color: var(--body-bg); padding: 0.5rem 0; } .mod-menu-main .navbar-toggler { - border-color: var(--border-color); + border-color: var(--border-color, #2b323b); padding: 0.5rem 0.75rem; font-size: 1.25rem; min-height: 48px; /* WCAG 2.1 touch target */ } .mod-menu-main .navbar-toggler:focus { - box-shadow: 0 0 0 0.25rem rgba(var(--link-color-rgb), 0.25); + box-shadow: 0 0 0 0.25rem rgba(var(--link-color-rgb, 138, 180, 248), 0.25); outline: 0; } @@ -19305,26 +19864,25 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-menu-main__heading { display: block; padding: 0.75rem 1rem; - color: var(--link-color); + color: var(--mainmenu-nav-link-color, #fff); text-decoration: none; transition: background-color 0.2s ease, color 0.2s ease; min-height: 48px; /* WCAG 2.1 touch target on mobile */ display: flex; align-items: center; - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); } .mod-menu-main__link:hover, .mod-menu-main__link:focus { - background-color: var(--secondary-bg); - color: var(--link-hover-color); + background-color: var(--secondary-bg, #151b22); + color: var(--link-hover-color, #c3d6ff); text-decoration: none; } .mod-menu-main__item.active > .mod-menu-main__link, .mod-menu-main__item.current > .mod-menu-main__link { - background-color: var(--primary-bg); - color: var(--white); + color: var(--mainmenu-nav-link-color, #fff); font-weight: 600; } @@ -19333,9 +19891,9 @@ nav[data-toggle=toc] .nav-link.active+ul{ list-style: none; padding: 0.5rem 0; margin: 0; - background-color: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); + background-color: var(--body-bg, #0e1318); + border: 1px solid var(--border-color, #2b323b); + border-radius: var(--border-radius, .25rem); box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); display: none; } @@ -19355,27 +19913,27 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-menu-main__dropdown .mod-menu-main__link:hover, .mod-menu-main__dropdown .mod-menu-main__link:focus { - background-color: var(--secondary-bg); + background-color: var(--secondary-bg, #151b22); } .mod-menu-main__separator { - border-top: 1px solid var(--border-color); + border-top: 1px solid var(--border-color, #2b323b); margin: 0.5rem 0; padding: 0; } -/* Dropdown toggle arrow */ +/* Dropdown toggle arrow — uses FontAwesome instead of CSS borders */ .mod-menu-main__link.dropdown-toggle::after, .mod-menu-main__heading.dropdown-toggle::after { - content: ""; + font-family: "Font Awesome 6 Free", "Font Awesome 6 Pro", "FontAwesome"; + font-weight: 900; + content: "\f078"; display: inline-block; margin-left: auto; padding-left: 0.5rem; vertical-align: middle; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; + font-size: 0.65em; + border: none; } /* Desktop styles (≥768px) */ @@ -19439,7 +19997,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-breadcrumbs__prefix { font-weight: 600; margin-right: 0.5rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .mod-breadcrumbs__list { @@ -19457,25 +20015,19 @@ nav[data-toggle=toc] .nav-link.active+ul{ align-items: center; } -.mod-breadcrumbs__item:not(:last-child)::after { - content: "/"; - margin-left: 0.5rem; - color: var(--gray-500); -} - .mod-breadcrumbs__link { - color: var(--link-color); + color: var(--link-color, #8ab4f8); text-decoration: none; transition: color 0.2s; } .mod-breadcrumbs__link:hover { - color: var(--link-hover-color); + color: var(--link-hover-color, #c3d6ff); text-decoration: underline; } .mod-breadcrumbs__current { - color: var(--body-color); + color: var(--body-color, #e6ebf1); font-weight: 600; } @@ -19496,8 +20048,8 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-login__greeting { padding: 1rem; - background: var(--secondary-bg); - border-radius: var(--border-radius); + background: var(--secondary-bg, #151b22); + border-radius: var(--border-radius, .25rem); margin-bottom: 1rem; font-weight: 600; } @@ -19505,7 +20057,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-login__pretext, .mod-login__posttext { font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); line-height: 1.6; } @@ -19524,7 +20076,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-login__label { font-weight: 600; font-size: 0.875rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .mod-login__input { @@ -19532,14 +20084,14 @@ nav[data-toggle=toc] .nav-link.active+ul{ font-size: 1rem; line-height: 1.5; border: 1px solid var(--input-border-color, #dee2e6); - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); background: var(--input-bg, #fff); color: var(--input-color, #212529); min-height: 44px; } .mod-login__input:focus { - border-color: var(--color-primary); + border-color: var(--color-primary, #112855); outline: 0; box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } @@ -19572,7 +20124,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ padding: 0.625rem 1rem; font-size: 1rem; font-weight: 600; - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); min-height: 44px; display: inline-flex; align-items: center; @@ -19591,20 +20143,20 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-login__link { - color: var(--link-color); + color: var(--link-color, #8ab4f8); text-decoration: none; font-size: 0.875rem; display: flex; align-items: center; justify-content: space-between; padding: 0.5rem; - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); transition: background 0.2s; } .mod-login__link:hover { - background: var(--secondary-bg); - color: var(--link-hover-color); + background: var(--secondary-bg, #151b22); + color: var(--link-hover-color, #c3d6ff); } /* === mod_articles_latest === */ @@ -19623,7 +20175,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-articles-latest__item { padding-bottom: 1.5rem; - border-bottom: 1px solid var(--border-color); + border-bottom: 1px solid var(--border-color, #2b323b); } .mod-articles-latest__item:last-child { @@ -19638,13 +20190,13 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-articles-latest__link { - color: var(--body-color); + color: var(--body-color, #e6ebf1); text-decoration: none; transition: color 0.2s; } .mod-articles-latest__link:hover { - color: var(--color-primary); + color: var(--color-primary, #112855); text-decoration: underline; } @@ -19653,7 +20205,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ flex-wrap: wrap; gap: 1rem; font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); margin-bottom: 0.75rem; } @@ -19664,7 +20216,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-articles-latest__intro { - color: var(--body-color); + color: var(--body-color, #e6ebf1); line-height: 1.6; margin-bottom: 1rem; } @@ -19683,9 +20235,9 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-articles-latest__empty { text-align: center; padding: 2rem 1rem; - background: var(--secondary-bg); - border-radius: var(--border-radius); - color: var(--gray-600); + background: var(--secondary-bg, #151b22); + border-radius: var(--border-radius, .25rem); + color: var(--gray-600, #48525d); } /* === mod_cblogin (Community Builder) === */ @@ -19704,8 +20256,8 @@ nav[data-toggle=toc] .nav-link.active+ul{ align-items: center; gap: 1rem; padding: 1rem; - background: var(--secondary-bg); - border-radius: var(--border-radius); + background: var(--secondary-bg, #151b22); + border-radius: var(--border-radius, .25rem); margin-bottom: 1rem; } @@ -19735,7 +20287,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-cblogin__pretext, .mod-cblogin__posttext { font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); line-height: 1.6; } @@ -19754,7 +20306,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-cblogin__label { font-weight: 600; font-size: 0.875rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .mod-cblogin__input { @@ -19762,14 +20314,14 @@ nav[data-toggle=toc] .nav-link.active+ul{ font-size: 1rem; line-height: 1.5; border: 1px solid var(--input-border-color, #dee2e6); - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); background: var(--input-bg, #fff); color: var(--input-color, #212529); min-height: 44px; } .mod-cblogin__input:focus { - border-color: var(--color-primary); + border-color: var(--color-primary, #112855); outline: 0; box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } @@ -19802,7 +20354,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ padding: 0.625rem 1rem; font-size: 1rem; font-weight: 600; - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); min-height: 44px; display: inline-flex; align-items: center; @@ -19822,20 +20374,20 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-cblogin__link { - color: var(--link-color); + color: var(--link-color, #8ab4f8); text-decoration: none; font-size: 0.875rem; display: flex; align-items: center; justify-content: space-between; padding: 0.5rem; - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); transition: background 0.2s; } .mod-cblogin__link:hover { - background: var(--secondary-bg); - color: var(--link-hover-color); + background: var(--secondary-bg, #151b22); + color: var(--link-hover-color, #c3d6ff); } /* === mod_comprofilerOnline (Community Builder) === */ @@ -19845,8 +20397,8 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-cb-online__stats { padding: 1rem; - background: var(--secondary-bg); - border-radius: var(--border-radius); + background: var(--secondary-bg, #151b22); + border-radius: var(--border-radius, .25rem); margin-bottom: 1.5rem; } @@ -19860,13 +20412,13 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-cb-online__count-number { font-size: 2.5rem; font-weight: 700; - color: var(--color-primary); + color: var(--color-primary, #112855); line-height: 1; } .mod-cb-online__count-label { font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); text-transform: uppercase; letter-spacing: 0.5px; } @@ -19883,7 +20435,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ align-items: center; gap: 0.5rem; font-size: 0.875rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .mod-cb-online__heading { @@ -19906,15 +20458,15 @@ nav[data-toggle=toc] .nav-link.active+ul{ align-items: center; gap: 0.75rem; padding: 0.75rem; - background: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); + background: var(--body-bg, #0e1318); + border: 1px solid var(--border-color, #2b323b); + border-radius: var(--border-radius, .25rem); transition: all 0.2s; } .mod-cb-online__user:hover { - background: var(--secondary-bg); - border-color: var(--color-primary); + background: var(--secondary-bg, #151b22); + border-color: var(--color-primary, #112855); } .mod-cb-online__avatar { @@ -19938,34 +20490,34 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-cb-online__name { font-weight: 600; - color: var(--body-color); + color: var(--body-color, #e6ebf1); text-decoration: none; display: block; margin-bottom: 0.25rem; } .mod-cb-online__name:hover { - color: var(--color-primary); + color: var(--color-primary, #112855); } .mod-cb-online__status { font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); display: block; } .mod-cb-online__indicator { flex-shrink: 0; - color: var(--success); + color: var(--success, #4aa664); font-size: 1.25rem; } .mod-cb-online__empty { text-align: center; padding: 2rem 1rem; - background: var(--secondary-bg); - border-radius: var(--border-radius); - color: var(--gray-600); + background: var(--secondary-bg, #151b22); + border-radius: var(--border-radius, .25rem); + color: var(--gray-600, #48525d); } /* === Mobile Responsive Adjustments === */ @@ -20034,7 +20586,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ display: flex; gap: 1rem; padding-bottom: 1.5rem; - border-bottom: 1px solid var(--border-color); + border-bottom: 1px solid var(--border-color, #2b323b); } .mod-k2-content__item:last-child { @@ -20046,7 +20598,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ flex-shrink: 0; width: 120px; overflow: hidden; - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); } .mod-k2-content__image img { @@ -20072,13 +20624,13 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-k2-content__title a { - color: var(--body-color); + color: var(--body-color, #e6ebf1); text-decoration: none; transition: color 0.2s; } .mod-k2-content__title a:hover { - color: var(--color-primary); + color: var(--color-primary, #112855); text-decoration: underline; } @@ -20087,7 +20639,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ flex-wrap: wrap; gap: 1rem; font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); margin-bottom: 0.75rem; } @@ -20098,7 +20650,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-k2-content__intro { - color: var(--body-color); + color: var(--body-color, #e6ebf1); line-height: 1.6; margin-bottom: 1rem; } @@ -20122,9 +20674,9 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-k2-content__empty { text-align: center; padding: 2rem 1rem; - background: var(--secondary-bg); - border-radius: var(--border-radius); - color: var(--gray-600); + background: var(--secondary-bg, #151b22); + border-radius: var(--border-radius, .25rem); + color: var(--gray-600, #48525d); } /* === mod_acymailing (AcyMailing) === */ @@ -20133,31 +20685,31 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-acymailing__form-container { - background: var(--body-bg); + background: var(--body-bg, #0e1318); padding: 1.5rem; - border-radius: var(--border-radius); - border: 1px solid var(--border-color); + border-radius: var(--border-radius, .25rem); + border: 1px solid var(--border-color, #2b323b); } .mod-acymailing__intro { margin-bottom: 1.5rem; line-height: 1.6; - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .mod-acymailing__outro { margin-top: 1.5rem; font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); line-height: 1.6; } .mod-acymailing__empty { text-align: center; padding: 2rem 1rem; - background: var(--secondary-bg); - border-radius: var(--border-radius); - color: var(--gray-600); + background: var(--secondary-bg, #151b22); + border-radius: var(--border-radius, .25rem); + color: var(--gray-600, #48525d); } /* === mod_hikashop_cart (HikaShop) === */ @@ -20170,15 +20722,15 @@ nav[data-toggle=toc] .nav-link.active+ul{ align-items: center; gap: 0.75rem; padding: 1rem; - background: var(--secondary-bg); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); + background: var(--secondary-bg, #151b22); + border: 1px solid var(--border-color, #2b323b); + border-radius: var(--border-radius, .25rem); margin-bottom: 1rem; } .mod-hikashop-cart__icon { font-size: 1.5rem; - color: var(--color-primary); + color: var(--color-primary, #112855); flex-shrink: 0; } @@ -20189,12 +20741,12 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-hikashop-cart__count { font-weight: 600; - color: var(--body-color); + color: var(--body-color, #e6ebf1); font-size: 1rem; } .mod-hikashop-cart__total { - color: var(--success); + color: var(--success, #4aa664); font-weight: 700; font-size: 1.25rem; margin-top: 0.25rem; @@ -20211,9 +20763,9 @@ nav[data-toggle=toc] .nav-link.active+ul{ display: flex; gap: 0.75rem; padding: 0.75rem; - background: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); + background: var(--body-bg, #0e1318); + border: 1px solid var(--border-color, #2b323b); + border-radius: var(--border-radius, .25rem); align-items: flex-start; } @@ -20225,7 +20777,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-hikashop-cart__product-image img { width: 100%; height: auto; - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); } .mod-hikashop-cart__product-details { @@ -20237,23 +20789,23 @@ nav[data-toggle=toc] .nav-link.active+ul{ font-weight: 600; margin-bottom: 0.25rem; line-height: 1.4; - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .mod-hikashop-cart__product-quantity { font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); margin-bottom: 0.25rem; } .mod-hikashop-cart__quantity-value { font-weight: 600; - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .mod-hikashop-cart__product-price { font-weight: 700; - color: var(--success); + color: var(--success, #4aa664); margin-top: 0.25rem; } @@ -20268,17 +20820,17 @@ nav[data-toggle=toc] .nav-link.active+ul{ width: 32px; height: 32px; border-radius: 50%; - background: var(--body-bg); - border: 1px solid var(--border-color); - color: var(--danger); + background: var(--body-bg, #0e1318); + border: 1px solid var(--border-color, #2b323b); + color: var(--danger, #c23a31); text-decoration: none; transition: all 0.2s; } .mod-hikashop-cart__remove-btn:hover { - background: var(--danger); + background: var(--danger, #c23a31); color: white; - border-color: var(--danger); + border-color: var(--danger, #c23a31); } .mod-hikashop-cart__actions { @@ -20289,7 +20841,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-hikashop-cart__btn { padding: 0.625rem 1rem; - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); text-align: center; text-decoration: none; font-weight: 600; @@ -20303,20 +20855,20 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-hikashop-cart__empty { text-align: center; padding: 2rem 1rem; - background: var(--secondary-bg); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); + background: var(--secondary-bg, #151b22); + border: 1px solid var(--border-color, #2b323b); + border-radius: var(--border-radius, .25rem); } .mod-hikashop-cart__empty-icon { font-size: 3rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); display: block; margin-bottom: 1rem; } .mod-hikashop-cart__empty-text { - color: var(--gray-600); + color: var(--gray-600, #48525d); margin: 0; } @@ -20338,15 +20890,15 @@ nav[data-toggle=toc] .nav-link.active+ul{ display: flex; gap: 0.75rem; padding: 1rem; - background: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); + background: var(--body-bg, #0e1318); + border: 1px solid var(--border-color, #2b323b); + border-radius: var(--border-radius, .25rem); transition: all 0.2s; } .mod-kunena-latest__item:hover { - background: var(--secondary-bg); - border-color: var(--color-primary); + background: var(--secondary-bg, #151b22); + border-color: var(--color-primary, #112855); } .mod-kunena-latest__avatar { @@ -20376,13 +20928,13 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-kunena-latest__title a { - color: var(--body-color); + color: var(--body-color, #e6ebf1); text-decoration: none; transition: color 0.2s; } .mod-kunena-latest__title a:hover { - color: var(--color-primary); + color: var(--color-primary, #112855); text-decoration: underline; } @@ -20391,7 +20943,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ flex-wrap: wrap; gap: 0.75rem; font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); margin-bottom: 0.5rem; } @@ -20402,18 +20954,18 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-kunena-latest__meta a { - color: var(--gray-600); + color: var(--gray-600, #48525d); text-decoration: none; transition: color 0.2s; } .mod-kunena-latest__meta a:hover { - color: var(--color-primary); + color: var(--color-primary, #112855); } .mod-kunena-latest__excerpt { font-size: 0.875rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); line-height: 1.6; margin-top: 0.5rem; } @@ -20433,9 +20985,9 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-kunena-latest__empty { text-align: center; padding: 2rem 1rem; - background: var(--secondary-bg); - border-radius: var(--border-radius); - color: var(--gray-600); + background: var(--secondary-bg, #151b22); + border-radius: var(--border-radius, .25rem); + color: var(--gray-600, #48525d); } /* === Mobile Responsive Adjustments === */ @@ -20504,8 +21056,8 @@ nav[data-toggle=toc] .nav-link.active+ul{ align-items: center; gap: 1rem; padding: 1rem; - background: var(--secondary-bg); - border-radius: var(--border-radius); + background: var(--secondary-bg, #151b22); + border-radius: var(--border-radius, .25rem); margin-bottom: 1rem; } @@ -20534,26 +21086,26 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-kunena-login__username a { - color: var(--body-color); + color: var(--body-color, #e6ebf1); text-decoration: none; } .mod-kunena-login__username a:hover { - color: var(--color-primary); + color: var(--color-primary, #112855); } .mod-kunena-login__rank { font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); } .mod-kunena-login__stats { display: flex; gap: 1.5rem; padding: 1rem; - background: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); + background: var(--body-bg, #0e1318); + border: 1px solid var(--border-color, #2b323b); + border-radius: var(--border-radius, .25rem); margin-bottom: 1rem; } @@ -20564,13 +21116,13 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-kunena-login__stat-label { - color: var(--gray-600); + color: var(--gray-600, #48525d); font-size: 0.875rem; } .mod-kunena-login__stat-value { font-weight: 600; - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .mod-kunena-login__form { @@ -20582,7 +21134,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-kunena-login__pretext, .mod-kunena-login__posttext { font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); line-height: 1.6; } @@ -20601,7 +21153,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-kunena-login__label { font-weight: 600; font-size: 0.875rem; - color: var(--body-color); + color: var(--body-color, #e6ebf1); } .mod-kunena-login__input { @@ -20609,14 +21161,14 @@ nav[data-toggle=toc] .nav-link.active+ul{ font-size: 1rem; line-height: 1.5; border: 1px solid var(--input-border-color, #dee2e6); - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); background: var(--input-bg, #fff); color: var(--input-color, #212529); min-height: 44px; } .mod-kunena-login__input:focus { - border-color: var(--color-primary); + border-color: var(--color-primary, #112855); outline: 0; box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } @@ -20649,7 +21201,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ padding: 0.625rem 1rem; font-size: 1rem; font-weight: 600; - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); min-height: 44px; display: inline-flex; align-items: center; @@ -20666,7 +21218,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ position: absolute; top: -8px; right: -8px; - background: var(--danger); + background: var(--danger, #c23a31); color: white; border-radius: 50%; width: 24px; @@ -20690,20 +21242,20 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-kunena-login__link { - color: var(--link-color); + color: var(--link-color, #8ab4f8); text-decoration: none; font-size: 0.875rem; display: flex; align-items: center; justify-content: space-between; padding: 0.5rem; - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); transition: background 0.2s; } .mod-kunena-login__link:hover { - background: var(--secondary-bg); - color: var(--link-hover-color); + background: var(--secondary-bg, #151b22); + color: var(--link-hover-color, #c3d6ff); } /* === mod_kunenasearch (Kunena Search) === */ @@ -20740,14 +21292,14 @@ nav[data-toggle=toc] .nav-link.active+ul{ font-size: 1rem; line-height: 1.5; border: 1px solid var(--input-border-color, #dee2e6); - border-radius: var(--border-radius); + border-radius: var(--border-radius, .25rem); background: var(--input-bg, #fff); color: var(--input-color, #212529); min-height: 44px; } .mod-kunena-search__input:focus { - border-color: var(--color-primary); + border-color: var(--color-primary, #112855); outline: 0; box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } @@ -20782,27 +21334,27 @@ nav[data-toggle=toc] .nav-link.active+ul{ align-items: center; gap: 1rem; padding: 1rem; - background: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); + background: var(--body-bg, #0e1318); + border: 1px solid var(--border-color, #2b323b); + border-radius: var(--border-radius, .25rem); transition: all 0.2s; } .mod-kunena-stats__stat:hover { - background: var(--secondary-bg); - border-color: var(--color-primary); + background: var(--secondary-bg, #151b22); + border-color: var(--color-primary, #112855); } .mod-kunena-stats__icon { font-size: 2rem; - color: var(--color-primary); + color: var(--color-primary, #112855); flex-shrink: 0; width: 48px; height: 48px; display: flex; align-items: center; justify-content: center; - background: var(--secondary-bg); + background: var(--secondary-bg, #151b22); border-radius: 50%; } @@ -20813,13 +21365,13 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-kunena-stats__value { font-size: 1.75rem; font-weight: 700; - color: var(--body-color); + color: var(--body-color, #e6ebf1); line-height: 1; margin-bottom: 0.25rem; } .mod-kunena-stats__value--link a { - color: var(--color-primary); + color: var(--color-primary, #112855); text-decoration: none; font-size: 1.125rem; } @@ -20830,7 +21382,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-kunena-stats__label { font-size: 0.875rem; - color: var(--gray-600); + color: var(--gray-600, #48525d); text-transform: uppercase; letter-spacing: 0.5px; } @@ -20851,9 +21403,9 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-osmembership__plan { - background: var(--body-bg); - border: 2px solid var(--border-color); - border-radius: var(--border-radius); + background: var(--body-bg, #0e1318); + border: 2px solid var(--border-color, #2b323b); + border-radius: var(--border-radius, .25rem); overflow: hidden; transition: all 0.3s; display: flex; @@ -20863,7 +21415,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-osmembership__plan:hover { transform: translateY(-4px); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); - border-color: var(--color-primary); + border-color: var(--color-primary, #112855); } .mod-osmembership__plan-image { @@ -20892,7 +21444,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-osmembership__plan-description { - color: var(--gray-600); + color: var(--gray-600, #48525d); line-height: 1.6; margin-bottom: 1.5rem; } @@ -20910,26 +21462,26 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-osmembership__currency { font-size: 1.5rem; - color: var(--color-primary); + color: var(--color-primary, #112855); font-weight: 600; } .mod-osmembership__amount { font-size: 2.5rem; font-weight: 700; - color: var(--color-primary); + color: var(--color-primary, #112855); line-height: 1; } .mod-osmembership__period { - color: var(--gray-600); + color: var(--gray-600, #48525d); font-size: 1rem; } .mod-osmembership__price--free { font-size: 2rem; font-weight: 700; - color: var(--success); + color: var(--success, #4aa664); } .mod-osmembership__features { @@ -20951,7 +21503,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ } .mod-osmembership__feature .icon-check { - color: var(--success); + color: var(--success, #4aa664); flex-shrink: 0; margin-top: 0.25rem; } @@ -20985,9 +21537,9 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-osmembership__empty { text-align: center; padding: 2rem 1rem; - background: var(--secondary-bg); - border-radius: var(--border-radius); - color: var(--gray-600); + background: var(--secondary-bg, #151b22); + border-radius: var(--border-radius, .25rem); + color: var(--gray-600, #48525d); } /* === Mobile Responsive Adjustments === */ @@ -21063,8 +21615,8 @@ max-width: 100%; /* === User Profile View === */ .cb-profile-responsive { -background: var(--body-bg); -border-radius: var(--border-radius); +background: var(--body-bg, #0e1318); +border-radius: var(--border-radius, .25rem); } .cb-profile__header { @@ -21073,8 +21625,8 @@ flex-direction: column; align-items: center; gap: 1.5rem; padding: 2rem; -background: var(--secondary-bg); -border-radius: var(--border-radius); +background: var(--secondary-bg, #151b22); +border-radius: var(--border-radius, .25rem); margin-bottom: 2rem; } @@ -21083,7 +21635,7 @@ width: 150px; height: 150px; border-radius: 50%; overflow: hidden; -border: 4px solid var(--body-bg); +border: 4px solid var(--body-bg, #0e1318); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } @@ -21101,7 +21653,7 @@ text-align: center; font-size: 1.75rem; font-weight: 700; margin: 0 0 0.5rem; -color: var(--heading-color); +color: var(--heading-color, #f1f5f9); } .cb-profile__status { @@ -21110,7 +21662,7 @@ align-items: center; gap: 0.5rem; padding: 0.5rem 1rem; background: var(--success-bg); -color: var(--success); +color: var(--success, #4aa664); border-radius: 2rem; font-size: 0.875rem; font-weight: 600; @@ -21128,7 +21680,7 @@ gap: 0.5rem; margin: 0 0 2rem; padding: 0; list-style: none; -border-bottom: 2px solid var(--border-color); +border-bottom: 2px solid var(--border-color, #2b323b); } .cb-profile__tab-item { @@ -21138,9 +21690,9 @@ margin: 0; .cb-profile__tab-link { display: block; padding: 0.75rem 1.5rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); text-decoration: none; -border-radius: var(--border-radius) var(--border-radius) 0 0; +border-radius: var(--border-radius, .25rem) var(--border-radius, .25rem) 0 0; transition: all 0.2s; min-height: 44px; display: flex; @@ -21149,16 +21701,16 @@ align-items: center; .cb-profile__tab-link:hover, .cb-profile__tab-link[aria-selected="true"] { -background: var(--color-primary); +background: var(--color-primary, #112855); color: white; } .cb-profile__tab-pane { display: none; padding: 1.5rem; -background: var(--body-bg); -border: 1px solid var(--border-color); -border-radius: var(--border-radius); +background: var(--body-bg, #0e1318); +border: 1px solid var(--border-color, #2b323b); +border-radius: var(--border-radius, .25rem); } .cb-profile__tab-pane[aria-selected="true"] { @@ -21168,8 +21720,8 @@ display: block; .cb-profile__tab-description { margin-bottom: 1.5rem; padding: 1rem; -background: var(--secondary-bg); -border-radius: var(--border-radius); +background: var(--secondary-bg, #151b22); +border-radius: var(--border-radius, .25rem); } .cb-profile__fields { @@ -21185,11 +21737,11 @@ gap: 0.5rem; .cb-profile__field-label { font-weight: 600; -color: var(--heading-color); +color: var(--heading-color, #f1f5f9); } .cb-profile__field-value { -color: var(--body-color); +color: var(--body-color, #e6ebf1); } /* === Users List View === */ @@ -21205,7 +21757,7 @@ margin-bottom: 2rem; font-size: 2rem; font-weight: 700; margin: 0 0 1.5rem; -color: var(--heading-color); +color: var(--heading-color, #f1f5f9); } .cb-userslist__search-form { @@ -21222,15 +21774,15 @@ width: 100%; flex: 1; min-height: 48px; padding: 0.75rem 1rem; -border: 1px solid var(--border-color); -border-radius: var(--border-radius); +border: 1px solid var(--border-color, #2b323b); +border-radius: var(--border-radius, .25rem); font-size: 16px; transition: all 0.2s; } .cb-userslist__search-input:focus { outline: none; -border-color: var(--color-primary); +border-color: var(--color-primary, #112855); box-shadow: 0 0 0 3px rgba(var(--color-primary-rgb), 0.1); } @@ -21256,9 +21808,9 @@ gap: 1.5rem; } .cb-userslist__user-card { -background: var(--body-bg); -border: 1px solid var(--border-color); -border-radius: var(--border-radius); +background: var(--body-bg, #0e1318); +border: 1px solid var(--border-color, #2b323b); +border-radius: var(--border-radius, .25rem); padding: 1.5rem; transition: all 0.3s; display: flex; @@ -21269,7 +21821,7 @@ gap: 1rem; .cb-userslist__user-card:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); -border-color: var(--color-primary); +border-color: var(--color-primary, #112855); } .cb-userslist__avatar { @@ -21297,12 +21849,12 @@ margin: 0 0 0.5rem; } .cb-userslist__username a { -color: var(--heading-color); +color: var(--heading-color, #f1f5f9); text-decoration: none; } .cb-userslist__username a:hover { -color: var(--color-primary); +color: var(--color-primary, #112855); } .cb-userslist__fields { @@ -21310,8 +21862,8 @@ display: grid; gap: 0.5rem; margin: 1rem 0; padding: 1rem; -background: var(--secondary-bg); -border-radius: var(--border-radius); +background: var(--secondary-bg, #151b22); +border-radius: var(--border-radius, .25rem); } .cb-userslist__field { @@ -21358,20 +21910,20 @@ text-align: center; font-size: 2rem; font-weight: 700; margin: 0 0 1rem; -color: var(--heading-color); +color: var(--heading-color, #f1f5f9); } .cb-register__intro { padding: 1rem; -background: var(--secondary-bg); -border-radius: var(--border-radius); +background: var(--secondary-bg, #151b22); +border-radius: var(--border-radius, .25rem); margin-bottom: 1.5rem; } .cb-register__form { -background: var(--body-bg); -border: 1px solid var(--border-color); -border-radius: var(--border-radius); +background: var(--body-bg, #0e1318); +border: 1px solid var(--border-color, #2b323b); +border-radius: var(--border-radius, .25rem); padding: 2rem; } @@ -21384,19 +21936,19 @@ padding: 0; .cb-register__legend { font-size: 1.5rem; font-weight: 700; -color: var(--heading-color); +color: var(--heading-color, #f1f5f9); margin: 0 0 1.5rem; padding: 0; width: 100%; -border-bottom: 2px solid var(--border-color); +border-bottom: 2px solid var(--border-color, #2b323b); padding-bottom: 0.75rem; } .cb-register__tab-description { margin-bottom: 1.5rem; padding: 1rem; -background: var(--secondary-bg); -border-radius: var(--border-radius); +background: var(--secondary-bg, #151b22); +border-radius: var(--border-radius, .25rem); } .cb-register__fields { @@ -21411,20 +21963,20 @@ gap: 0.5rem; .cb-register__label { font-weight: 600; -color: var(--heading-color); +color: var(--heading-color, #f1f5f9); display: flex; align-items: center; gap: 0.25rem; } .cb-register__required { -color: var(--danger); +color: var(--danger, #c23a31); font-weight: 700; } .cb-register__field-description { font-size: 0.875rem; -color: var(--gray-600); +color: var(--gray-600, #48525d); margin-top: 0.25rem; } @@ -21438,8 +21990,8 @@ margin-top: 0.25rem; width: 100%; min-height: 48px; padding: 0.75rem 1rem; -border: 1px solid var(--border-color); -border-radius: var(--border-radius); +border: 1px solid var(--border-color, #2b323b); +border-radius: var(--border-radius, .25rem); font-size: 16px; transition: all 0.2s; } @@ -21448,37 +22000,37 @@ transition: all 0.2s; .cb-register__input-wrapper select:focus, .cb-register__input-wrapper textarea:focus { outline: none; -border-color: var(--color-primary); +border-color: var(--color-primary, #112855); box-shadow: 0 0 0 3px rgba(var(--color-primary-rgb), 0.1); } .cb-register__field--required .cb-register__input-wrapper input, .cb-register__field--required .cb-register__input-wrapper select, .cb-register__field--required .cb-register__input-wrapper textarea { -border-left: 3px solid var(--danger); +border-left: 3px solid var(--danger, #c23a31); } .cb-register__error { -color: var(--danger); +color: var(--danger, #c23a31); font-size: 0.875rem; margin-top: 0.25rem; padding: 0.5rem; background: var(--danger-bg); -border-radius: var(--border-radius); +border-radius: var(--border-radius, .25rem); } .cb-register__captcha { margin: 1.5rem 0; padding: 1.5rem; -background: var(--secondary-bg); -border-radius: var(--border-radius); +background: var(--secondary-bg, #151b22); +border-radius: var(--border-radius, .25rem); } .cb-register__terms { margin: 1.5rem 0; padding: 1rem; -background: var(--secondary-bg); -border-radius: var(--border-radius); +background: var(--secondary-bg, #151b22); +border-radius: var(--border-radius, .25rem); } .cb-register__terms-checkbox { @@ -21524,9 +22076,9 @@ padding: 2rem 1rem; .cb-login__container { width: 100%; max-width: 450px; -background: var(--body-bg); -border: 1px solid var(--border-color); -border-radius: var(--border-radius); +background: var(--body-bg, #0e1318); +border: 1px solid var(--border-color, #2b323b); +border-radius: var(--border-radius, .25rem); padding: 2rem; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } @@ -21540,7 +22092,7 @@ margin-bottom: 2rem; font-size: 2rem; font-weight: 700; margin: 0; -color: var(--heading-color); +color: var(--heading-color, #f1f5f9); } .cb-login__form { @@ -21555,14 +22107,14 @@ gap: 0.5rem; .cb-login__label { font-weight: 600; -color: var(--heading-color); +color: var(--heading-color, #f1f5f9); display: flex; align-items: center; gap: 0.25rem; } .cb-login__required { -color: var(--danger); +color: var(--danger, #c23a31); font-weight: 700; } @@ -21570,15 +22122,15 @@ font-weight: 700; width: 100%; min-height: 48px; padding: 0.75rem 1rem; -border: 1px solid var(--border-color); -border-radius: var(--border-radius); +border: 1px solid var(--border-color, #2b323b); +border-radius: var(--border-radius, .25rem); font-size: 16px; transition: all 0.2s; } .cb-login__input:focus { outline: none; -border-color: var(--color-primary); +border-color: var(--color-primary, #112855); box-shadow: 0 0 0 3px rgba(var(--color-primary-rgb), 0.1); } @@ -21618,7 +22170,7 @@ transition: all 0.2s; .cb-login__links { margin-top: 2rem; padding-top: 2rem; -border-top: 1px solid var(--border-color); +border-top: 1px solid var(--border-color, #2b323b); display: flex; flex-direction: column; gap: 1rem; @@ -21633,7 +22185,7 @@ display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; -color: var(--link-color); +color: var(--link-color, #8ab4f8); text-decoration: none; min-height: 44px; padding: 0.5rem; @@ -21641,7 +22193,7 @@ transition: all 0.2s; } .cb-login__link-item:hover { -color: var(--color-primary); +color: var(--color-primary, #112855); } /* === Responsive Design === */ @@ -21778,7 +22330,7 @@ margin-bottom: 1.5rem; font-size: 1.75rem; font-weight: 700; margin: 0; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-eventslist__list { @@ -21828,13 +22380,13 @@ margin: 0.5rem 0; } .jem-eventslist__link { -color: var(--link-color); +color: var(--link-color, #8ab4f8); text-decoration: none; transition: color 0.2s ease; } .jem-eventslist__link:hover { -color: var(--link-hover-color); +color: var(--link-hover-color, #c3d6ff); text-decoration: underline; } @@ -21844,7 +22396,7 @@ align-items: center; gap: 0.5rem; margin: 0.75rem 0; font-size: 0.9375rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-eventslist__venue-icon { @@ -21852,7 +22404,7 @@ font-size: 1rem; } .jem-eventslist__venue-link { -color: var(--link-color); +color: var(--link-color, #8ab4f8); text-decoration: none; } @@ -21862,7 +22414,7 @@ text-decoration: underline; .jem-eventslist__description { margin: 1rem 0; -color: var(--body-color); +color: var(--body-color, #e6ebf1); line-height: 1.6; } @@ -21877,7 +22429,7 @@ margin: 1rem 0; display: inline-block; padding: 0.25rem 0.75rem; background: var(--primary-color, #007bff); -color: var(--white); +color: var(--white, #fff); border-radius: 1rem; font-size: 0.8125rem; font-weight: 500; @@ -21892,7 +22444,7 @@ display: inline-block; padding: 0.625rem 1.25rem; min-height: 44px; background: var(--btn-primary-bg, #007bff); -color: var(--white); +color: var(--white, #fff); border: none; border-radius: var(--border-radius, 0.375rem); text-decoration: none; @@ -21904,7 +22456,7 @@ cursor: pointer; .jem-eventslist__button:hover { background: var(--btn-primary-hover-bg, #0056b3); -color: var(--white); +color: var(--white, #fff); text-decoration: none; } @@ -21944,7 +22496,7 @@ margin-bottom: 1.5rem; font-size: 2rem; font-weight: 700; margin: 0; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-event__image-wrapper { @@ -21991,23 +22543,23 @@ flex: 1; .jem-event__meta-label { display: block; margin-bottom: 0.25rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-event__datetime, .jem-event__time-value, .jem-event__venue-name { -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-event__venue-link { -color: var(--link-color); +color: var(--link-color, #8ab4f8); text-decoration: none; font-weight: 500; } .jem-event__venue-link:hover { -color: var(--link-hover-color); +color: var(--link-hover-color, #c3d6ff); text-decoration: underline; } @@ -22033,7 +22585,7 @@ margin-top: 0.5rem; display: inline-block; padding: 0.25rem 0.75rem; background: var(--primary-color, #007bff); -color: var(--white); +color: var(--white, #fff); border-radius: 1rem; font-size: 0.8125rem; font-weight: 500; @@ -22047,12 +22599,12 @@ margin: 2rem 0; font-size: 1.5rem; font-weight: 600; margin-bottom: 1rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-event__description-content { line-height: 1.8; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-event__registration, @@ -22069,11 +22621,11 @@ margin: 1.5rem 0; font-size: 1.25rem; font-weight: 600; margin-bottom: 1rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-event__contact-link { -color: var(--link-color); +color: var(--link-color, #8ab4f8); text-decoration: none; } @@ -22090,7 +22642,7 @@ display: inline-block; padding: 0.625rem 1.25rem; min-height: 44px; background: var(--btn-secondary-bg, #6c757d); -color: var(--white); +color: var(--white, #fff); border: none; border-radius: var(--border-radius, 0.375rem); text-decoration: none; @@ -22102,7 +22654,7 @@ cursor: pointer; .jem-event__button:hover { background: var(--btn-secondary-hover-bg, #5a6268); -color: var(--white); +color: var(--white, #fff); text-decoration: none; } @@ -22127,7 +22679,7 @@ margin-bottom: 1.5rem; font-size: 1.75rem; font-weight: 700; margin: 0; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-calendar__navigation { @@ -22147,7 +22699,7 @@ justify-content: center; width: 44px; height: 44px; background: var(--btn-primary-bg, #007bff); -color: var(--white); +color: var(--white, #fff); border: none; border-radius: 50%; text-decoration: none; @@ -22157,14 +22709,14 @@ transition: background-color 0.2s ease; .jem-calendar__nav-button:hover { background: var(--btn-primary-hover-bg, #0056b3); -color: var(--white); +color: var(--white, #fff); } .jem-calendar__current-month { font-size: 1.25rem; font-weight: 600; margin: 0; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-calendar__grid { @@ -22186,7 +22738,7 @@ margin-bottom: 0.5rem; text-align: center; font-weight: 600; font-size: 0.875rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); padding: 0.5rem 0; } @@ -22203,7 +22755,7 @@ flex-direction: column; align-items: center; justify-content: center; padding: 0.5rem; -background: var(--white); +background: var(--white, #fff); border: 1px solid var(--border-color, #dee2e6); border-radius: var(--border-radius, 0.375rem); cursor: pointer; @@ -22232,7 +22784,7 @@ font-weight: 700; .jem-calendar__day-number { font-size: 0.9375rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-calendar__event-indicator { @@ -22242,7 +22794,7 @@ justify-content: center; min-width: 1.25rem; height: 1.25rem; background: var(--primary-color, #007bff); -color: var(--white); +color: var(--white, #fff); border-radius: 50%; font-size: 0.6875rem; font-weight: 600; @@ -22257,7 +22809,7 @@ margin-top: 2rem; font-size: 1.5rem; font-weight: 600; margin-bottom: 1rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-calendar__events { @@ -22286,18 +22838,18 @@ margin: 0.5rem 0; } .jem-calendar__event-link { -color: var(--link-color); +color: var(--link-color, #8ab4f8); text-decoration: none; } .jem-calendar__event-link:hover { -color: var(--link-hover-color); +color: var(--link-hover-color, #c3d6ff); text-decoration: underline; } .jem-calendar__event-venue { font-size: 0.9375rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); margin-top: 0.5rem; } @@ -22322,7 +22874,7 @@ margin-bottom: 1.5rem; font-size: 2rem; font-weight: 700; margin: 0; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-venue__image-wrapper { @@ -22369,12 +22921,12 @@ flex: 1; .jem-venue__info-label { display: block; margin-bottom: 0.5rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-venue__address-content { font-style: normal; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-venue__street, @@ -22386,7 +22938,7 @@ margin-bottom: 0.25rem; } .jem-venue__link { -color: var(--link-color); +color: var(--link-color, #8ab4f8); text-decoration: none; word-break: break-all; } @@ -22403,12 +22955,12 @@ margin: 2rem 0; font-size: 1.5rem; font-weight: 600; margin-bottom: 1rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-venue__description-content { line-height: 1.8; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-venue__map { @@ -22419,7 +22971,7 @@ margin: 2rem 0; font-size: 1.5rem; font-weight: 600; margin-bottom: 1rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-venue__map-container { @@ -22439,7 +22991,7 @@ display: inline-block; padding: 0.625rem 1.25rem; min-height: 44px; background: var(--btn-primary-bg, #007bff); -color: var(--white); +color: var(--white, #fff); border: none; border-radius: var(--border-radius, 0.375rem); text-decoration: none; @@ -22450,7 +23002,7 @@ transition: background-color 0.2s ease; .jem-venue__map-link:hover { background: var(--btn-primary-hover-bg, #0056b3); -color: var(--white); +color: var(--white, #fff); text-decoration: none; } @@ -22462,7 +23014,7 @@ margin: 2rem 0; font-size: 1.5rem; font-weight: 600; margin-bottom: 1rem; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-venue__events-list { @@ -22491,12 +23043,12 @@ margin: 0.5rem 0; } .jem-venue__event-link { -color: var(--link-color); +color: var(--link-color, #8ab4f8); text-decoration: none; } .jem-venue__event-link:hover { -color: var(--link-hover-color); +color: var(--link-hover-color, #c3d6ff); text-decoration: underline; } @@ -22509,7 +23061,7 @@ display: inline-block; padding: 0.625rem 1.25rem; min-height: 44px; background: var(--btn-secondary-bg, #6c757d); -color: var(--white); +color: var(--white, #fff); border: none; border-radius: var(--border-radius, 0.375rem); text-decoration: none; @@ -22521,7 +23073,7 @@ cursor: pointer; .jem-venue__button:hover { background: var(--btn-secondary-hover-bg, #5a6268); -color: var(--white); +color: var(--white, #fff); text-decoration: none; } @@ -22546,7 +23098,7 @@ margin-bottom: 1.5rem; font-size: 1.75rem; font-weight: 700; margin: 0; -color: var(--body-color); +color: var(--body-color, #e6ebf1); } .jem-categories__list { @@ -22590,19 +23142,19 @@ margin: 0.5rem 0; } .jem-categories__link { -color: var(--link-color); +color: var(--link-color, #8ab4f8); text-decoration: none; transition: color 0.2s ease; } .jem-categories__link:hover { -color: var(--link-hover-color); +color: var(--link-hover-color, #c3d6ff); text-decoration: underline; } .jem-categories__description { margin: 1rem 0; -color: var(--body-color); +color: var(--body-color, #e6ebf1); line-height: 1.6; } @@ -22625,7 +23177,7 @@ display: inline-block; padding: 0.625rem 1.25rem; min-height: 44px; background: var(--btn-primary-bg, #007bff); -color: var(--white); +color: var(--white, #fff); border: none; border-radius: var(--border-radius, 0.375rem); text-decoration: none; @@ -22637,7 +23189,7 @@ cursor: pointer; .jem-categories__button:hover { background: var(--btn-primary-hover-bg, #0056b3); -color: var(--white); +color: var(--white, #fff); text-decoration: none; } @@ -22744,19 +23296,3 @@ padding: 0.25rem; font-size: 0.8125rem; } } - -/* ── Category Blog — image cards ─────────────────────────── */ -.com-content-category-blog .blog-item .item-image { - width: 100%; - max-height: 250px; - overflow: hidden; - margin: 0 0 1rem 0; - float: none; -} -.com-content-category-blog .blog-item .item-image img { - width: 100%; - height: auto; - object-fit: cover; - object-position: center top; - display: block; -} diff --git a/src/media/css/theme/dark.standard.css b/src/media/css/theme/dark.standard.css index 1ac1186..97515a7 100644 --- a/src/media/css/theme/dark.standard.css +++ b/src/media/css/theme/dark.standard.css @@ -5,16 +5,6 @@ SPDX-License-Identifier: GPL-3.0-or-later - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia - PATH: ./media/templates/site/mokocassiopeia/css/global/dark/colors_standard.css - VERSION: 03.05.00 - BRIEF: Standard dark mode color definitions for MokoCassiopeia template - */ - /* ----------------------------------------------- * DARK THEME * --------------------------------------------- */ @@ -43,11 +33,6 @@ color-scheme: dark; --link-hover-color-rgb: 195, 214, 255; --link-active-color: var(--link-color); -/* ===== OFFCANVAS ===== */ ---offcanvas-color: var(--body-color); ---offcanvas-padding-x: 1rem; ---offcanvas-padding-y: 1rem; - /* ===== NAVBAR ===== */ --navbar-padding-x: 1rem; --navbar-padding-y: 0.5rem; @@ -93,8 +78,9 @@ color-scheme: dark; --tertiary-color: #e6ebf180; --tertiary-color-rgb: 230, 235, 241; --muted-color: #6d757e; ---code-color: #ff7abd; +--code-color: black; --code-color-ink: var(--code-color, #e93f8e); +--code-bg-color: lightgreen; --highlight-color: #111; --highlight-bg: #ffe28a1a; @@ -530,10 +516,65 @@ color-scheme: dark; --hero-bg-size: cover; --hero-border-bottom: solid var(--accent-color-secondary); --hero-overlay-bg: hsla(0, 0%, 0%, 0.3); +--hero-overlay-bg-position: center; +--hero-overlay-bg-size: cover; --hero-overlay-padding: 1em; --hero-overlay-text-align: center; --hero-overlay-text-color: var(--body-color); +/* ===== HERO VARIANTS ===== */ +/* Primary — deep navy, dark overlay */ +--hero-primary-bg-color: #0d1e3a; +--hero-primary-overlay: linear-gradient(rgba(13, 30, 58, .65), rgba(13, 30, 58, .65)); +--hero-primary-color: #f1f5f9; + +/* Secondary — darker navy, heavier overlay */ +--hero-secondary-bg-color: #080f1e; +--hero-secondary-overlay: linear-gradient(rgba(8, 15, 30, .80), rgba(8, 15, 30, .80)); +--hero-secondary-color: #f1f5f9; + +/* ===== HERO CARD (inner .hero element) ===== */ +/* Default card — uses primary variant values */ +--hero-card-bg: var(--hero-primary-bg-color); +--hero-card-color: white; +--hero-card-overlay: var(--hero-primary-overlay); +--hero-card-border-radius: .5rem; +--hero-card-padding-x: 2rem; +--hero-card-padding-y: 3rem; +--hero-card-max-width: 800px; + +/* Alternative card — uses secondary variant values */ +--hero-alt-card-bg: var(--hero-secondary-bg-color); +--hero-alt-card-color: var(--hero-secondary-color); +--hero-alt-card-overlay: var(--hero-secondary-overlay); +--hero-alt-card-border-radius: .5rem; +--hero-alt-card-padding-x: 2rem; +--hero-alt-card-padding-y: 3rem; +--hero-alt-card-max-width: 600px; + +/* ===== BLOCK COLORS (top-a / top-b / bottom-a / bottom-b) ===== */ +--block-color-1: var(--secondary-bg); +--block-text-1: var(--body-color); + +--block-color-2: var(--accent-color-primary); +--block-text-2: #fff; + +--block-color-3: rgba(238, 194, 52, .15); +--block-text-3: var(--body-color); + +--block-color-4: rgba(74, 166, 100, .15); +--block-text-4: var(--body-color); + +/* ===== BLOCK COLOR OVERRIDES ===== */ +--block-highlight-bg: var(--accent-color-primary); +--block-highlight-text: #fff; + +--block-cta-bg: var(--color-primary); +--block-cta-text: #f1f5f9; + +--block-alert-bg: var(--danger, #c23a31); +--block-alert-text: #fff; + /* ===== OFFCANVAS ===== */ --offcanvas-zindex: 1045; --offcanvas-width: 400px; @@ -790,7 +831,7 @@ color-scheme: dark; --btn-font-weight: 400; --btn-line-height: 1.5; --btn-color: var(--white); - --btn-bg: transparent; + --btn-bg: var(--body-bg); --btn-border-width: 1px; --btn-border-color: transparent; --btn-border-radius: 0.25rem; diff --git a/src/media/css/theme/index.html b/src/media/css/theme/index.html index 8b13789..1a6c6cf 100644 --- a/src/media/css/theme/index.html +++ b/src/media/css/theme/index.html @@ -1 +1,76 @@ + + + + + + + Redirecting… + + + + + + + + + + + + + + + + + + + +
Redirecting to the site root… If you are not redirected, click here.
+ + diff --git a/src/media/css/theme/light.standard.css b/src/media/css/theme/light.standard.css index a34b34e..3ca6e62 100644 --- a/src/media/css/theme/light.standard.css +++ b/src/media/css/theme/light.standard.css @@ -5,16 +5,6 @@ SPDX-License-Identifier: GPL-3.0-or-later - - - # FILE INFORMATION - DEFGROUP: Joomla.Template.Site - INGROUP: MokoCassiopeia - PATH: ./media/templates/site/mokocassiopeia/css/global/light/colors_standard.css - VERSION: 03.05.00 - BRIEF: Standard light mode color definitions for MokoCassiopeia template - */ - /* ----------------------------------------------- * LIGHT THEME * --------------------------------------------- */ @@ -42,11 +32,6 @@ color-scheme: light; --link-hover-color-rgb: 66, 64, 119; --link-active-color: var(--link-color); -/* ===== OFFCANVAS ===== */ ---offcanvas-color: var(--body-color); ---offcanvas-padding-x: 1rem; ---offcanvas-padding-y: 1rem; - /* ===== NAVBAR ===== */ --navbar-padding-x: 1rem; --navbar-padding-y: 0.5rem; @@ -92,8 +77,9 @@ color-scheme: light; --tertiary-color: #22262a80; --tertiary-color-rgb: 34, 38, 42; --muted-color: #6d757e; ---code-color: #e93f8e; +--code-color: black; --code-color-ink: var(--code-color, #e93f8e); +--code-bg-color: lightgreen; --highlight-color: #22262a; --highlight-bg: #fbeea8; @@ -529,10 +515,65 @@ color-scheme: light; --hero-bg-size: cover; --hero-border-bottom: solid var(--accent-color-secondary); --hero-overlay-bg: hsla(0, 0%, 0%, 0.1); +--hero-overlay-bg-position: center; +--hero-overlay-bg-size: cover; --hero-overlay-padding: 1em; --hero-overlay-text-align: center; --hero-overlay-text-color: var(--body-color); +/* ===== HERO VARIANTS ===== */ +/* Primary — sky blue, light overlay */ +--hero-primary-bg-color: var(--color-primary); +--hero-primary-overlay: linear-gradient(rgba(163, 205, 226, .45), rgba(163, 205, 226, .45)); +--hero-primary-color: var(--color-primary); + +/* Secondary — navy, stronger overlay */ +--hero-secondary-bg-color: var(--color-primary); +--hero-secondary-overlay: linear-gradient(rgba(17, 40, 85, .75), rgba(17, 40, 85, .75)); +--hero-secondary-color: #f1f5f9; + +/* ===== HERO CARD (inner .hero element) ===== */ +/* Default card — uses primary variant values */ +--hero-card-bg: var(--hero-primary-bg-color); +--hero-card-color: white; +--hero-card-overlay: var(--hero-primary-overlay); +--hero-card-border-radius: .5rem; +--hero-card-padding-x: 2rem; +--hero-card-padding-y: 3rem; +--hero-card-max-width: 800px; + +/* Alternative card — uses secondary variant values */ +--hero-alt-card-bg: var(--hero-secondary-bg-color); +--hero-alt-card-color: var(--hero-secondary-color); +--hero-alt-card-overlay: var(--hero-secondary-overlay); +--hero-alt-card-border-radius: .5rem; +--hero-alt-card-padding-x: 2rem; +--hero-alt-card-padding-y: 3rem; +--hero-alt-card-max-width: 600px; + +/* ===== BLOCK COLORS (top-a / top-b / bottom-a / bottom-b) ===== */ +--block-color-1: var(--color-primary); +--block-text-1: var(--body-color); + +--block-color-2: var(--accent-color-primary); +--block-text-2: #fff; + +--block-color-3: var(--warning, #eec234); +--block-text-3: var(--body-color); + +--block-color-4: var(--success-bg-subtle, #eef7f0); +--block-text-4: var(--body-color); + +/* ===== BLOCK COLOR OVERRIDES ===== */ +--block-highlight-bg: var(--accent-color-primary); +--block-highlight-text: #fff; + +--block-cta-bg: var(--color-primary); +--block-cta-text: #fff; + +--block-alert-bg: var(--danger, #a51f18); +--block-alert-text: #fff; + /* ===== OFFCANVAS ===== */ --offcanvas-zindex: 1045; --offcanvas-width: 400px; @@ -789,7 +830,7 @@ color-scheme: light; --btn-font-weight: 400; --btn-line-height: 1.5; --btn-color: hsl(210, 11%, 15%); ---btn-bg: transparent; +--btn-bg: var(--body-bg); --btn-border-width: 1px; --btn-border-color: transparent; --btn-border-radius: 0.25rem; diff --git a/src/media/fonts/GOOGLE_FONTS_README.md b/src/media/fonts/GOOGLE_FONTS_README.md index ddb0464..52a54ef 100644 --- a/src/media/fonts/GOOGLE_FONTS_README.md +++ b/src/media/fonts/GOOGLE_FONTS_README.md @@ -8,7 +8,7 @@ INGROUP: MokoCassiopeia.Documentation REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia FILE: src/media/fonts/GOOGLE_FONTS_README.md - VERSION: 03.08.04 + VERSION: 03.09.02 BRIEF: Instructions for downloading Google Fonts for self-hosting --> diff --git a/src/media/fonts/index.html b/src/media/fonts/index.html index 480348d..1a6c6cf 100644 --- a/src/media/fonts/index.html +++ b/src/media/fonts/index.html @@ -1,27 +1,8 @@ - diff --git a/src/media/images/index.html b/src/media/images/index.html index 480348d..1a6c6cf 100644 --- a/src/media/images/index.html +++ b/src/media/images/index.html @@ -1,27 +1,8 @@ - diff --git a/src/media/index.html b/src/media/index.html index 480348d..1a6c6cf 100644 --- a/src/media/index.html +++ b/src/media/index.html @@ -1,27 +1,8 @@ - diff --git a/src/media/js/gtm.js b/src/media/js/gtm.js index 31c9318..b2cbeec 100644 --- a/src/media/js/gtm.js +++ b/src/media/js/gtm.js @@ -3,24 +3,6 @@ This file is part of a Moko Consulting project. SPDX-License-Identifier: GPL-3.0-or-later - - - - # FILE INFORMATION - DEFGROUP: Joomla Template - FILE: media/templates/site/moko-cassiopeia/js/gtm.js - HEADER VERSION: 1.0 - VERSION: 2.0 - BRIEF: Safe, configurable Google Tag Manager loader for MokoCassiopeia. - PATH: ./media/templates/site/moko-cassiopeia/js/gtm.js - NOTE: Place the
+ +

21. Branded Bootstrap 5 Showcase

+

Comprehensive component demos using MokoCassiopeia's brand variables. Mirrors the live Joomla article at /style/branded-bootstrap5.

+ + +
+

Brand + Bootstrap Showcase

+

Comprehensive components with toggleable code samples

+
+ + +
+Brand Nav +Home +About +Contact +
+ + +
+
    +
  1. Home
  2. +
  3. Style
  4. +
  5. Branded Bootstrap5
  6. +
+
+ + +

Typography

+
+
+

H1 Heading

+

H2 Heading

+

H3 Heading

+

H4 Heading

+
H5 Heading
+
H6 Heading
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.

+

Curabitur ullamcorper nec nisi a themed link. Nulla vitae <section> purus.

+
+

"Design is intelligence made visible."

+
— Alina Wheeler
+
+
+
+ + +

Buttons & Button Groups

+
+ + + + + + + + + +
+
+ + + +
+ + +

Badges & Alerts

+
+Primary +Secondary +Success +Warning +Danger +Accent +
+
+Primary: Vivamus sagittis lacus vel augue. +
+
+Cras mattis consectetur purus sit amet fermentum. +
+
+Brand alert — Aenean lacinia bibendum nulla sed consectetur. +
+ + +

Tables

+
+ + + + + + + +
#NameStatusNotes
1AlphaActiveLorem ipsum dolor sit amet.
2BetaPendingInteger posuere erat a ante.
3GammaBlockedDonec id elit non mi porta.
+
+ + +

Branded Forms

+
+
+
+ + +
+
+ + +
+
+
+ +
+@ + + +
+
+ +
+ + +

Branded Cards & List Groups

+
+
+
+
Featured
+
+
Card title
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.

+ +
+
+
+
+
+
Active item
+
Second item
+
With badge 4
+
+
+
+ + +

Breadcrumb & Pagination

+
+
    +
  1. Home /
  2. +
  3. Library /
  4. +
  5. Data
  6. +
+
+
+
    +
  • Previous
  • +
  • 1
  • +
  • 2
  • +
  • 3
  • +
  • Next
  • +
+
+ + +

Progress Bars

+
+
+
25%
+
+
+
65%
+
+
+ + +

CSS Variable Swatches (Computed)

+

Visual preview of key variables with their resolved values displayed via JavaScript.

+
+
+
+
--color-primary
+
+
+
+
--color-link
+
+
+
+
--color-hover
+
+
+
+
--accent-color-primary
+
+
+
+
--accent-color-secondary
+
+
+
+
--nav-bg-color
+
+
+
+
--body-bg
+
+
+
+
--body-color
+
+
+
+
--border-color
+
+
+

MokoCassiopeia Theme Test Sheet — v03.09.02 — © 2026 Moko Consulting @@ -590,6 +799,19 @@ pre { background: var(--secondary-bg, #eaedf0); color: var(--body-color); paddin