diff --git a/.github/CLAUDE.md b/.github/CLAUDE.md index 4e7b705..9803910 100644 --- a/.github/CLAUDE.md +++ b/.github/CLAUDE.md @@ -8,12 +8,12 @@ SPDX-License-Identifier: GPL-3.0-or-later # FILE INFORMATION DEFGROUP: MokoStandards.Templates.GitHub INGROUP: MokoStandards.Templates -REPO: https://github.com/mokoconsulting-tech/MokoStandards +REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards PATH: /templates/github/copilot-instructions.joomla.md.template VERSION: XX.YY.ZZ BRIEF: GitHub Copilot custom instructions template for Joomla/MokoWaaS governed repositories NOTE: Synced to .github/copilot-instructions.md in all Joomla/WaaS repos via bulk sync. - Tokens replaced at sync time: MokoCassiopeia, https://github.com/mokoconsulting-tech/MokoCassiopeia, {{EXTENSION_NAME}}, + Tokens replaced at sync time: MokoCassiopeia, https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia, {{EXTENSION_NAME}}, {{EXTENSION_TYPE}}, {{EXTENSION_ELEMENT}} --> @@ -37,7 +37,7 @@ NOTE: Synced to .github/copilot-instructions.md in all Joomla/WaaS repos via bul > | Placeholder | Where to find the value | > |---|---| > | `MokoCassiopeia` | The GitHub repository name (visible in the URL, `README.md` heading, or `git remote -v`) | -> | `https://github.com/mokoconsulting-tech/MokoCassiopeia` | Full GitHub URL, e.g. `https://github.com/mokoconsulting-tech/` | +> | `https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia` | Full GitHub URL, e.g. `https://git.mokoconsulting.tech/MokoConsulting/` | > | `{{EXTENSION_NAME}}` | The `` element in `manifest.xml` at the repository root | > | `{{EXTENSION_TYPE}}` | The `type` attribute of the `` tag in `manifest.xml` (`component`, `module`, `plugin`, or `template`) | > | `{{EXTENSION_ELEMENT}}` | The `` tag in `manifest.xml`, or the filename prefix (e.g. `com_myextension`, `mod_mymodule`) | @@ -48,9 +48,9 @@ NOTE: Synced to .github/copilot-instructions.md in all Joomla/WaaS repos via bul ## What This Repo Is -This is a **Moko Consulting MokoWaaS** (Joomla) repository governed by [MokoStandards](https://github.com/mokoconsulting-tech/MokoStandards). All coding standards, workflows, and policies are defined there and enforced here via bulk sync. +This is a **Moko Consulting MokoWaaS** (Joomla) repository governed by [MokoStandards](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards). All coding standards, workflows, and policies are defined there and enforced here via bulk sync. -Repository URL: https://github.com/mokoconsulting-tech/MokoCassiopeia +Repository URL: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia Extension name: **{{EXTENSION_NAME}}** Extension type: **{{EXTENSION_TYPE}}** (`{{EXTENSION_ELEMENT}}`) Platform: **Joomla 4.x / MokoWaaS** @@ -79,7 +79,7 @@ Every new file needs a copyright header as its first content. * FILE INFORMATION * DEFGROUP: MokoCassiopeia.{{EXTENSION_TYPE}} * INGROUP: MokoCassiopeia - * REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia * PATH: /path/to/file.php * VERSION: XX.YY.ZZ * BRIEF: One-line description of purpose @@ -100,7 +100,7 @@ SPDX-License-Identifier: GPL-3.0-or-later # FILE INFORMATION DEFGROUP: MokoCassiopeia.Documentation INGROUP: MokoCassiopeia -REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia +REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia PATH: /docs/file.md VERSION: XX.YY.ZZ BRIEF: One-line description @@ -138,7 +138,7 @@ The version in `README.md` **must always match** the `` tag in `manifes 01.02.04 - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/01.02.04/{{EXTENSION_ELEMENT}}-01.02.04.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/01.02.04/{{EXTENSION_ELEMENT}}-01.02.04.zip @@ -191,7 +191,7 @@ The `manifest.xml` must reference it via: ```xml - https://github.com/mokoconsulting-tech/MokoCassiopeia/raw/main/updates.xml + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/raw/main/updates.xml ``` @@ -238,16 +238,16 @@ token: ${{ secrets.GITHUB_TOKEN }} ## MokoStandards Reference -This repository is governed by [MokoStandards](https://github.com/mokoconsulting-tech/MokoStandards). Authoritative policies: +This repository is governed by [MokoStandards](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards). Authoritative policies: | Document | Purpose | |----------|---------| -| [file-header-standards.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/policy/file-header-standards.md) | Copyright-header rules for every file type | -| [coding-style-guide.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/policy/coding-style-guide.md) | Naming and formatting conventions | -| [branching-strategy.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/policy/branching-strategy.md) | Branch naming, hierarchy, and release workflow | -| [merge-strategy.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/policy/merge-strategy.md) | Squash-merge policy and PR title/body conventions | -| [changelog-standards.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/policy/changelog-standards.md) | How and when to update CHANGELOG.md | -| [joomla-development-guide.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/guide/waas/joomla-development-guide.md) | MokoWaaS Joomla extension development guide | +| [file-header-standards.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/policy/file-header-standards.md) | Copyright-header rules for every file type | +| [coding-style-guide.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/policy/coding-style-guide.md) | Naming and formatting conventions | +| [branching-strategy.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/policy/branching-strategy.md) | Branch naming, hierarchy, and release workflow | +| [merge-strategy.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/policy/merge-strategy.md) | Squash-merge policy and PR title/body conventions | +| [changelog-standards.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/policy/changelog-standards.md) | How and when to update CHANGELOG.md | +| [joomla-development-guide.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/guide/waas/joomla-development-guide.md) | MokoWaaS Joomla extension development guide | --- diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 7edc8bc..e9f2f60 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -8,10 +8,10 @@ contact_links: url: https://mokoconsulting.tech/ about: Get help or ask questions through our website - name: πŸ“š MokoStandards Documentation - url: https://github.com/mokoconsulting-tech/MokoStandards + url: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards about: View our coding standards and best practices - name: πŸ”’ Report a Security Vulnerability - url: https://github.com/mokoconsulting-tech/.github-private/security/advisories/new + url: https://git.mokoconsulting.tech/MokoConsulting/.github-private/security/advisories/new about: Report security vulnerabilities privately (for critical issues) - name: πŸ’‘ Community Discussions url: https://github.com/orgs/mokoconsulting-tech/discussions diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 4c5fd3c..7b76dc9 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -37,7 +37,7 @@ If you have ideas about how this could be implemented, share them here: Add any other context, mockups, or screenshots about the feature request here. ## Relevant Standards -Does this relate to any standards in [MokoStandards](https://github.com/mokoconsulting-tech/MokoStandards)? +Does this relate to any standards in [MokoStandards](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards)? - [ ] Accessibility (WCAG 2.1 AA) - [ ] Localization (en_US/en_GB) - [ ] Security best practices diff --git a/.github/ISSUE_TEMPLATE/security.md b/.github/ISSUE_TEMPLATE/security.md index 973e961..f57b284 100644 --- a/.github/ISSUE_TEMPLATE/security.md +++ b/.github/ISSUE_TEMPLATE/security.md @@ -35,7 +35,7 @@ Use this template only for: ## Standards Reference -Does this relate to security standards in [MokoStandards](https://github.com/mokoconsulting-tech/MokoStandards)? +Does this relate to security standards in [MokoStandards](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards)? - [ ] SPDX license identifiers - [ ] Secret management - [ ] Dependency security diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 4e7b705..9803910 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -8,12 +8,12 @@ SPDX-License-Identifier: GPL-3.0-or-later # FILE INFORMATION DEFGROUP: MokoStandards.Templates.GitHub INGROUP: MokoStandards.Templates -REPO: https://github.com/mokoconsulting-tech/MokoStandards +REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards PATH: /templates/github/copilot-instructions.joomla.md.template VERSION: XX.YY.ZZ BRIEF: GitHub Copilot custom instructions template for Joomla/MokoWaaS governed repositories NOTE: Synced to .github/copilot-instructions.md in all Joomla/WaaS repos via bulk sync. - Tokens replaced at sync time: MokoCassiopeia, https://github.com/mokoconsulting-tech/MokoCassiopeia, {{EXTENSION_NAME}}, + Tokens replaced at sync time: MokoCassiopeia, https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia, {{EXTENSION_NAME}}, {{EXTENSION_TYPE}}, {{EXTENSION_ELEMENT}} --> @@ -37,7 +37,7 @@ NOTE: Synced to .github/copilot-instructions.md in all Joomla/WaaS repos via bul > | Placeholder | Where to find the value | > |---|---| > | `MokoCassiopeia` | The GitHub repository name (visible in the URL, `README.md` heading, or `git remote -v`) | -> | `https://github.com/mokoconsulting-tech/MokoCassiopeia` | Full GitHub URL, e.g. `https://github.com/mokoconsulting-tech/` | +> | `https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia` | Full GitHub URL, e.g. `https://git.mokoconsulting.tech/MokoConsulting/` | > | `{{EXTENSION_NAME}}` | The `` element in `manifest.xml` at the repository root | > | `{{EXTENSION_TYPE}}` | The `type` attribute of the `` tag in `manifest.xml` (`component`, `module`, `plugin`, or `template`) | > | `{{EXTENSION_ELEMENT}}` | The `` tag in `manifest.xml`, or the filename prefix (e.g. `com_myextension`, `mod_mymodule`) | @@ -48,9 +48,9 @@ NOTE: Synced to .github/copilot-instructions.md in all Joomla/WaaS repos via bul ## What This Repo Is -This is a **Moko Consulting MokoWaaS** (Joomla) repository governed by [MokoStandards](https://github.com/mokoconsulting-tech/MokoStandards). All coding standards, workflows, and policies are defined there and enforced here via bulk sync. +This is a **Moko Consulting MokoWaaS** (Joomla) repository governed by [MokoStandards](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards). All coding standards, workflows, and policies are defined there and enforced here via bulk sync. -Repository URL: https://github.com/mokoconsulting-tech/MokoCassiopeia +Repository URL: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia Extension name: **{{EXTENSION_NAME}}** Extension type: **{{EXTENSION_TYPE}}** (`{{EXTENSION_ELEMENT}}`) Platform: **Joomla 4.x / MokoWaaS** @@ -79,7 +79,7 @@ Every new file needs a copyright header as its first content. * FILE INFORMATION * DEFGROUP: MokoCassiopeia.{{EXTENSION_TYPE}} * INGROUP: MokoCassiopeia - * REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia * PATH: /path/to/file.php * VERSION: XX.YY.ZZ * BRIEF: One-line description of purpose @@ -100,7 +100,7 @@ SPDX-License-Identifier: GPL-3.0-or-later # FILE INFORMATION DEFGROUP: MokoCassiopeia.Documentation INGROUP: MokoCassiopeia -REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia +REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia PATH: /docs/file.md VERSION: XX.YY.ZZ BRIEF: One-line description @@ -138,7 +138,7 @@ The version in `README.md` **must always match** the `` tag in `manifes 01.02.04 - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/01.02.04/{{EXTENSION_ELEMENT}}-01.02.04.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/01.02.04/{{EXTENSION_ELEMENT}}-01.02.04.zip @@ -191,7 +191,7 @@ The `manifest.xml` must reference it via: ```xml - https://github.com/mokoconsulting-tech/MokoCassiopeia/raw/main/updates.xml + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/raw/main/updates.xml ``` @@ -238,16 +238,16 @@ token: ${{ secrets.GITHUB_TOKEN }} ## MokoStandards Reference -This repository is governed by [MokoStandards](https://github.com/mokoconsulting-tech/MokoStandards). Authoritative policies: +This repository is governed by [MokoStandards](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards). Authoritative policies: | Document | Purpose | |----------|---------| -| [file-header-standards.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/policy/file-header-standards.md) | Copyright-header rules for every file type | -| [coding-style-guide.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/policy/coding-style-guide.md) | Naming and formatting conventions | -| [branching-strategy.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/policy/branching-strategy.md) | Branch naming, hierarchy, and release workflow | -| [merge-strategy.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/policy/merge-strategy.md) | Squash-merge policy and PR title/body conventions | -| [changelog-standards.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/policy/changelog-standards.md) | How and when to update CHANGELOG.md | -| [joomla-development-guide.md](https://github.com/mokoconsulting-tech/MokoStandards/blob/main/docs/guide/waas/joomla-development-guide.md) | MokoWaaS Joomla extension development guide | +| [file-header-standards.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/policy/file-header-standards.md) | Copyright-header rules for every file type | +| [coding-style-guide.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/policy/coding-style-guide.md) | Naming and formatting conventions | +| [branching-strategy.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/policy/branching-strategy.md) | Branch naming, hierarchy, and release workflow | +| [merge-strategy.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/policy/merge-strategy.md) | Squash-merge policy and PR title/body conventions | +| [changelog-standards.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/policy/changelog-standards.md) | How and when to update CHANGELOG.md | +| [joomla-development-guide.md](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/blob/main/docs/guide/waas/joomla-development-guide.md) | MokoWaaS Joomla extension development guide | --- diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 667ae72..96a5cd0 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,7 +3,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Dependabot # INGROUP: MokoStandards.Security -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /.github/dependabot.yml # VERSION: 03.09.03 # BRIEF: Dependabot configuration for automated dependency updates and security patches diff --git a/.github/workflows/auto-assign.yml b/.github/workflows/auto-assign.yml index d0b70f6..75b1caf 100644 --- a/.github/workflows/auto-assign.yml +++ b/.github/workflows/auto-assign.yml @@ -4,7 +4,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Workflows.Shared -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /.github/workflows/auto-assign.yml # VERSION: 04.06.00 # BRIEF: Auto-assign jmiller-moko to unassigned issues and PRs every 15 minutes diff --git a/.github/workflows/auto-dev-issue.yml b/.github/workflows/auto-dev-issue.yml index 9b5fbe2..185a5d7 100644 --- a/.github/workflows/auto-dev-issue.yml +++ b/.github/workflows/auto-dev-issue.yml @@ -7,7 +7,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Automation -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/shared/auto-dev-issue.yml.template # VERSION: 04.06.00 # BRIEF: Auto-create tracking issue with sub-issues for dev/rc branch workflow diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml index 62eff0f..2789e05 100644 --- a/.github/workflows/auto-release.yml +++ b/.github/workflows/auto-release.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Release -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/joomla/auto-release.yml.template # VERSION: 04.06.00 # BRIEF: Joomla build & release β€” ZIP package, updates.xml, SHA-256 checksum @@ -70,7 +70,7 @@ jobs: COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GH_TOKEN || github.token }}"}}' run: | git clone --depth 1 --branch version/04 --quiet \ - "https://x-access-token:${GH_TOKEN}@github.com/mokoconsulting-tech/MokoStandards.git" \ + "https://x-access-token:${GH_TOKEN}@git.mokoconsulting.tech/MokoConsulting/MokoStandards.git" \ /tmp/mokostandards cd /tmp/mokostandards composer install --no-dev --no-interaction --quiet diff --git a/.github/workflows/auto-update-sha.yml b/.github/workflows/auto-update-sha.yml index bbcfaaf..310332c 100644 --- a/.github/workflows/auto-update-sha.yml +++ b/.github/workflows/auto-update-sha.yml @@ -1,144 +1,144 @@ -# Copyright (C) 2026 Moko Consulting -# SPDX-License-Identifier: GPL-3.0-or-later -# FILE INFORMATION -# DEFGROUP: GitHub.Workflow -# INGROUP: MokoCassiopeia.Automation -# REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia -# PATH: /.github/workflows/auto-update-sha.yml -# VERSION: 03.09.03 -# BRIEF: Automatically update SHA-256 hash in updates.xml after release -# NOTE: Ensures updates.xml stays synchronized with release packages - -name: Auto-Update SHA Hash - -on: - release: - types: [published] - workflow_dispatch: - inputs: - tag: - description: 'Release tag to update SHA for (e.g., 03.08.03)' - required: true - type: string - -permissions: - contents: write - -jobs: - update-sha: - name: Update SHA-256 Hash in updates.xml - runs-on: ubuntu-latest - - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - ref: main - - - name: Get release tag - id: tag - run: | - if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then - TAG="${{ inputs.tag }}" - else - TAG="${{ github.event.release.tag_name }}" - fi - echo "tag=${TAG}" >> $GITHUB_OUTPUT - echo "Processing release: ${TAG}" - - - name: Download release package - run: | - TAG="${{ steps.tag.outputs.tag }}" - PACKAGE_NAME="mokocassiopeia-src-${TAG}.zip" - DOWNLOAD_URL="https://github.com/${{ github.repository }}/releases/download/${TAG}/${PACKAGE_NAME}" - - echo "Downloading: ${DOWNLOAD_URL}" - curl -L -o "${PACKAGE_NAME}" "${DOWNLOAD_URL}" - - if [ ! -f "${PACKAGE_NAME}" ]; then - echo "Error: Failed to download package" - exit 1 - fi - - echo "PACKAGE_NAME=${PACKAGE_NAME}" >> $GITHUB_ENV - - - name: Calculate SHA-256 hash - id: sha - run: | - SHA256_HASH=$(sha256sum "${PACKAGE_NAME}" | cut -d' ' -f1) - echo "sha256=${SHA256_HASH}" >> $GITHUB_OUTPUT - echo "SHA-256 Hash: ${SHA256_HASH}" - - - name: Update updates.xml - run: | - TAG="${{ steps.tag.outputs.tag }}" - SHA256="${{ steps.sha.outputs.sha256 }}" - DATE=$(date +%Y-%m-%d) - - # Update version - sed -i "s|.*|${TAG}|" updates.xml - - # Update creation date - sed -i "s|.*|${DATE}|" updates.xml - - # Update download URL - sed -i "s|.*|https://github.com/${{ github.repository }}/releases/download/${TAG}/mokocassiopeia-src-${TAG}.zip|" updates.xml - - # Update or add SHA-256 hash - if grep -q "" updates.xml; then - sed -i "s|.*|sha256:${SHA256}|" updates.xml - else - # Add SHA-256 after downloadurl - sed -i "/<\/downloadurl>/a\ sha256:${SHA256}<\/sha256>" updates.xml - fi - - echo "Updated updates.xml with:" - echo " Version: ${TAG}" - echo " Date: ${DATE}" - echo " SHA-256: ${SHA256}" - - - name: Check for changes - id: changes - run: | - if git diff --quiet updates.xml; then - echo "has_changes=false" >> $GITHUB_OUTPUT - echo "No changes to updates.xml" - else - echo "has_changes=true" >> $GITHUB_OUTPUT - echo "Changes detected in updates.xml" - git diff updates.xml - fi - - - name: Commit and push changes - if: steps.changes.outputs.has_changes == 'true' - run: | - TAG="${{ steps.tag.outputs.tag }}" - - git config --local user.email "github-actions[bot]@users.noreply.github.com" - git config --local user.name "github-actions[bot]" - - git add updates.xml - git commit -m "chore: Update SHA-256 hash for release ${TAG} - SHA: ${{ steps.sha.outputs.sha256 }}" - - git push origin main - - echo "Successfully updated updates.xml with SHA-256 hash for release ${TAG}" - - - name: Summary - if: steps.changes.outputs.has_changes == 'true' - run: | - echo "### SHA-256 Hash Updated Successfully" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "- Release: ${{ steps.tag.outputs.tag }}" >> $GITHUB_STEP_SUMMARY - echo "- SHA-256: \`${{ steps.sha.outputs.sha256 }}\`" >> $GITHUB_STEP_SUMMARY - echo "- File: updates.xml" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The Joomla update server will now provide the correct package hash." >> $GITHUB_STEP_SUMMARY - - - name: Summary (no changes) - if: steps.changes.outputs.has_changes == 'false' - run: | - echo "### No Updates Needed" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "updates.xml already contains the correct SHA-256 hash for release ${{ steps.tag.outputs.tag }}" >> $GITHUB_STEP_SUMMARY +# Copyright (C) 2026 Moko Consulting +# SPDX-License-Identifier: GPL-3.0-or-later +# FILE INFORMATION +# DEFGROUP: GitHub.Workflow +# INGROUP: MokoCassiopeia.Automation +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia +# PATH: /.github/workflows/auto-update-sha.yml +# VERSION: 03.09.03 +# BRIEF: Automatically update SHA-256 hash in updates.xml after release +# NOTE: Ensures updates.xml stays synchronized with release packages + +name: Auto-Update SHA Hash + +on: + release: + types: [published] + workflow_dispatch: + inputs: + tag: + description: 'Release tag to update SHA for (e.g., 03.08.03)' + required: true + type: string + +permissions: + contents: write + +jobs: + update-sha: + name: Update SHA-256 Hash in updates.xml + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: main + + - name: Get release tag + id: tag + run: | + if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + TAG="${{ inputs.tag }}" + else + TAG="${{ github.event.release.tag_name }}" + fi + echo "tag=${TAG}" >> $GITHUB_OUTPUT + echo "Processing release: ${TAG}" + + - name: Download release package + run: | + TAG="${{ steps.tag.outputs.tag }}" + PACKAGE_NAME="mokocassiopeia-src-${TAG}.zip" + DOWNLOAD_URL="https://github.com/${{ github.repository }}/releases/download/${TAG}/${PACKAGE_NAME}" + + echo "Downloading: ${DOWNLOAD_URL}" + curl -L -o "${PACKAGE_NAME}" "${DOWNLOAD_URL}" + + if [ ! -f "${PACKAGE_NAME}" ]; then + echo "Error: Failed to download package" + exit 1 + fi + + echo "PACKAGE_NAME=${PACKAGE_NAME}" >> $GITHUB_ENV + + - name: Calculate SHA-256 hash + id: sha + run: | + SHA256_HASH=$(sha256sum "${PACKAGE_NAME}" | cut -d' ' -f1) + echo "sha256=${SHA256_HASH}" >> $GITHUB_OUTPUT + echo "SHA-256 Hash: ${SHA256_HASH}" + + - name: Update updates.xml + run: | + TAG="${{ steps.tag.outputs.tag }}" + SHA256="${{ steps.sha.outputs.sha256 }}" + DATE=$(date +%Y-%m-%d) + + # Update version + sed -i "s|.*|${TAG}|" updates.xml + + # Update creation date + sed -i "s|.*|${DATE}|" updates.xml + + # Update download URL + sed -i "s|.*|https://github.com/${{ github.repository }}/releases/download/${TAG}/mokocassiopeia-src-${TAG}.zip|" updates.xml + + # Update or add SHA-256 hash + if grep -q "" updates.xml; then + sed -i "s|.*|sha256:${SHA256}|" updates.xml + else + # Add SHA-256 after downloadurl + sed -i "/<\/downloadurl>/a\ sha256:${SHA256}<\/sha256>" updates.xml + fi + + echo "Updated updates.xml with:" + echo " Version: ${TAG}" + echo " Date: ${DATE}" + echo " SHA-256: ${SHA256}" + + - name: Check for changes + id: changes + run: | + if git diff --quiet updates.xml; then + echo "has_changes=false" >> $GITHUB_OUTPUT + echo "No changes to updates.xml" + else + echo "has_changes=true" >> $GITHUB_OUTPUT + echo "Changes detected in updates.xml" + git diff updates.xml + fi + + - name: Commit and push changes + if: steps.changes.outputs.has_changes == 'true' + run: | + TAG="${{ steps.tag.outputs.tag }}" + + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + + git add updates.xml + git commit -m "chore: Update SHA-256 hash for release ${TAG} - SHA: ${{ steps.sha.outputs.sha256 }}" + + git push origin main + + echo "Successfully updated updates.xml with SHA-256 hash for release ${TAG}" + + - name: Summary + if: steps.changes.outputs.has_changes == 'true' + run: | + echo "### SHA-256 Hash Updated Successfully" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "- Release: ${{ steps.tag.outputs.tag }}" >> $GITHUB_STEP_SUMMARY + echo "- SHA-256: \`${{ steps.sha.outputs.sha256 }}\`" >> $GITHUB_STEP_SUMMARY + echo "- File: updates.xml" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The Joomla update server will now provide the correct package hash." >> $GITHUB_STEP_SUMMARY + + - name: Summary (no changes) + if: steps.changes.outputs.has_changes == 'false' + run: | + echo "### No Updates Needed" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "updates.xml already contains the correct SHA-256 hash for release ${{ steps.tag.outputs.tag }}" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/branch-freeze.yml b/.github/workflows/branch-freeze.yml index 7a908f0..a9d36ef 100644 --- a/.github/workflows/branch-freeze.yml +++ b/.github/workflows/branch-freeze.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Automation -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/shared/branch-freeze.yml.template # VERSION: 04.06.00 # BRIEF: Freeze or unfreeze any branch via ruleset β€” manual workflow_dispatch diff --git a/.github/workflows/changelog-validation.yml b/.github/workflows/changelog-validation.yml index 5521195..81f7e2c 100644 --- a/.github/workflows/changelog-validation.yml +++ b/.github/workflows/changelog-validation.yml @@ -7,7 +7,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow.Template # INGROUP: MokoStandards.CI -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/shared/changelog-validation.yml.template # VERSION: 04.06.00 # BRIEF: Validates CHANGELOG.md format and version consistency diff --git a/.github/workflows/ci-joomla.yml b/.github/workflows/ci-joomla.yml index 7329a62..5b32ce6 100644 --- a/.github/workflows/ci-joomla.yml +++ b/.github/workflows/ci-joomla.yml @@ -7,7 +7,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow.Template # INGROUP: MokoStandards.CI -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/joomla/ci-joomla.yml.template # VERSION: 04.06.00 # BRIEF: CI workflow for Joomla extensions β€” lint, validate, test @@ -51,7 +51,7 @@ jobs: GH_TOKEN: ${{ secrets.GH_TOKEN || github.token }} run: | git clone --depth 1 --branch version/04 --quiet \ - "https://x-access-token:${GH_TOKEN}@github.com/mokoconsulting-tech/MokoStandards.git" \ + "https://x-access-token:${GH_TOKEN}@git.mokoconsulting.tech/MokoConsulting/MokoStandards.git" \ /tmp/mokostandards - name: Install dependencies diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 72cacae..b19b2de 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -7,7 +7,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow.Template # INGROUP: MokoStandards.Security -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/generic/codeql-analysis.yml.template # VERSION: 03.09.03 # BRIEF: CodeQL security scanning workflow (generic β€” all repo types) diff --git a/.github/workflows/deploy-manual.yml b/.github/workflows/deploy-manual.yml index e127f0e..0833575 100644 --- a/.github/workflows/deploy-manual.yml +++ b/.github/workflows/deploy-manual.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Deploy -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/joomla/deploy-manual.yml.template # VERSION: 04.06.00 # BRIEF: Manual SFTP deploy to dev server for Joomla repos @@ -52,7 +52,7 @@ jobs: COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GH_TOKEN || github.token }}"}}' run: | git clone --depth 1 --branch version/04 --quiet \ - "https://x-access-token:${GH_TOKEN}@github.com/mokoconsulting-tech/MokoStandards.git" \ + "https://x-access-token:${GH_TOKEN}@git.mokoconsulting.tech/MokoConsulting/MokoStandards.git" \ /tmp/mokostandards 2>/dev/null || true if [ -d "/tmp/mokostandards" ] && [ -f "/tmp/mokostandards/composer.json" ]; then cd /tmp/mokostandards && composer install --no-dev --no-interaction --quiet 2>/dev/null || true diff --git a/.github/workflows/enterprise-firewall-setup.yml b/.github/workflows/enterprise-firewall-setup.yml index 1a533fb..c850602 100644 --- a/.github/workflows/enterprise-firewall-setup.yml +++ b/.github/workflows/enterprise-firewall-setup.yml @@ -20,7 +20,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Firewall -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/shared/enterprise-firewall-setup.yml.template # VERSION: 04.06.00 # BRIEF: Enterprise firewall configuration β€” generates outbound allow-rules including SFTP deployment server diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4af1d59..8d15727 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoCassiopeia.Release -# REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia # PATH: /.github/workflows/release.yml # VERSION: 03.09.03 # BRIEF: Automated release workflow for MokoCassiopeia Joomla template diff --git a/.github/workflows/repo_health.yml b/.github/workflows/repo_health.yml index 73308be..e4c062a 100644 --- a/.github/workflows/repo_health.yml +++ b/.github/workflows/repo_health.yml @@ -8,7 +8,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Validation -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /.github/workflows/repo_health.yml # VERSION: 04.06.00 # BRIEF: Enforces repository guardrails by validating release configuration, scripts governance, tooling availability, and core repository health artifacts. diff --git a/.github/workflows/repository-cleanup.yml b/.github/workflows/repository-cleanup.yml index ea9219d..f3f8a94 100644 --- a/.github/workflows/repository-cleanup.yml +++ b/.github/workflows/repository-cleanup.yml @@ -7,7 +7,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Maintenance -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/shared/repository-cleanup.yml.template # VERSION: 04.06.00 # BRIEF: Recurring repository maintenance β€” labels, branches, workflows, logs, doc indexes diff --git a/.github/workflows/standards-compliance.yml b/.github/workflows/standards-compliance.yml index 79aaedd..9b13745 100644 --- a/.github/workflows/standards-compliance.yml +++ b/.github/workflows/standards-compliance.yml @@ -3,7 +3,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Compliance -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /.github/workflows/standards-compliance.yml # VERSION: 04.06.00 # BRIEF: MokoStandards compliance validation workflow @@ -323,7 +323,7 @@ jobs: [ ! -d "docs" ] && echo "- Create docs directory: \`mkdir docs && echo '# Documentation' > docs/README.md\`" >> $GITHUB_STEP_SUMMARY [ ! -d ".github" ] && echo "- Create .github directory: \`mkdir -p .github/workflows\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "πŸ“š Reference: [MokoStandards Repository Structure](https://github.com/mokoconsulting-tech/MokoStandards/tree/main/docs/policy/core-structure.md)" >> $GITHUB_STEP_SUMMARY + echo "πŸ“š Reference: [MokoStandards Repository Structure](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/tree/main/docs/policy/core-structure.md)" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### ❌ Validation Failed: Required Directories Missing" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY @@ -384,13 +384,13 @@ jobs: echo "### πŸ”΄ Critical Issues: $MISSING" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Remediation Steps:**" >> $GITHUB_STEP_SUMMARY - [ ! -f "README.md" ] && echo "- Create README.md: Use [template](https://github.com/mokoconsulting-tech/MokoStandards/tree/main/templates/docs/required/README.md)" >> $GITHUB_STEP_SUMMARY + [ ! -f "README.md" ] && echo "- Create README.md: Use [template](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/tree/main/templates/docs/required/README.md)" >> $GITHUB_STEP_SUMMARY [ ! -f "LICENSE" ] && echo "- Add LICENSE file: Choose from [OSI-approved licenses](https://opensource.org/licenses)" >> $GITHUB_STEP_SUMMARY - [ ! -f "CONTRIBUTING.md" ] && echo "- Create CONTRIBUTING.md: Use [template](https://github.com/mokoconsulting-tech/MokoStandards/tree/main/templates/docs/required/CONTRIBUTING.md)" >> $GITHUB_STEP_SUMMARY - [ ! -f "SECURITY.md" ] && echo "- Create SECURITY.md: Use [template](https://github.com/mokoconsulting-tech/MokoStandards/tree/main/templates/docs/required/SECURITY.md)" >> $GITHUB_STEP_SUMMARY - [ ! -f ".editorconfig" ] && echo "- Add .editorconfig: Use [template](https://github.com/mokoconsulting-tech/MokoStandards/tree/main/templates/.editorconfig)" >> $GITHUB_STEP_SUMMARY + [ ! -f "CONTRIBUTING.md" ] && echo "- Create CONTRIBUTING.md: Use [template](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/tree/main/templates/docs/required/CONTRIBUTING.md)" >> $GITHUB_STEP_SUMMARY + [ ! -f "SECURITY.md" ] && echo "- Create SECURITY.md: Use [template](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/tree/main/templates/docs/required/SECURITY.md)" >> $GITHUB_STEP_SUMMARY + [ ! -f ".editorconfig" ] && echo "- Add .editorconfig: Use [template](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/tree/main/templates/.editorconfig)" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "πŸ“š Reference: [MokoStandards File Requirements](https://github.com/mokoconsulting-tech/MokoStandards/tree/main/docs/policy/file-header-standards.md)" >> $GITHUB_STEP_SUMMARY + echo "πŸ“š Reference: [MokoStandards File Requirements](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/tree/main/docs/policy/file-header-standards.md)" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### ❌ Validation Failed: Required Files Missing" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY @@ -510,7 +510,7 @@ jobs: COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GH_TOKEN || github.token }}"}}' run: | git clone --depth 1 --branch version/04 --quiet \ - "https://x-access-token:${GH_TOKEN}@github.com/mokoconsulting-tech/MokoStandards.git" \ + "https://x-access-token:${GH_TOKEN}@git.mokoconsulting.tech/MokoConsulting/MokoStandards.git" \ /tmp/mokostandards 2>/dev/null || true if [ -d "/tmp/mokostandards" ] && [ -f "/tmp/mokostandards/composer.json" ]; then cd /tmp/mokostandards @@ -1979,7 +1979,7 @@ jobs: echo "No composer.json β€” pulling MokoStandards tools" if [ ! -d "/tmp/mokostandards" ]; then git clone --depth 1 --branch version/04 --quiet \ - "https://x-access-token:${GH_TOKEN}@github.com/mokoconsulting-tech/MokoStandards.git" \ + "https://x-access-token:${GH_TOKEN}@git.mokoconsulting.tech/MokoConsulting/MokoStandards.git" \ /tmp/mokostandards 2>/dev/null || true if [ -f "/tmp/mokostandards/composer.json" ]; then cd /tmp/mokostandards && composer install --no-dev --no-interaction --quiet 2>/dev/null || true @@ -2051,7 +2051,7 @@ jobs: echo "No composer.json β€” pulling MokoStandards tools" if [ ! -d "/tmp/mokostandards" ]; then git clone --depth 1 --branch version/04 --quiet \ - "https://x-access-token:${GH_TOKEN}@github.com/mokoconsulting-tech/MokoStandards.git" \ + "https://x-access-token:${GH_TOKEN}@git.mokoconsulting.tech/MokoConsulting/MokoStandards.git" \ /tmp/mokostandards 2>/dev/null || true if [ -f "/tmp/mokostandards/composer.json" ]; then cd /tmp/mokostandards && composer install --no-dev --no-interaction --quiet 2>/dev/null || true @@ -2501,10 +2501,10 @@ jobs: echo "---" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "πŸ“š **Resources:**" >> $GITHUB_STEP_SUMMARY - echo "- [MokoStandards Documentation](https://github.com/mokoconsulting-tech/MokoStandards)" >> $GITHUB_STEP_SUMMARY - echo "- [Repository Structure Guide](https://github.com/mokoconsulting-tech/MokoStandards/tree/main/docs/policy/core-structure.md)" >> $GITHUB_STEP_SUMMARY - echo "- [Documentation Standards](https://github.com/mokoconsulting-tech/MokoStandards/tree/main/docs/policy/document-formatting.md)" >> $GITHUB_STEP_SUMMARY - echo "- [Coding Standards](https://github.com/mokoconsulting-tech/MokoStandards/tree/main/docs/policy/coding-style-guide.md)" >> $GITHUB_STEP_SUMMARY + echo "- [MokoStandards Documentation](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards)" >> $GITHUB_STEP_SUMMARY + echo "- [Repository Structure Guide](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/tree/main/docs/policy/core-structure.md)" >> $GITHUB_STEP_SUMMARY + echo "- [Documentation Standards](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/tree/main/docs/policy/document-formatting.md)" >> $GITHUB_STEP_SUMMARY + echo "- [Coding Standards](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards/tree/main/docs/policy/coding-style-guide.md)" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "_Generated by MokoStandards Compliance Workflow v${WORKFLOW_VERSION}_" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/sync-version-on-merge.yml b/.github/workflows/sync-version-on-merge.yml index 4761168..16f58fd 100644 --- a/.github/workflows/sync-version-on-merge.yml +++ b/.github/workflows/sync-version-on-merge.yml @@ -7,7 +7,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Automation -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/shared/sync-version-on-merge.yml.template # VERSION: 04.06.00 # BRIEF: Auto-bump patch version on every push to main and propagate to all file headers @@ -61,7 +61,7 @@ jobs: COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GH_TOKEN || github.token }}"}}' run: | git clone --depth 1 --branch version/04 --quiet \ - "https://x-access-token:${GH_TOKEN}@github.com/mokoconsulting-tech/MokoStandards.git" \ + "https://x-access-token:${GH_TOKEN}@git.mokoconsulting.tech/MokoConsulting/MokoStandards.git" \ /tmp/mokostandards cd /tmp/mokostandards composer install --no-dev --no-interaction --quiet diff --git a/.github/workflows/update-server.yml b/.github/workflows/update-server.yml index 83c8e0d..39bc2ab 100644 --- a/.github/workflows/update-server.yml +++ b/.github/workflows/update-server.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: GitHub.Workflow # INGROUP: MokoStandards.Joomla -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/workflows/joomla/update-server.yml.template # VERSION: 04.06.00 # BRIEF: Update Joomla update server XML feed with stable/rc/dev entries @@ -70,7 +70,7 @@ jobs: COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GH_TOKEN || github.token }}"}}' run: | git clone --depth 1 --branch version/04 --quiet \ - "https://x-access-token:${GH_TOKEN}@github.com/mokoconsulting-tech/MokoStandards.git" \ + "https://x-access-token:${GH_TOKEN}@git.mokoconsulting.tech/MokoConsulting/MokoStandards.git" \ /tmp/mokostandards 2>/dev/null || true if [ -d "/tmp/mokostandards" ] && [ -f "/tmp/mokostandards/composer.json" ]; then cd /tmp/mokostandards && composer install --no-dev --no-interaction --quiet 2>/dev/null || true diff --git a/.moko-standards b/.moko-standards index db0c004..bcac6b4 100644 --- a/.moko-standards +++ b/.moko-standards @@ -3,7 +3,7 @@ # FILE INFORMATION # DEFGROUP: MokoStandards.Templates.Config # INGROUP: MokoStandards.Templates -# REPO: https://github.com/mokoconsulting-tech/MokoStandards +# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards # PATH: /templates/configs/moko-standards.yml # VERSION: 04.01.00 # BRIEF: Governance attachment template β€” synced to .moko-standards in every governed repository @@ -12,9 +12,9 @@ # This file is managed automatically by MokoStandards bulk sync. # Do not edit manually β€” changes will be overwritten on the next sync. # To update governance settings, open a PR in MokoStandards instead: -# https://github.com/mokoconsulting-tech/MokoStandards +# https://git.mokoconsulting.tech/MokoConsulting/MokoStandards -standards_source: "https://github.com/mokoconsulting-tech/MokoStandards" +standards_source: "https://git.mokoconsulting.tech/MokoConsulting/MokoStandards" standards_version: "04.00.04" platform: "waas-component" -governed_repo: "mokoconsulting-tech/MokoCassiopeia" +governed_repo: "MokoConsulting/MokoCassiopeia" diff --git a/CHANGELOG.md b/CHANGELOG.md index 53c45e8..19339fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -577,8 +577,8 @@ This release includes a complete rebrand from "Moko-Cassiopeia" (hyphenated) to ## Links - **Full Roadmap**: [MokoCassiopeia Roadmap](https://mokoconsulting.tech/support/joomla-cms/mokocassiopeia-roadmap) -- **Repository**: [GitHub](https://github.com/mokoconsulting-tech/MokoCassiopeia) -- **Issue Tracker**: [GitHub Issues](https://github.com/mokoconsulting-tech/MokoCassiopeia/issues) +- **Repository**: [GitHub](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) +- **Issue Tracker**: [GitHub Issues](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/issues) ## Version Format diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 964953f..7dd0983 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -8,7 +8,7 @@ # FILE INFORMATION DEFGROUP: Joomla.Template INGROUP: MokoCassiopeia.Governance - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: CODE_OF_CONDUCT.md VERSION: 03.09.03 BRIEF: Contributor code of conduct for the MokoCassiopeia project. @@ -83,7 +83,7 @@ This project is managed from Tennessee, USA. This statement is informational and ## Metadata * **Document:** CODE_OF_CONDUCT.md -* **Repository:** [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* **Repository:** [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * **Path:** /CODE_OF_CONDUCT.md * **Owner:** Moko Consulting * **Version:** 03.06.00 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4e0fd34..1e0d6af 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,7 +8,7 @@ # FILE INFORMATION DEFGROUP: Joomla.Template INGROUP: MokoCassiopeia.Governance - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: CONTRIBUTING.md VERSION: 03.09.03 BRIEF: Contribution guidelines for the MokoCassiopeia project. @@ -43,7 +43,7 @@ For first-time contributors: ```bash # Clone the repository -git clone https://github.com/mokoconsulting-tech/MokoCassiopeia.git +git clone https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia.git cd MokoCassiopeia ``` @@ -130,7 +130,7 @@ Participation in this project is governed by the Code of Conduct. Unacceptable b ## Metadata * **Document:** CONTRIBUTING.md -* **Repository:** [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* **Repository:** [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * **Path:** /CONTRIBUTING.md * **Owner:** Moko Consulting * **Version:** 03.06.00 diff --git a/GOVERNANCE.md b/GOVERNANCE.md index f200690..8029422 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -8,7 +8,7 @@ # FILE INFORMATION DEFGROUP: Joomla.Template INGROUP: MokoCassiopeia.Governance - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: GOVERNANCE.md VERSION: 03.09.03 BRIEF: Project governance model, roles, and decision processes for MokoCassiopeia. @@ -100,7 +100,7 @@ This project is managed from Tennessee, USA. This statement is informational and ## Metadata * **Document:** GOVERNANCE.md -* **Repository:** [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* **Repository:** [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * **Path:** /GOVERNANCE.md * **Owner:** Moko Consulting * **Version:** 03.06.00 diff --git a/Makefile b/Makefile index ec94cc9..dc8ca18 100644 --- a/Makefile +++ b/Makefile @@ -1,58 +1,32 @@ -# Makefile for Joomla Extensions +# Makefile for MokoCassiopeia Joomla Template # Copyright (C) 2026 Moko Consulting # SPDX-License-Identifier: GPL-3.0-or-later # -# This is a reference Makefile for building Joomla extensions. -# Copy this to your repository root as "Makefile" and customize as needed. -# -# Supports: Modules, Plugins, Components, Packages, Templates +# Build and validation powered by MokoStandards Enterprise API +# Install: composer install # ============================================================================== -# CONFIGURATION - Customize these for your extension +# CONFIGURATION # ============================================================================== -# Extension Configuration -EXTENSION_NAME := mokoexample -EXTENSION_TYPE := module -# Options: module, plugin, component, package, template -EXTENSION_VERSION := 1.0.0 +EXTENSION_NAME := mokocassiopeia +EXTENSION_TYPE := template +EXTENSION_VERSION := $(shell grep -oP 'VERSION:\s*\K[0-9.]+' README.md 2>/dev/null || echo "0.0.0") -# Module Configuration (for modules only) -MODULE_TYPE := site -# Options: site, admin - -# Plugin Configuration (for plugins only) -PLUGIN_GROUP := system -# Options: system, content, user, authentication, etc. - -# Directories -SRC_DIR := . +SRC_DIR := src BUILD_DIR := build -DIST_DIR := dist -DOCS_DIR := docs +DIST_DIR := dist -# Joomla Installation (for local testing - customize paths) -JOOMLA_ROOT := /var/www/html/joomla -JOOMLA_VERSION := 4 - -# Tools -PHP := php +PHP := php COMPOSER := composer -NPM := npm -PHPCS := vendor/bin/phpcs -PHPCBF := vendor/bin/phpcbf -PHPUNIT := vendor/bin/phpunit -ZIP := zip +MOKO := vendor/bin/moko -# Coding Standards -PHPCS_STANDARD := Joomla - -# Colors for output -COLOR_RESET := \033[0m -COLOR_GREEN := \033[32m +# Colors +COLOR_RESET := \033[0m +COLOR_GREEN := \033[32m COLOR_YELLOW := \033[33m -COLOR_BLUE := \033[34m -COLOR_RED := \033[31m +COLOR_BLUE := \033[34m +COLOR_RED := \033[31m # ============================================================================== # TARGETS @@ -61,92 +35,85 @@ COLOR_RED := \033[31m .PHONY: help help: ## Show this help message @echo "$(COLOR_BLUE)╔════════════════════════════════════════════════════════════╗$(COLOR_RESET)" - @echo "$(COLOR_BLUE)β•‘ Joomla Extension Makefile β•‘$(COLOR_RESET)" + @echo "$(COLOR_BLUE)β•‘ MokoCassiopeia Template Build β•‘$(COLOR_RESET)" @echo "$(COLOR_BLUE)β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•$(COLOR_RESET)" @echo "" @echo "Extension: $(EXTENSION_NAME) ($(EXTENSION_TYPE)) v$(EXTENSION_VERSION)" + @echo "Powered by: MokoStandards Enterprise API" @echo "" @echo "$(COLOR_GREEN)Available targets:$(COLOR_RESET)" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " $(COLOR_BLUE)%-20s$(COLOR_RESET) %s\n", $$1, $$2}' @echo "" - @echo "$(COLOR_YELLOW)Quick Start:$(COLOR_RESET)" - @echo " 1. make install-deps # Install dependencies" - @echo " 2. make build # Build extension package" - @echo " 3. make test # Run tests" - @echo "" + +# ── Dependencies ────────────────────────────────────────────────────────────── .PHONY: install-deps -install-deps: ## Install all dependencies (Composer + npm) +install-deps: ## Install Composer dependencies (includes MokoStandards API) @echo "$(COLOR_BLUE)Installing dependencies...$(COLOR_RESET)" - @if [ -f "composer.json" ]; then \ - $(COMPOSER) install; \ - echo "$(COLOR_GREEN)βœ“ Composer dependencies installed$(COLOR_RESET)"; \ - fi - @if [ -f "package.json" ]; then \ - $(NPM) install; \ - echo "$(COLOR_GREEN)βœ“ npm dependencies installed$(COLOR_RESET)"; \ - fi + @$(COMPOSER) install + @echo "$(COLOR_GREEN)βœ“ Dependencies installed$(COLOR_RESET)" .PHONY: update-deps -update-deps: ## Update all dependencies +update-deps: ## Update Composer dependencies @echo "$(COLOR_BLUE)Updating dependencies...$(COLOR_RESET)" - @if [ -f "composer.json" ]; then \ - $(COMPOSER) update; \ - echo "$(COLOR_GREEN)βœ“ Composer dependencies updated$(COLOR_RESET)"; \ - fi - @if [ -f "package.json" ]; then \ - $(NPM) update; \ - echo "$(COLOR_GREEN)βœ“ npm dependencies updated$(COLOR_RESET)"; \ + @$(COMPOSER) update + @echo "$(COLOR_GREEN)βœ“ Dependencies updated$(COLOR_RESET)" + +# ── Validation (MokoStandards API) ──────────────────────────────────────────── + +.PHONY: check-moko +check-moko: + @if [ ! -f "$(MOKO)" ]; then \ + echo "$(COLOR_RED)βœ— MokoStandards CLI not found. Run: make install-deps$(COLOR_RESET)"; \ + exit 1; \ fi .PHONY: lint -lint: ## Run PHP linter (syntax check) - @echo "$(COLOR_BLUE)Running PHP linter...$(COLOR_RESET)" - @find . -name "*.php" ! -path "./vendor/*" ! -path "./node_modules/*" ! -path "./$(BUILD_DIR)/*" \ - -exec $(PHP) -l {} \; | grep -v "No syntax errors" || true - @echo "$(COLOR_GREEN)βœ“ PHP linting complete$(COLOR_RESET)" +lint: check-moko ## PHP syntax check via MokoStandards + @echo "$(COLOR_BLUE)Running PHP syntax check...$(COLOR_RESET)" + @$(PHP) $(MOKO) check:syntax -- --path . + @echo "$(COLOR_GREEN)βœ“ PHP syntax OK$(COLOR_RESET)" -.PHONY: phpcs -phpcs: ## Run PHP CodeSniffer (Joomla standards) - @echo "$(COLOR_BLUE)Running PHP CodeSniffer...$(COLOR_RESET)" - @if [ -f "$(PHPCS)" ]; then \ - $(PHPCS) --standard=$(PHPCS_STANDARD) --extensions=php --ignore=vendor,node_modules,$(BUILD_DIR) .; \ - else \ - echo "$(COLOR_YELLOW)⚠ PHP CodeSniffer not installed. Run: make install-deps$(COLOR_RESET)"; \ - fi +.PHONY: check-joomla +check-joomla: check-moko ## Validate Joomla manifest via MokoStandards + @echo "$(COLOR_BLUE)Validating Joomla manifest...$(COLOR_RESET)" + @$(PHP) $(MOKO) check:joomla -- --path . + @echo "$(COLOR_GREEN)βœ“ Joomla manifest valid$(COLOR_RESET)" -.PHONY: phpcbf -phpcbf: ## Fix coding standards automatically - @echo "$(COLOR_BLUE)Running PHP Code Beautifier...$(COLOR_RESET)" - @if [ -f "$(PHPCBF)" ]; then \ - $(PHPCBF) --standard=$(PHPCS_STANDARD) --extensions=php --ignore=vendor,node_modules,$(BUILD_DIR) .; \ - echo "$(COLOR_GREEN)βœ“ Code formatting applied$(COLOR_RESET)"; \ - else \ - echo "$(COLOR_YELLOW)⚠ PHP Code Beautifier not installed. Run: make install-deps$(COLOR_RESET)"; \ - fi +.PHONY: check-version +check-version: check-moko ## Verify version consistency across files + @echo "$(COLOR_BLUE)Checking version consistency...$(COLOR_RESET)" + @$(PHP) $(MOKO) check:version -- --path . + @echo "$(COLOR_GREEN)βœ“ Versions consistent$(COLOR_RESET)" + +.PHONY: check-headers +check-headers: check-moko ## Check license headers on source files + @echo "$(COLOR_BLUE)Checking license headers...$(COLOR_RESET)" + @$(PHP) $(MOKO) check:headers -- --path . + @echo "$(COLOR_GREEN)βœ“ Headers OK$(COLOR_RESET)" + +.PHONY: check-secrets +check-secrets: check-moko ## Scan for leaked credentials + @echo "$(COLOR_BLUE)Scanning for secrets...$(COLOR_RESET)" + @$(PHP) $(MOKO) check:secrets -- --path . + @echo "$(COLOR_GREEN)βœ“ No secrets found$(COLOR_RESET)" + +.PHONY: check-xml +check-xml: check-moko ## Validate XML files are well-formed + @echo "$(COLOR_BLUE)Checking XML files...$(COLOR_RESET)" + @$(PHP) $(MOKO) check:xml -- --path . + @echo "$(COLOR_GREEN)βœ“ XML well-formed$(COLOR_RESET)" .PHONY: validate -validate: lint phpcs ## Run all validation checks +validate: lint check-joomla check-version check-xml check-headers check-secrets ## Run all MokoStandards validation checks @echo "$(COLOR_GREEN)βœ“ All validation checks passed$(COLOR_RESET)" -.PHONY: test -test: ## Run PHPUnit tests - @echo "$(COLOR_BLUE)Running tests...$(COLOR_RESET)" - @if [ -f "$(PHPUNIT)" ] && [ -f "phpunit.xml" ]; then \ - $(PHPUNIT); \ - else \ - echo "$(COLOR_YELLOW)⚠ PHPUnit not configured$(COLOR_RESET)"; \ - fi +.PHONY: health +health: check-moko ## Full repository health check via MokoStandards + @echo "$(COLOR_BLUE)Running full health check...$(COLOR_RESET)" + @$(PHP) $(MOKO) health -- --path . -.PHONY: test-coverage -test-coverage: ## Run tests with coverage report - @echo "$(COLOR_BLUE)Running tests with coverage...$(COLOR_RESET)" - @if [ -f "$(PHPUNIT)" ] && [ -f "phpunit.xml" ]; then \ - $(PHPUNIT) --coverage-html $(BUILD_DIR)/coverage; \ - echo "$(COLOR_GREEN)βœ“ Coverage report: $(BUILD_DIR)/coverage/index.html$(COLOR_RESET)"; \ - else \ - echo "$(COLOR_YELLOW)⚠ PHPUnit not configured$(COLOR_RESET)"; \ - fi +# ── Build ───────────────────────────────────────────────────────────────────── .PHONY: clean clean: ## Clean build artifacts @@ -155,179 +122,78 @@ clean: ## Clean build artifacts @echo "$(COLOR_GREEN)βœ“ Build artifacts cleaned$(COLOR_RESET)" .PHONY: build -build: clean validate ## Build extension package - @echo "$(COLOR_BLUE)Building Joomla extension package...$(COLOR_RESET)" - @mkdir -p $(DIST_DIR) $(BUILD_DIR) - - # Determine package prefix based on extension type - @case "$(EXTENSION_TYPE)" in \ - module) \ - PACKAGE_PREFIX="mod_$(EXTENSION_NAME)"; \ - BUILD_TARGET="$(BUILD_DIR)/$$PACKAGE_PREFIX"; \ - ;; \ - plugin) \ - PACKAGE_PREFIX="plg_$(PLUGIN_GROUP)_$(EXTENSION_NAME)"; \ - BUILD_TARGET="$(BUILD_DIR)/$$PACKAGE_PREFIX"; \ - ;; \ - component) \ - PACKAGE_PREFIX="com_$(EXTENSION_NAME)"; \ - BUILD_TARGET="$(BUILD_DIR)/$$PACKAGE_PREFIX"; \ - ;; \ - package) \ - PACKAGE_PREFIX="pkg_$(EXTENSION_NAME)"; \ - BUILD_TARGET="$(BUILD_DIR)/$$PACKAGE_PREFIX"; \ - ;; \ - template) \ - PACKAGE_PREFIX="tpl_$(EXTENSION_NAME)"; \ - BUILD_TARGET="$(BUILD_DIR)/$$PACKAGE_PREFIX"; \ - ;; \ - *) \ - echo "$(COLOR_RED)βœ— Unknown extension type: $(EXTENSION_TYPE)$(COLOR_RESET)"; \ +build: clean ## Build template installable ZIP from src/ + @echo "$(COLOR_BLUE)Building $(EXTENSION_NAME) v$(EXTENSION_VERSION)...$(COLOR_RESET)" + @mkdir -p $(BUILD_DIR)/package $(DIST_DIR) + @cp -r $(SRC_DIR)/* $(BUILD_DIR)/package/ + @cd $(BUILD_DIR)/package && \ + if command -v zip >/dev/null 2>&1; then \ + zip -r "../../$(DIST_DIR)/$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip" .; \ + elif command -v pwsh >/dev/null 2>&1; then \ + pwsh -Command "Compress-Archive -Path '*' -DestinationPath '../../$(DIST_DIR)/$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip' -Force"; \ + elif command -v powershell >/dev/null 2>&1; then \ + powershell -Command "Compress-Archive -Path '*' -DestinationPath '../../$(DIST_DIR)/$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip' -Force"; \ + else \ + echo "$(COLOR_RED)βœ— No zip tool found (zip, pwsh, powershell)$(COLOR_RESET)"; \ exit 1; \ - ;; \ - esac; \ - \ - mkdir -p "$$BUILD_TARGET"; \ - \ - echo "Building $$PACKAGE_PREFIX..."; \ - \ - rsync -av --progress \ - --exclude='$(BUILD_DIR)' \ - --exclude='$(DIST_DIR)' \ - --exclude='.git*' \ - --exclude='vendor/' \ - --exclude='node_modules/' \ - --exclude='tests/' \ - --exclude='Makefile' \ - --exclude='composer.json' \ - --exclude='composer.lock' \ - --exclude='package.json' \ - --exclude='package-lock.json' \ - --exclude='phpunit.xml' \ - --exclude='*.md' \ - --exclude='.editorconfig' \ - . "$$BUILD_TARGET/"; \ - \ - cd $(BUILD_DIR) && $(ZIP) -r "../$(DIST_DIR)/$${PACKAGE_PREFIX}-$(EXTENSION_VERSION).zip" "$${PACKAGE_PREFIX}"; \ - \ - echo "$(COLOR_GREEN)βœ“ Package created: $(DIST_DIR)/$${PACKAGE_PREFIX}-$(EXTENSION_VERSION).zip$(COLOR_RESET)" + fi + @echo "$(COLOR_GREEN)βœ“ Package: $(DIST_DIR)/$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip$(COLOR_RESET)" -.PHONY: package -package: build ## Alias for build - @echo "$(COLOR_GREEN)βœ“ Package ready for distribution$(COLOR_RESET)" - -.PHONY: install-local -install-local: build ## Install to local Joomla (upload via admin) - @echo "$(COLOR_BLUE)Package ready for installation$(COLOR_RESET)" - @case "$(EXTENSION_TYPE)" in \ - module) PACKAGE="mod_$(EXTENSION_NAME)";; \ - plugin) PACKAGE="plg_$(PLUGIN_GROUP)_$(EXTENSION_NAME)";; \ - component) PACKAGE="com_$(EXTENSION_NAME)";; \ - package) PACKAGE="pkg_$(EXTENSION_NAME)";; \ - template) PACKAGE="tpl_$(EXTENSION_NAME)";; \ - esac; \ - echo "$(COLOR_YELLOW)Upload $(DIST_DIR)/$${PACKAGE}-$(EXTENSION_VERSION).zip via Joomla Administrator$(COLOR_RESET)"; \ - echo "Admin URL: $(JOOMLA_ROOT) β†’ Extensions β†’ Install" - -.PHONY: dev-install -dev-install: ## Create symlink for development (Joomla 4+) - @echo "$(COLOR_BLUE)Creating development symlink...$(COLOR_RESET)" - @if [ ! -d "$(JOOMLA_ROOT)" ]; then \ - echo "$(COLOR_RED)βœ— Joomla root not found at $(JOOMLA_ROOT)$(COLOR_RESET)"; \ - echo "Update JOOMLA_ROOT in Makefile"; \ - exit 1; \ - fi - - @case "$(EXTENSION_TYPE)" in \ - module) \ - if [ "$(MODULE_TYPE)" = "admin" ]; then \ - TARGET="$(JOOMLA_ROOT)/administrator/modules/mod_$(EXTENSION_NAME)"; \ - else \ - TARGET="$(JOOMLA_ROOT)/modules/mod_$(EXTENSION_NAME)"; \ - fi; \ - ;; \ - plugin) \ - TARGET="$(JOOMLA_ROOT)/plugins/$(PLUGIN_GROUP)/$(EXTENSION_NAME)"; \ - ;; \ - component) \ - echo "$(COLOR_YELLOW)⚠ Components require complex symlink setup$(COLOR_RESET)"; \ - echo "Manual setup recommended for component development"; \ +.PHONY: build-beta +build-beta: clean ## Build beta release ZIP + @echo "$(COLOR_BLUE)Building $(EXTENSION_NAME) v$(EXTENSION_VERSION)-beta...$(COLOR_RESET)" + @mkdir -p $(BUILD_DIR)/package $(DIST_DIR) + @cp -r $(SRC_DIR)/* $(BUILD_DIR)/package/ + @cd $(BUILD_DIR)/package && \ + if command -v zip >/dev/null 2>&1; then \ + zip -r "../../$(DIST_DIR)/$(EXTENSION_NAME)-$(EXTENSION_VERSION)-beta.zip" .; \ + elif command -v pwsh >/dev/null 2>&1; then \ + pwsh -Command "Compress-Archive -Path '*' -DestinationPath '../../$(DIST_DIR)/$(EXTENSION_NAME)-$(EXTENSION_VERSION)-beta.zip' -Force"; \ + elif command -v powershell >/dev/null 2>&1; then \ + powershell -Command "Compress-Archive -Path '*' -DestinationPath '../../$(DIST_DIR)/$(EXTENSION_NAME)-$(EXTENSION_VERSION)-beta.zip' -Force"; \ + else \ + echo "$(COLOR_RED)βœ— No zip tool found$(COLOR_RESET)"; \ exit 1; \ - ;; \ - *) \ - echo "$(COLOR_RED)βœ— dev-install not supported for $(EXTENSION_TYPE)$(COLOR_RESET)"; \ - exit 1; \ - ;; \ - esac; \ - \ - rm -rf "$$TARGET"; \ - ln -s "$(PWD)" "$$TARGET"; \ - echo "$(COLOR_GREEN)βœ“ Development symlink created at $$TARGET$(COLOR_RESET)" + fi + @echo "$(COLOR_GREEN)βœ“ Package: $(DIST_DIR)/$(EXTENSION_NAME)-$(EXTENSION_VERSION)-beta.zip$(COLOR_RESET)" -.PHONY: watch -watch: ## Watch for changes and rebuild - @echo "$(COLOR_BLUE)Watching for changes...$(COLOR_RESET)" - @echo "$(COLOR_YELLOW)Press Ctrl+C to stop$(COLOR_RESET)" - @while true; do \ - inotifywait -r -e modify,create,delete --exclude '($(BUILD_DIR)|$(DIST_DIR)|vendor|node_modules)' . 2>/dev/null || \ - (echo "$(COLOR_YELLOW)⚠ inotifywait not installed. Install: apt-get install inotify-tools$(COLOR_RESET)" && sleep 5); \ - make build; \ +.PHONY: checksum +checksum: ## Generate SHA-256 checksums for dist packages + @echo "$(COLOR_BLUE)Generating checksums...$(COLOR_RESET)" + @for f in $(DIST_DIR)/*.zip; do \ + sha256sum "$$f" | tee "$${f}.sha256"; \ done + @echo "$(COLOR_GREEN)βœ“ Checksums generated$(COLOR_RESET)" + +# ── Release ─────────────────────────────────────────────────────────────────── + +.PHONY: release +release: validate build checksum ## Full release pipeline (validate + build + checksum) + @echo "$(COLOR_GREEN)βœ“ Release package ready$(COLOR_RESET)" + @echo "" + @echo "$(COLOR_BLUE)Next steps:$(COLOR_RESET)" + @echo " 1. Tag: git tag $(EXTENSION_VERSION)" + @echo " 2. Push: git push origin --tags" + @echo " 3. Create Gitea release and attach $(DIST_DIR)/$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip" + @echo "" + +# ── Info ────────────────────────────────────────────────────────────────────── .PHONY: version -version: ## Display version information +version: ## Display version and extension info @echo "$(COLOR_BLUE)Extension Information:$(COLOR_RESET)" @echo " Name: $(EXTENSION_NAME)" @echo " Type: $(EXTENSION_TYPE)" @echo " Version: $(EXTENSION_VERSION)" - @if [ "$(EXTENSION_TYPE)" = "module" ]; then \ - echo " Module: $(MODULE_TYPE)"; \ - fi - @if [ "$(EXTENSION_TYPE)" = "plugin" ]; then \ - echo " Group: $(PLUGIN_GROUP)"; \ - fi - -.PHONY: docs -docs: ## Generate documentation - @echo "$(COLOR_BLUE)Generating documentation...$(COLOR_RESET)" - @mkdir -p $(DOCS_DIR) - @echo "$(COLOR_YELLOW)⚠ Documentation generation not configured$(COLOR_RESET)" - @echo "Consider adding phpDocumentor or similar" - -.PHONY: release -release: validate test build ## Create a release (validate + test + build) - @echo "$(COLOR_GREEN)βœ“ Release package ready$(COLOR_RESET)" - @echo "" - @echo "$(COLOR_BLUE)Release Checklist:$(COLOR_RESET)" - @echo " [ ] Update CHANGELOG.md" - @echo " [ ] Update version in XML manifest" - @echo " [ ] Test installation in clean Joomla" - @echo " [ ] Tag release in git: git tag v$(EXTENSION_VERSION)" - @echo " [ ] Push tags: git push --tags" - @echo " [ ] Create GitHub release" - @echo "" - @case "$(EXTENSION_TYPE)" in \ - module) PACKAGE="mod_$(EXTENSION_NAME)";; \ - plugin) PACKAGE="plg_$(PLUGIN_GROUP)_$(EXTENSION_NAME)";; \ - component) PACKAGE="com_$(EXTENSION_NAME)";; \ - package) PACKAGE="pkg_$(EXTENSION_NAME)";; \ - template) PACKAGE="tpl_$(EXTENSION_NAME)";; \ - esac; \ - echo "$(COLOR_GREEN)Package: $(DIST_DIR)/$${PACKAGE}-$(EXTENSION_VERSION).zip$(COLOR_RESET)" .PHONY: security-check -security-check: ## Run security checks on dependencies +security-check: ## Run Composer security audit @echo "$(COLOR_BLUE)Running security checks...$(COLOR_RESET)" - @if [ -f "composer.json" ]; then \ - $(COMPOSER) audit || echo "$(COLOR_YELLOW)⚠ Vulnerabilities found$(COLOR_RESET)"; \ - fi - @if [ -f "package.json" ]; then \ - $(NPM) audit || echo "$(COLOR_YELLOW)⚠ Vulnerabilities found$(COLOR_RESET)"; \ - fi + @$(COMPOSER) audit + @echo "$(COLOR_GREEN)βœ“ Security check complete$(COLOR_RESET)" .PHONY: all -all: install-deps validate test build ## Run complete build pipeline +all: install-deps validate build checksum ## Full pipeline: deps β†’ validate β†’ build β†’ checksum @echo "$(COLOR_GREEN)βœ“ Complete build pipeline finished$(COLOR_RESET)" -# Default target .DEFAULT_GOAL := help diff --git a/README.md b/README.md index f120c8e..00684c6 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ # FILE INFORMATION DEFGROUP: Joomla.Template.Site INGROUP: MokoCassiopeia.Documentation - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: ./README.md - VERSION: 03.09.13 + VERSION: 03.09.14 BRIEF: Documentation for MokoCassiopeia template --> @@ -17,7 +17,7 @@ **A Modern, Lightweight Joomla Template Based on Cassiopeia** -[![Version](https://img.shields.io/badge/version-03.09.07-blue.svg?logo=v&logoColor=white)](https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/tag/v03) +[![Version](https://img.shields.io/badge/version-03.09.07-blue.svg?logo=v&logoColor=white)](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/v03) [![License](https://img.shields.io/badge/license-GPL--3.0--or--later-green.svg?logo=gnu&logoColor=white)](LICENSE) [![Joomla](https://img.shields.io/badge/Joomla-5.x%20%7C%206.x-red.svg?logo=joomla&logoColor=white)](https://www.joomla.org) [![PHP](https://img.shields.io/badge/PHP-8.1%2B-777BB4.svg?logo=php&logoColor=white)](https://www.php.net) @@ -101,7 +101,7 @@ MokoCassiopeia is a modern, lightweight enhancement layer built on top of Joomla ### Via Joomla Extension Manager -1. Download the latest `mokocassiopeia-{version}.zip` from [Releases](https://github.com/mokoconsulting-tech/MokoCassiopeia/releases) +1. Download the latest `mokocassiopeia-{version}.zip` from [Releases](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases) 2. In Joomla admin, navigate to **System β†’ Install β†’ Extensions** 3. Upload the ZIP file and click **Upload & Install** 4. Navigate to **System β†’ Site Templates** @@ -110,7 +110,7 @@ MokoCassiopeia is a modern, lightweight enhancement layer built on top of Joomla ### Via Git (Development) ```bash -git clone https://github.com/mokoconsulting-tech/MokoCassiopeia.git +git clone https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia.git cd MokoCassiopeia ``` @@ -311,7 +311,7 @@ When enabled, the template adds: ```bash # Clone repository -git clone https://github.com/mokoconsulting-tech/MokoCassiopeia.git +git clone https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia.git cd MokoCassiopeia # Install development dependencies (if using Composer) @@ -371,8 +371,8 @@ See the [CHANGELOG.md](./CHANGELOG.md) for detailed version history. ### Getting Help - **Documentation**: Check this README and [docs folder](./docs/) -- **Issues**: Report bugs via [GitHub Issues](https://github.com/mokoconsulting-tech/MokoCassiopeia/issues) -- **Discussions**: Ask questions in [GitHub Discussions](https://github.com/mokoconsulting-tech/MokoCassiopeia/discussions) +- **Issues**: Report bugs via [GitHub Issues](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/issues) +- **Discussions**: Ask questions in [GitHub Discussions](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/discussions) - **Roadmap**: View planned features in [Roadmap](https://mokoconsulting.tech/support/joomla-cms/mokocassiopeia-roadmap) ### Reporting Bugs @@ -487,9 +487,9 @@ All third-party libraries and assets remain the property of their respective aut ## πŸ”— Links -- **Repository**: [GitHub](https://github.com/mokoconsulting-tech/MokoCassiopeia) -- **Issue Tracker**: [GitHub Issues](https://github.com/mokoconsulting-tech/MokoCassiopeia/issues) -- **Discussions**: [GitHub Discussions](https://github.com/mokoconsulting-tech/MokoCassiopeia/discussions) +- **Repository**: [GitHub](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) +- **Issue Tracker**: [GitHub Issues](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/issues) +- **Discussions**: [GitHub Discussions](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/discussions) - **Roadmap**: [Full Roadmap](https://mokoconsulting.tech/support/joomla-cms/mokocassiopeia-roadmap) - **Moko Consulting**: [Website](https://mokoconsulting.tech) @@ -499,7 +499,7 @@ All third-party libraries and assets remain the property of their respective aut - **Maintainer**: Moko Consulting Engineering - **Author**: Jonathan Miller (@jmiller-moko) -- **Repository**: https://github.com/mokoconsulting-tech/MokoCassiopeia +- **Repository**: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia - **License**: GPL-3.0-or-later - **Classification**: Public Open Source Standards diff --git a/SECURITY.md b/SECURITY.md index 778309e..2cf02af 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -8,7 +8,7 @@ # FILE INFORMATION DEFGROUP: Joomla.Template INGROUP: MokoCassiopeia.Governance - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: SECURITY.md VERSION: 03.09.03 BRIEF: Security policy and vulnerability reporting process for MokoCassiopeia. @@ -169,7 +169,7 @@ If you want credit, include the name or handle to list in an advisory. If you pr ## Metadata * **Document:** SECURITY.md -* **Repository:** [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* **Repository:** [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * **Path:** /SECURITY.md * **Owner:** Moko Consulting * **Version:** 03.06.00 diff --git a/composer.json b/composer.json index 8b13789..5f32b61 100644 --- a/composer.json +++ b/composer.json @@ -1 +1,29 @@ - +{ + "name": "mokoconsulting/mokocassiopeia", + "description": "MokoCassiopeia β€” Joomla site template based on Cassiopeia", + "type": "joomla-template", + "license": "GPL-3.0-or-later", + "authors": [ + { + "name": "Jonathan Miller", + "email": "hello@mokoconsulting.tech" + } + ], + "require": { + "php": ">=8.1" + }, + "require-dev": { + "mokoconsulting-tech/enterprise": "^4.0" + }, + "config": { + "sort-packages": true, + "optimize-autoloader": true, + "preferred-install": "dist" + }, + "repositories": [ + { + "type": "composer", + "url": "https://git.mokoconsulting.tech/api/packages/MokoConsulting/composer" + } + ] +} diff --git a/docs/CSS_VARIABLES.md b/docs/CSS_VARIABLES.md index 17d9794..666a2e9 100644 --- a/docs/CSS_VARIABLES.md +++ b/docs/CSS_VARIABLES.md @@ -8,7 +8,7 @@ # FILE INFORMATION DEFGROUP: Joomla.Template.Site INGROUP: MokoCassiopeia.Documentation - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: docs/CSS_VARIABLES.md VERSION: 03.09.03 BRIEF: Complete CSS variable reference for MokoCassiopeia template @@ -1443,7 +1443,7 @@ These ensure optimal readability for links within alert boxes. ## Metadata * Document: docs/CSS_VARIABLES.md -* Repository: [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* Repository: [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * Path: /docs/CSS_VARIABLES.md * Owner: Moko Consulting * Version: 03.09.02 diff --git a/docs/JOOMLA_DEVELOPMENT.md b/docs/JOOMLA_DEVELOPMENT.md index 135369f..bdb742a 100644 --- a/docs/JOOMLA_DEVELOPMENT.md +++ b/docs/JOOMLA_DEVELOPMENT.md @@ -360,7 +360,7 @@ All scripts and workflows are licensed under GPL-3.0-or-later, same as the main ## Metadata * Document: docs/JOOMLA_DEVELOPMENT.md -* Repository: [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* Repository: [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * Path: /docs/JOOMLA_DEVELOPMENT.md * Owner: Moko Consulting * Version: 03.06.03 diff --git a/docs/MANUAL_DEPLOYMENT.md b/docs/MANUAL_DEPLOYMENT.md index ece9f6c..b6793a9 100644 --- a/docs/MANUAL_DEPLOYMENT.md +++ b/docs/MANUAL_DEPLOYMENT.md @@ -12,7 +12,7 @@ This guide explains how to manually deploy the MokoCassiopeia template from the ## Overview -**Important**: The `src` directory in this repository is the development source, not a ready-to-install package. For production use, we recommend using the packaged ZIP file from [Releases](https://github.com/mokoconsulting-tech/MokoCassiopeia/releases). +**Important**: The `src` directory in this repository is the development source, not a ready-to-install package. For production use, we recommend using the packaged ZIP file from [Releases](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases). However, for development or testing purposes, you can manually deploy files from the `src` directory to your Joomla installation. @@ -300,7 +300,7 @@ If you encounter issues with manual deployment: 1. Check this troubleshooting guide first 2. Review [Joomla's template documentation](https://docs.joomla.org/J4.x:Creating_a_Simple_Template) -3. Open an issue on [GitHub](https://github.com/mokoconsulting-tech/MokoCassiopeia/issues) +3. Open an issue on [GitHub](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/issues) 4. Contact: hello@mokoconsulting.tech --- diff --git a/docs/MODULE_OVERRIDES.md b/docs/MODULE_OVERRIDES.md index 1940188..97b6856 100644 --- a/docs/MODULE_OVERRIDES.md +++ b/docs/MODULE_OVERRIDES.md @@ -22,7 +22,7 @@ # FILE INFORMATION DEFGROUP: Joomla.Template.Site INGROUP: MokoCassiopeia.Documentation - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: docs/MODULE_OVERRIDES.md VERSION: 03.09.03 BRIEF: Comprehensive guide to MokoCassiopeia mobile-responsive module overrides @@ -647,7 +647,7 @@ Override CSS variables in your custom color scheme: ### Getting Help - **Documentation**: Check module-specific README files -- **GitHub Issues**: [Report issues](https://github.com/mokoconsulting-tech/MokoCassiopeia/issues) +- **GitHub Issues**: [Report issues](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/issues) - **Support**: hello@mokoconsulting.tech --- @@ -703,14 +703,14 @@ In your template's `index.php`, specify layout for entire module position: - **Main README**: [README.md](../README.md) - **Changelog**: [CHANGELOG.md](../CHANGELOG.md) - **CSS Variables**: [CSS_VARIABLES.md](CSS_VARIABLES.md) -- **Repository**: [GitHub](https://github.com/mokoconsulting-tech/MokoCassiopeia) +- **Repository**: [GitHub](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) --- ## Metadata * Document: docs/MODULE_OVERRIDES.md -* Repository: [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* Repository: [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * Path: /docs/MODULE_OVERRIDES.md * Owner: Moko Consulting * Version: 03.07.00 diff --git a/docs/OVERRIDE_PHILOSOPHY.md b/docs/OVERRIDE_PHILOSOPHY.md index 4809fe1..bd880e1 100644 --- a/docs/OVERRIDE_PHILOSOPHY.md +++ b/docs/OVERRIDE_PHILOSOPHY.md @@ -22,7 +22,7 @@ # FILE INFORMATION DEFGROUP: Joomla.Template.Site INGROUP: MokoCassiopeia.Documentation - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: docs/OVERRIDE_PHILOSOPHY.md VERSION: 03.09.03 BRIEF: Philosophy and implementation of non-replacing alternative layouts diff --git a/docs/QUICK_START.md b/docs/QUICK_START.md index 32ef8a7..c7f5b29 100644 --- a/docs/QUICK_START.md +++ b/docs/QUICK_START.md @@ -17,7 +17,7 @@ Before you begin, ensure you have: ### 1. Clone the Repository ```bash -git clone https://github.com/mokoconsulting-tech/MokoCassiopeia.git +git clone https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia.git cd MokoCassiopeia ``` @@ -317,7 +317,7 @@ make help # Show all commands ## Metadata * Document: docs/QUICK_START.md -* Repository: [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* Repository: [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * Path: /docs/QUICK_START.md * Owner: Moko Consulting * Version: 03.06.03 diff --git a/docs/README.md b/docs/README.md index 7c713ec..5525d43 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,7 +22,7 @@ # FILE INFORMATION DEFGROUP: Joomla.Template.Site INGROUP: MokoCassiopeia.Documentation - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: docs/README.md VERSION: 03.09.03 BRIEF: Documentation index for MokoCassiopeia template @@ -145,7 +145,7 @@ Before contributing, please read: ## Standards Compliance -This project adheres to [MokoStandards](https://github.com/mokoconsulting-tech/MokoStandards) for: +This project adheres to [MokoStandards](https://git.mokoconsulting.tech/MokoConsulting/MokoStandards) for: * Coding standards and formatting * Documentation requirements @@ -155,8 +155,8 @@ This project adheres to [MokoStandards](https://github.com/mokoconsulting-tech/M ## Additional Resources -* **Repository**: [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) -* **Issue Tracker**: [GitHub Issues](https://github.com/mokoconsulting-tech/MokoCassiopeia/issues) +* **Repository**: [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) +* **Issue Tracker**: [GitHub Issues](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/issues) * **Changelog**: [CHANGELOG.md](../CHANGELOG.md) * **License**: [GPL-3.0-or-later](../LICENSE) @@ -170,7 +170,7 @@ This project adheres to [MokoStandards](https://github.com/mokoconsulting-tech/M ## Metadata * Document: docs/README.md -* Repository: [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* Repository: [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * Path: /docs/README.md * Owner: Moko Consulting * Version: 03.07.00 diff --git a/docs/RELEASE_PROCESS.md b/docs/RELEASE_PROCESS.md index a3a36e9..22e687e 100644 --- a/docs/RELEASE_PROCESS.md +++ b/docs/RELEASE_PROCESS.md @@ -22,7 +22,7 @@ # FILE INFORMATION DEFGROUP: Joomla.Template.Site INGROUP: MokoCassiopeia.Documentation - REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: docs/RELEASE_PROCESS.md VERSION: 03.09.03 BRIEF: Complete release process documentation for MokoCassiopeia @@ -282,7 +282,7 @@ cat build/mokocassiopeia-src-03.08.04.zip.sha256 # Edit updates.xml # Update 03.08.04 # Update 2026-02-27 -# Update https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/03.08.04/mokocassiopeia-src-03.08.04.zip +# Update https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/03.08.04/mokocassiopeia-src-03.08.04.zip # Update sha256:a1b2c3d4e5f6... # Commit and push @@ -312,10 +312,10 @@ git push hello@mokoconsulting.tech (C)GNU General Public License Version 3 - 2026 Moko Consulting - https://github.com/mokoconsulting-tech/MokoCassiopeia + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/03.08.04/mokocassiopeia-src-03.08.04.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/03.08.04/mokocassiopeia-src-03.08.04.zip sha256:a1b2c3d4e5f6... @@ -625,8 +625,8 @@ git push ## Support -- **Issues**: [GitHub Issues](https://github.com/mokoconsulting-tech/MokoCassiopeia/issues) -- **Discussions**: [GitHub Discussions](https://github.com/mokoconsulting-tech/MokoCassiopeia/discussions) +- **Issues**: [GitHub Issues](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/issues) +- **Discussions**: [GitHub Discussions](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/discussions) - **Email**: hello@mokoconsulting.tech --- diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 45f5a83..c47caec 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -22,7 +22,7 @@ # FILE INFORMATION DEFGROUP: Joomla.Template.Site INGROUP: MokoCassiopeia.Documentation - REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia + REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-cassiopeia FILE: docs/ROADMAP.md VERSION: 03.09.03 BRIEF: Version-specific roadmap for MokoCassiopeia template @@ -860,8 +860,8 @@ MokoCassiopeia aims to be the **most developer-friendly, user-customizable, and ### Official Links - **Full Roadmap**: [https://mokoconsulting.tech/support/joomla-cms/mokocassiopeia-roadmap](https://mokoconsulting.tech/support/joomla-cms/mokocassiopeia-roadmap) -- **Repository**: [https://github.com/mokoconsulting-tech/moko-cassiopeia](https://github.com/mokoconsulting-tech/moko-cassiopeia) -- **Issue Tracker**: [GitHub Issues](https://github.com/mokoconsulting-tech/moko-cassiopeia/issues) +- **Repository**: [https://git.mokoconsulting.tech/MokoConsulting/moko-cassiopeia](https://git.mokoconsulting.tech/MokoConsulting/moko-cassiopeia) +- **Issue Tracker**: [GitHub Issues](https://git.mokoconsulting.tech/MokoConsulting/moko-cassiopeia/issues) - **Changelog**: [CHANGELOG.md](../CHANGELOG.md) ### Community @@ -882,7 +882,7 @@ MokoCassiopeia aims to be the **most developer-friendly, user-customizable, and Have ideas for future features? We welcome community input! **How to Suggest Features**: -1. Check the [GitHub Issues](https://github.com/mokoconsulting-tech/moko-cassiopeia/issues) for existing requests +1. Check the [GitHub Issues](https://git.mokoconsulting.tech/MokoConsulting/moko-cassiopeia/issues) for existing requests 2. Open a new issue with the `enhancement` label 3. Provide clear use cases and benefits 4. Engage in community discussion @@ -900,7 +900,7 @@ Have ideas for future features? We welcome community input! ## Metadata * Document: docs/ROADMAP.md -* Repository: [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* Repository: [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * Path: /docs/ROADMAP.md * Owner: Moko Consulting * Version: 03.06.03 diff --git a/docs/WORKFLOW_GUIDE.md b/docs/WORKFLOW_GUIDE.md index 90a5cf7..9b8bfa9 100644 --- a/docs/WORKFLOW_GUIDE.md +++ b/docs/WORKFLOW_GUIDE.md @@ -443,7 +443,7 @@ phpcs --standard=phpcs.xml --report=source src/ ## Metadata * Document: docs/WORKFLOW_GUIDE.md -* Repository: [https://github.com/mokoconsulting-tech/MokoCassiopeia](https://github.com/mokoconsulting-tech/MokoCassiopeia) +* Repository: [https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia](https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia) * Path: /docs/WORKFLOW_GUIDE.md * Owner: Moko Consulting * Version: 03.06.03 diff --git a/src/joomla.asset.json b/src/joomla.asset.json index ff60ae1..16a8f1a 100644 --- a/src/joomla.asset.json +++ b/src/joomla.asset.json @@ -12,12 +12,12 @@ "spdx_license": "GPL-3.0-or-later", "notice": "This file is part of a Moko Consulting project.", "disclaimer": "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License; 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 https://www.gnu.org/licenses/.", - "repo": "https://github.com/mokoconsulting-tech/MokoCassiopeia", + "repo": "https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia", "file_information": { "defgroup": "Joomla.Template.Site", "ingroup": "MokoCassiopeia.Template.Assets", "path": "./media/templates/site/mokocassiopeia/joomla.asset.json", - "version": "03.09.02", + "version": "03.09.14", "brief": "Joomla asset registry for MokoCassiopeia" } }, @@ -124,6 +124,12 @@ "uri": "media/templates/site/mokocassiopeia/css/theme/dark.custom.min.css", "attributes": {"media": "all"} }, + { + "name": "template.a11y-high-contrast", + "type": "style", + "uri": "media/templates/site/mokocassiopeia/css/a11y-high-contrast.css", + "attributes": {"media": "all"} + }, { "name": "template.js", "type": "script", diff --git a/src/media/css/a11y-high-contrast.css b/src/media/css/a11y-high-contrast.css new file mode 100644 index 0000000..10606fa --- /dev/null +++ b/src/media/css/a11y-high-contrast.css @@ -0,0 +1,227 @@ +@charset "UTF-8"; +/* Copyright (C) 2026 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.Accessibility + * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia + * PATH: ./media/css/a11y-high-contrast.css + * VERSION: 03.09.14 + * BRIEF: High-contrast stylesheet for accessibility toolbar + */ + +/* =================================================================== + * HIGH CONTRAST MODE + * Applied when .a11y-high-contrast is on . + * Overrides theme variables to maximise contrast ratios (WCAG AAA). + * =================================================================== */ + +/* ── Light mode high contrast ─────────────────────────────────────── */ +:root[data-bs-theme="light"].a11y-high-contrast { + --body-color: #000; + --body-color-rgb: 0, 0, 0; + --body-bg: #fff; + --body-bg-rgb: 255, 255, 255; + --heading-color: #000; + --emphasis-color: #000; + --secondary-color: #000000bf; + --tertiary-color: #00000080; + --muted-color: #333; + + /* Links β€” strong blue on white */ + --color-link: #0000ee; + --link-color: #0000ee; + --link-color-rgb: 0, 0, 238; + --color-hover: #cc0000; + --link-hover-color: #cc0000; + --link-hover-color-rgb: 204, 0, 0; + + /* Borders β€” visible on all backgrounds */ + --border-color: #000; + --border-color-soft: #333; + + /* Backgrounds */ + --secondary-bg: #e0e0e0; + --secondary-bg-rgb: 224, 224, 224; + --tertiary-bg: #f0f0f0; + --tertiary-bg-rgb: 240, 240, 240; + + /* Navigation */ + --nav-bg-color: #000; + --nav-text-color: #fff; + --mainmenu-nav-link-color: #fff; + + /* Buttons */ + --btn-color: #fff; + --btn-bg: #000; + --btn-border-color: #000; + --btn-hover-color: #000; + --btn-hover-bg: #ffff00; + --btn-hover-border-color: #000; + --btn-active-color: #000; + --btn-active-bg: #ffff00; + --btn-active-border-color: #000; + + /* Forms */ + --input-color: #000; + --input-bg: #fff; + --input-border-color: #000; + --input-focus-color: #000; + --input-focus-bg: #ffffcc; + --input-focus-border-color: #0000ee; + --input-placeholder-color: #555; + + /* Cards */ + --card-border-color: #000; + --card-bg: #fff; + --card-cap-bg: #e0e0e0; + + /* Tables */ + --table-color: #000; + --table-bg: #fff; + --table-border-color: #000; + --table-striped-bg: #f0f0f0; + --table-hover-bg: #ffff99; + + /* Alerts */ + --alert-border-width: 2px; + + /* Code */ + --code-color: #000; + --code-bg-color: #ffffcc; + + /* Selection */ + --selection-bg: #0000ee; + --selection-ink: #fff; + + /* Focus indicator β€” always visible */ + --focus-ring-color: #0000ee; + --focus-ring-width: 3px; +} + +/* ── Dark mode high contrast ──────────────────────────────────────── */ +:root[data-bs-theme="dark"].a11y-high-contrast { + --body-color: #fff; + --body-color-rgb: 255, 255, 255; + --body-bg: #000; + --body-bg-rgb: 0, 0, 0; + --heading-color: #fff; + --emphasis-color: #fff; + --secondary-color: #ffffffbf; + --tertiary-color: #ffffff80; + --muted-color: #ccc; + + /* Links β€” bright yellow on black */ + --color-link: #ffff00; + --link-color: #ffff00; + --link-color-rgb: 255, 255, 0; + --color-hover: #00ffff; + --link-hover-color: #00ffff; + --link-hover-color-rgb: 0, 255, 255; + + /* Borders */ + --border-color: #fff; + --border-color-soft: #ccc; + + /* Backgrounds */ + --secondary-bg: #1a1a1a; + --secondary-bg-rgb: 26, 26, 26; + --tertiary-bg: #111; + --tertiary-bg-rgb: 17, 17, 17; + + /* Navigation */ + --nav-bg-color: #000; + --nav-text-color: #fff; + --mainmenu-nav-link-color: #ffff00; + + /* Buttons */ + --btn-color: #000; + --btn-bg: #ffff00; + --btn-border-color: #ffff00; + --btn-hover-color: #000; + --btn-hover-bg: #00ffff; + --btn-hover-border-color: #00ffff; + --btn-active-color: #000; + --btn-active-bg: #00ffff; + --btn-active-border-color: #00ffff; + + /* Forms */ + --input-color: #fff; + --input-bg: #000; + --input-border-color: #fff; + --input-focus-color: #fff; + --input-focus-bg: #1a1a1a; + --input-focus-border-color: #ffff00; + --input-placeholder-color: #aaa; + + /* Cards */ + --card-border-color: #fff; + --card-bg: #000; + --card-cap-bg: #1a1a1a; + + /* Tables */ + --table-color: #fff; + --table-bg: #000; + --table-border-color: #fff; + --table-striped-bg: #111; + --table-hover-bg: #333; + + /* Alerts */ + --alert-border-width: 2px; + + /* Code */ + --code-color: #00ff00; + --code-bg-color: #1a1a1a; + + /* Selection */ + --selection-bg: #ffff00; + --selection-ink: #000; + + /* Focus indicator */ + --focus-ring-color: #ffff00; + --focus-ring-width: 3px; +} + +/* ── Shared high-contrast overrides (both modes) ──────────────────── */ +.a11y-high-contrast * { + border-color: var(--border-color) !important; +} + +.a11y-high-contrast *:focus-visible { + outline: var(--focus-ring-width, 3px) solid var(--focus-ring-color, #0000ee) !important; + outline-offset: 2px !important; +} + +.a11y-high-contrast img { + outline: 2px solid var(--border-color); +} + +.a11y-high-contrast a { + text-decoration: underline !important; + text-decoration-thickness: 2px !important; +} + +.a11y-high-contrast button, +.a11y-high-contrast .btn, +.a11y-high-contrast input, +.a11y-high-contrast select, +.a11y-high-contrast textarea { + border-width: 2px !important; + border-style: solid !important; +} + +.a11y-high-contrast .badge, +.a11y-high-contrast .alert { + border: 2px solid var(--border-color) !important; +} + +/* Ensure disabled states are still distinguishable */ +.a11y-high-contrast [disabled], +.a11y-high-contrast .disabled { + opacity: .5 !important; + text-decoration: line-through !important; +} diff --git a/src/media/css/template.css b/src/media/css/template.css index 2251e3f..5b82fc3 100644 --- a/src/media/css/template.css +++ b/src/media/css/template.css @@ -13780,14 +13780,6 @@ meter { margin-left: auto; } -.page-link { - color: var(--color-link, white); -} - -.page-link:active { - color: var(--color-link, white); -} - .pager .pagination { -webkit-box-pack: center; -ms-flex-pack: center; @@ -13987,10 +13979,9 @@ meter { } .footer { - padding-top: 1rem; - color: var(--body-bg, #e6ebf1); + color: var(--mainmenu-nav-link-color, #fff); background-color: var(--nav-bg-color); - padding-bottom: 80px; + padding-bottom: var(--footer-padding-bottom, 80px); } .footer .grid-child { @@ -14002,7 +13993,6 @@ meter { -ms-flex-direction: column; flex-direction: column; width: 100%; - padding: 2.5rem 0.5em; } .footer a { @@ -14248,8 +14238,8 @@ fieldset>* { .container-header .navbar-brand { position: relative; display: inline-block; - padding-top: 0.3125rem; - padding-bottom: 0.3125rem; + padding-top: var(--navbar-brand-padding-y, 0.3125rem); + padding-bottom: var(--navbar-brand-padding-y, 0.3125rem); font-size: 2rem; color: var(--nav-text-color, gray); -webkit-margin-end: auto; @@ -15781,7 +15771,7 @@ body.wrapper-fluid header>.grid-child { } footer .grid-child>div { - padding: 1rem 0 0; + padding: var(--navbar-padding-y, 1rem) var(--navbar-padding-x, 1rem) 0; } header .grid-child .navbar-brand { @@ -17080,8 +17070,8 @@ form .form-select { background: var(--muted-color, #6d757e); box-shadow: var(--box-shadow, 0 .5rem 1rem #00000066); font: inherit; - color: var(--body-bg, #0e1318); - font-weight: 600px; + color: #fff; + font-weight: 600; } #mokoThemeFab.pos-br { @@ -17143,10 +17133,112 @@ button#mokoThemeSwitch { #mokoThemeFab .label { user-select: none; font-size: .875rem; + color: #fff; } #mokoThemeFab button { - color: var(--body-bg, #0e1318); + color: #fff; +} + +/* Auto toggle switch (on/off style) */ +.auto-toggle-wrap { + display: flex; + align-items: center; + gap: .35rem; +} + +.auto-label { + font-size: .75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: .04em; + opacity: .7; + user-select: none; +} + +.auto-switch { + position: relative; + display: inline-flex; + align-items: center; + width: 32px; + height: 18px; + border: none; + border-radius: 999px; + background: var(--secondary-color, #6c757d); + cursor: pointer; + padding: 0; + transition: background .2s; +} + +.auto-switch.on { + background: var(--link-color, #3565e5); +} + +.auto-track { + position: relative; + width: 100%; + height: 100%; +} + +.auto-knob { + position: absolute; + top: 2px; + left: 2px; + width: 14px; + height: 14px; + border-radius: 50%; + background: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.3); + transition: transform .2s ease; +} + +.auto-switch.on .auto-knob { + transform: translateX(14px); +} + +/* FAB divider between theme controls and a11y */ +.fab-divider { + display: block; + width: 1px; + height: 24px; + background: currentColor; + opacity: .25; + margin: 0 .15rem; +} + +/* Inline a11y toggle inside theme FAB */ +.a11y-toggle-inline { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: 50%; + border: 1.5px solid currentColor; + background: transparent; + color: inherit; + font-size: 1rem; + cursor: pointer; + padding: 0; + transition: background .2s, color .2s; + opacity: .8; +} + +.a11y-toggle-inline:hover, +.a11y-toggle-inline:focus-visible { + opacity: 1; + background: rgba(255,255,255,.15); +} + +.a11y-toggle-inline.active { + opacity: 1; + background: rgba(255,255,255,.25); +} + +/* Floating a11y panel when inline */ +.a11y-toolbar-floating { + position: fixed; + z-index: 1202; } body.site.error-page { @@ -17372,11 +17464,9 @@ html.a11y-pause-animations *::after { right: 2.5rem; } -/* When theme FAB is present, sit a11y toolbar to its left */ +/* When theme FAB is present, a11y toggle is inline β€” hide standalone toolbar positioning */ body[data-theme-fab-enabled="1"] #mokoA11yToolbar { - right: auto; - left: 2.5rem; - bottom: 1rem; + position: static; } /* Toggle button */ diff --git a/src/media/css/theme/dark.custom.css b/src/media/css/theme/dark.custom.css index 50f9782..b04fd7e 100644 --- a/src/media/css/theme/dark.custom.css +++ b/src/media/css/theme/dark.custom.css @@ -817,6 +817,12 @@ color-scheme: dark; --table-active-color: var(--body-color); --table-active-bg: rgba(var(--white-rgb), 0.1); +/* ===== FOOTER ===== */ +--footer-padding-top: 1rem; +--footer-padding-bottom: 80px; +--footer-grid-padding-y: 2.5rem; +--footer-grid-padding-x: 0.5em; + /* ===== BACKDROP ===== */ --backdrop-zindex: 1040; --backdrop-bg: hsl(0, 0%, 0%); diff --git a/src/media/css/theme/dark.standard.css b/src/media/css/theme/dark.standard.css index 97515a7..8f2a82d 100644 --- a/src/media/css/theme/dark.standard.css +++ b/src/media/css/theme/dark.standard.css @@ -817,6 +817,12 @@ color-scheme: dark; --table-active-color: var(--body-color); --table-active-bg: rgba(var(--white-rgb), 0.1); +/* ===== FOOTER ===== */ +--footer-padding-top: 1rem; +--footer-padding-bottom: 80px; +--footer-grid-padding-y: 2.5rem; +--footer-grid-padding-x: 0.5em; + /* ===== BACKDROP ===== */ --backdrop-zindex: 1040; --backdrop-bg: hsl(0, 0%, 0%); diff --git a/src/media/css/theme/light.custom.css b/src/media/css/theme/light.custom.css index 53dc8c4..a99b9db 100644 --- a/src/media/css/theme/light.custom.css +++ b/src/media/css/theme/light.custom.css @@ -816,6 +816,12 @@ color-scheme: light; --table-active-color: var(--body-color); --table-active-bg: rgba(var(--black-rgb), 0.075); +/* ===== FOOTER ===== */ +--footer-padding-top: 1rem; +--footer-padding-bottom: 80px; +--footer-grid-padding-y: 2.5rem; +--footer-grid-padding-x: 0.5em; + /* ===== BACKDROP ===== */ --backdrop-zindex: 1040; --backdrop-bg: hsl(0, 0%, 0%); diff --git a/src/media/css/theme/light.standard.css b/src/media/css/theme/light.standard.css index 3ca6e62..07a74c2 100644 --- a/src/media/css/theme/light.standard.css +++ b/src/media/css/theme/light.standard.css @@ -816,6 +816,12 @@ color-scheme: light; --table-active-color: var(--body-color); --table-active-bg: rgba(var(--black-rgb), 0.075); +/* ===== FOOTER ===== */ +--footer-padding-top: 1rem; +--footer-padding-bottom: 80px; +--footer-grid-padding-y: 2.5rem; +--footer-grid-padding-x: 0.5em; + /* ===== BACKDROP ===== */ --backdrop-zindex: 1040; --backdrop-bg: hsl(0, 0%, 0%); diff --git a/src/media/js/template.js b/src/media/js/template.js index b1d85d1..f1fb442 100644 --- a/src/media/js/template.js +++ b/src/media/js/template.js @@ -87,13 +87,40 @@ lblD.className = 'label'; lblD.textContent = 'Dark'; - // Auto button + // Auto toggle (on/off switch style) + var autoWrap = doc.createElement('div'); + autoWrap.className = 'auto-toggle-wrap'; + + var autoLabel = doc.createElement('span'); + autoLabel.className = 'auto-label'; + autoLabel.textContent = 'Auto'; + var auto = doc.createElement('button'); auto.id = 'mokoThemeAuto'; auto.type = 'button'; - auto.className = 'btn btn-sm btn-link text-decoration-none px-2'; - auto.setAttribute('aria-label', 'Follow system theme'); - auto.textContent = 'Auto'; + auto.className = 'auto-switch'; + auto.setAttribute('role', 'switch'); + auto.setAttribute('aria-label', 'Automatic theme (follow system)'); + auto.setAttribute('aria-checked', getStored() ? 'false' : 'true'); + + var autoTrack = doc.createElement('span'); + autoTrack.className = 'auto-track'; + var autoKnob = doc.createElement('span'); + autoKnob.className = 'auto-knob'; + autoTrack.appendChild(autoKnob); + auto.appendChild(autoTrack); + if (!getStored()) auto.classList.add('on'); + + autoWrap.appendChild(autoLabel); + autoWrap.appendChild(auto); + + // Divider before a11y slot + var divider = doc.createElement('span'); + divider.className = 'fab-divider'; + + // A11y slot β€” buildA11yToolbar will inject its toggle here + var a11ySlot = doc.createElement('span'); + a11ySlot.id = 'mokoA11ySlot'; // Behavior switchWrap.addEventListener('click', function () { @@ -101,6 +128,9 @@ var next = current === 'dark' ? 'light' : 'dark'; applyTheme(next); switchWrap.setAttribute('aria-checked', next === 'dark' ? 'true' : 'false'); + // Turn off auto when manually switching + auto.classList.remove('on'); + auto.setAttribute('aria-checked', 'false'); // Update meta theme color var meta = doc.querySelector('meta[name="theme-color"]'); if (meta) { @@ -109,10 +139,14 @@ }); auto.addEventListener('click', function () { - clearStored(); - var sys = systemTheme(); - applyTheme(sys); - switchWrap.setAttribute('aria-checked', sys === 'dark' ? 'true' : 'false'); + var isAuto = auto.classList.toggle('on'); + auto.setAttribute('aria-checked', isAuto ? 'true' : 'false'); + if (isAuto) { + clearStored(); + var sys = systemTheme(); + applyTheme(sys); + switchWrap.setAttribute('aria-checked', sys === 'dark' ? 'true' : 'false'); + } }); // Respond to OS changes only when not user-forced @@ -134,7 +168,9 @@ wrap.appendChild(lblL); wrap.appendChild(switchWrap); wrap.appendChild(lblD); - wrap.appendChild(auto); + wrap.appendChild(autoWrap); + wrap.appendChild(divider); + wrap.appendChild(a11ySlot); doc.body.appendChild(wrap); // Debug helper @@ -193,6 +229,18 @@ function applyContrast(on) { root.classList.toggle("a11y-high-contrast", on); + // Lazy-load the high-contrast stylesheet + var hcId = "mokoA11yHcSheet"; + var existing = doc.getElementById(hcId); + if (on && !existing) { + var link = doc.createElement("link"); + link.id = hcId; + link.rel = "stylesheet"; + link.href = (doc.querySelector('link[href*="mokocassiopeia/css/template"]') || {}).href + ? (doc.querySelector('link[href*="mokocassiopeia/css/template"]').href.replace(/\/css\/template[^/]*$/, "/css/a11y-high-contrast.css")) + : "media/templates/site/mokocassiopeia/css/a11y-high-contrast.css"; + doc.head.appendChild(link); + } } function applyLinks(on) { @@ -209,10 +257,10 @@ /** Create a Font Awesome icon element (safe DOM, no innerHTML). */ function faIcon(classes) { - var span = doc.createElement("span"); - span.className = classes; - span.setAttribute("aria-hidden", "true"); - return span; + var i = doc.createElement("i"); + i.className = classes; + i.setAttribute("aria-hidden", "true"); + return i; } function buildA11yToolbar() { @@ -359,23 +407,6 @@ addSwitchOption(showFont, "font", "fa-solid fa-font", "Readable font", applyFont); addSwitchOption(showAnimations, "paused", "fa-solid fa-pause", "Pause animations", applyPaused); - // Toggle panel open/close - toggle.addEventListener("click", function () { - var isOpen = !panel.hidden; - panel.hidden = isOpen; - toggle.setAttribute("aria-expanded", isOpen ? "false" : "true"); - toggle.classList.toggle("active", !isOpen); - }); - - // Close on outside click - doc.addEventListener("click", function (e) { - if (!toolbar.contains(e.target) && !panel.hidden) { - panel.hidden = true; - toggle.setAttribute("aria-expanded", "false"); - toggle.classList.remove("active"); - } - }); - // Apply saved preferences on load if (prefs.fontStep !== defaultStep) applyFontSize(prefs.fontStep); if (prefs.inverted) applyInversion(true); @@ -384,9 +415,55 @@ if (prefs.font) applyFont(true); if (prefs.paused) applyPaused(true); - toolbar.appendChild(toggle); - toolbar.appendChild(panel); - body.appendChild(toolbar); + // If theme FAB is present, mount a11y toggle inside it; otherwise standalone + var fabSlot = doc.getElementById("mokoA11ySlot"); + if (fabSlot) { + toggle.className = "a11y-toggle a11y-toggle-inline"; + fabSlot.appendChild(toggle); + toolbar.className = "a11y-toolbar-floating"; + toolbar.appendChild(panel); + body.appendChild(toolbar); + // Position panel near the FAB + toggle.addEventListener("click", function () { + var isOpen = !panel.hidden; + panel.hidden = isOpen; + toggle.setAttribute("aria-expanded", isOpen ? "false" : "true"); + toggle.classList.toggle("active", !isOpen); + if (!isOpen) { + var rect = toggle.getBoundingClientRect(); + toolbar.style.position = "fixed"; + toolbar.style.bottom = (win.innerHeight - rect.top + 8) + "px"; + toolbar.style.right = (win.innerWidth - rect.right) + "px"; + toolbar.style.zIndex = "1202"; + } + }); + // Close on outside click for inline mode + doc.addEventListener("click", function (e) { + if (!toggle.contains(e.target) && !toolbar.contains(e.target) && !panel.hidden) { + panel.hidden = true; + toggle.setAttribute("aria-expanded", "false"); + toggle.classList.remove("active"); + } + }); + } else { + // Standalone mode β€” toggle and close handlers + toggle.addEventListener("click", function () { + var isOpen = !panel.hidden; + panel.hidden = isOpen; + toggle.setAttribute("aria-expanded", isOpen ? "false" : "true"); + toggle.classList.toggle("active", !isOpen); + }); + doc.addEventListener("click", function (e) { + if (!toolbar.contains(e.target) && !panel.hidden) { + panel.hidden = true; + toggle.setAttribute("aria-expanded", "false"); + toggle.classList.remove("active"); + } + }); + toolbar.appendChild(toggle); + toolbar.appendChild(panel); + body.appendChild(toolbar); + } } // ======================================================================== diff --git a/src/templateDetails.xml b/src/templateDetails.xml index fd87629..f928b11 100644 --- a/src/templateDetails.xml +++ b/src/templateDetails.xml @@ -31,18 +31,21 @@ --> - - https://raw.githubusercontent.com/mokoconsulting-tech/MokoCassiopeia/main/updates.xml - + + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/raw/branch/main/updates.xml + + + https://raw.githubusercontent.com/mokoconsulting-tech/MokoCassiopeia/main/updates.xml + MokoCassiopeia - 03.09.12 + 03.09.14 script.php - 2026-03-26 + 2026-04-14 Jonathan Miller || Moko Consulting hello@mokoconsulting.tech (C)GNU General Public License Version 3 - 2026 Moko Consulting - Version 03.09.12 License Joomla PHP

MokoCassiopeia Template Description

MokoCassiopeia continues Joomla's tradition of space-themed default templatesβ€” building on the legacy of Solarflare (Joomla 1.0), Milkyway (Joomla 1.5), and Protostar (Joomla 3.0).

This template is a customized fork of the Cassiopeia template introduced in Joomla 4, preserving its modern, accessible, and mobile-first foundation while introducing new stylistic enhancements and structural refinements specifically tailored for use by Moko Consulting.

Custom Colour Themes

Starter palette files are included with the template. To create a custom colour scheme, copy templates/mokocassiopeia/templates/light.custom.css to media/templates/site/mokocassiopeia/css/theme/light.custom.css, or templates/mokocassiopeia/templates/dark.custom.css to media/templates/site/mokocassiopeia/css/theme/dark.custom.css. Customise the CSS variables to match your brand, then activate your palette in System β†’ Site Templates β†’ MokoCassiopeia β†’ Theme tab by selecting "Custom" for the Light or Dark Mode Palette. A full variable reference is available in the CSS Variables tab in template options.

Custom CSS & JavaScript

For site-specific styles and scripts that should survive template updates, create the following files:

  • media/templates/site/mokocassiopeia/css/user.css β€” loaded on every page for custom CSS overrides.
  • media/templates/site/mokocassiopeia/js/user.js β€” loaded on every page for custom JavaScript.

These files are gitignored and will not be overwritten by template updates.

Code Attribution

This template is based on the original Cassiopeia template developed by the Joomla! Project and released under the GNU General Public License.

Modifications and enhancements have been made by Moko Consulting in accordance with open-source licensing standards.

It includes integration with Bootstrap TOC, an open-source table of contents generator by A. Feld, licensed under the MIT License.

All third-party libraries and assets remain the property of their respective authors and are credited within their source files where applicable.

]]>
+ Version 03.09.14 License Joomla PHP

MokoCassiopeia Template Description

MokoCassiopeia continues Joomla's tradition of space-themed default templatesβ€” building on the legacy of Solarflare (Joomla 1.0), Milkyway (Joomla 1.5), and Protostar (Joomla 3.0).

This template is a customized fork of the Cassiopeia template introduced in Joomla 4, preserving its modern, accessible, and mobile-first foundation while introducing new stylistic enhancements and structural refinements specifically tailored for use by Moko Consulting.

Custom Colour Themes

Starter palette files are included with the template. To create a custom colour scheme, copy templates/mokocassiopeia/templates/light.custom.css to media/templates/site/mokocassiopeia/css/theme/light.custom.css, or templates/mokocassiopeia/templates/dark.custom.css to media/templates/site/mokocassiopeia/css/theme/dark.custom.css. Customise the CSS variables to match your brand, then activate your palette in System β†’ Site Templates β†’ MokoCassiopeia β†’ Theme tab by selecting "Custom" for the Light or Dark Mode Palette. A full variable reference is available in the CSS Variables tab in template options.

Custom CSS & JavaScript

For site-specific styles and scripts that should survive template updates, create the following files:

  • media/templates/site/mokocassiopeia/css/user.css β€” loaded on every page for custom CSS overrides.
  • media/templates/site/mokocassiopeia/js/user.js β€” loaded on every page for custom JavaScript.

These files are gitignored and will not be overwritten by template updates.

Code Attribution

This template is based on the original Cassiopeia template developed by the Joomla! Project and released under the GNU General Public License.

Modifications and enhancements have been made by Moko Consulting in accordance with open-source licensing standards.

It includes integration with Bootstrap TOC, an open-source table of contents generator by A. Feld, licensed under the MIT License.

All third-party libraries and assets remain the property of their respective authors and are credited within their source files where applicable.

]]>
1 component.php diff --git a/src/templates/dark.custom.css b/src/templates/dark.custom.css index f3fdbf3..689bfda 100644 --- a/src/templates/dark.custom.css +++ b/src/templates/dark.custom.css @@ -813,6 +813,12 @@ color-scheme: dark; --table-active-color: var(--body-color); --table-active-bg: rgba(var(--white-rgb), 0.1); +/* ===== FOOTER ===== */ +--footer-padding-top: 1rem; +--footer-padding-bottom: 80px; +--footer-grid-padding-y: 2.5rem; +--footer-grid-padding-x: 0.5em; + /* ===== BACKDROP ===== */ --backdrop-zindex: 1040; --backdrop-bg: hsl(0, 0%, 0%); diff --git a/src/templates/light.custom.css b/src/templates/light.custom.css index 9170f61..d4b6d60 100644 --- a/src/templates/light.custom.css +++ b/src/templates/light.custom.css @@ -812,6 +812,12 @@ color-scheme: light; --table-active-color: var(--body-color); --table-active-bg: rgba(var(--black-rgb), 0.075); +/* ===== FOOTER ===== */ +--footer-padding-top: 1rem; +--footer-padding-bottom: 80px; +--footer-grid-padding-y: 2.5rem; +--footer-grid-padding-x: 0.5em; + /* ===== BACKDROP ===== */ --backdrop-zindex: 1040; --backdrop-bg: hsl(0, 0%, 0%); diff --git a/templates/configs/pa11yci.json b/templates/configs/pa11yci.json new file mode 100644 index 0000000..c08219a --- /dev/null +++ b/templates/configs/pa11yci.json @@ -0,0 +1,22 @@ +{ + "defaults": { + "standard": "WCAG2AA", + "timeout": 30000, + "wait": 1000, + "ignore": [], + "chromeLaunchConfig": { + "args": [ + "--no-sandbox", + "--disable-setuid-sandbox" + ] + } + }, + "urls": [ + { + "url": "http://localhost:8080/", + "actions": [] + } + ], + "concurrency": 2, + "useIncognitoBrowserContext": true +} \ No newline at end of file diff --git a/updates.xml b/updates.xml index c9373ab..7c41b38 100644 --- a/updates.xml +++ b/updates.xml @@ -1,119 +1,119 @@ - - - - - - - - MokoCassiopeia - MokoCassiopeia development build β€” unstable. - mokocassiopeia - template - site - 03.09.14 - 2026-04-14 - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/development - - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.09.14-dev.zip - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/development/mokocassiopeia-03.09.14-dev.zip - - 4cbe4fc379182ef17580396e7d12ce4ce95a90017ef364b922bdc2d04b0b3d97 - development - Moko Consulting - https://mokoconsulting.tech - - 8.1 - - - - - MokoCassiopeia - MokoCassiopeia alpha build β€” early testing. - mokocassiopeia - template - site - 03.09.14 - 2026-04-14 - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/alpha - - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/alpha/mokocassiopeia-03.09.14-alpha.zip - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/alpha/mokocassiopeia-03.09.14-alpha.zip - - c2660acdf7389244462485f7ab4c286e9f851366a148acc16739a184576f7932 - alpha - Moko Consulting - https://mokoconsulting.tech - - 8.1 - - - - - MokoCassiopeia - MokoCassiopeia beta build β€” feature complete, stability testing. - mokocassiopeia - template - site - 03.09.14 - 2026-04-14 - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/beta - - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/beta/mokocassiopeia-03.09.14-beta.zip - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/beta/mokocassiopeia-03.09.14-beta.zip - - 4cbe4fc379182ef17580396e7d12ce4ce95a90017ef364b922bdc2d04b0b3d97 - beta - Moko Consulting - https://mokoconsulting.tech - - 8.1 - - - - - MokoCassiopeia - MokoCassiopeia release candidate β€” testing only. - mokocassiopeia - template - site - 03.09.14 - 2026-04-14 - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/release-candidate - - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/release-candidate/mokocassiopeia-03.09.14-rc.zip - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/release-candidate/mokocassiopeia-03.09.14-rc.zip - - c2660acdf7389244462485f7ab4c286e9f851366a148acc16739a184576f7932 - rc - Moko Consulting - https://mokoconsulting.tech - - 8.1 - - - - - MokoCassiopeia - Moko Consulting's site template based on Cassiopeia. - mokocassiopeia - template - site - 03.09.14 - 2026-04-14 - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/v03 - - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.09.14.zip - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.09.14.zip - - c2660acdf7389244462485f7ab4c286e9f851366a148acc16739a184576f7932 - stable - Moko Consulting - https://mokoconsulting.tech - - 8.1 - - - + + + + + + + + MokoCassiopeia + MokoCassiopeia development build β€” unstable. + mokocassiopeia + template + site + 03.09.14 + 2026-04-14 + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/development + + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.09.14-dev.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.09.14-dev.zip + + 4cbe4fc379182ef17580396e7d12ce4ce95a90017ef364b922bdc2d04b0b3d97 + development + Moko Consulting + https://mokoconsulting.tech + + 8.1 + + + + + MokoCassiopeia + MokoCassiopeia alpha build β€” early testing. + mokocassiopeia + template + site + 03.09.14 + 2026-04-14 + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/alpha + + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/alpha/mokocassiopeia-03.09.14-alpha.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/alpha/mokocassiopeia-03.09.14-alpha.zip + + c2660acdf7389244462485f7ab4c286e9f851366a148acc16739a184576f7932 + alpha + Moko Consulting + https://mokoconsulting.tech + + 8.1 + + + + + MokoCassiopeia + MokoCassiopeia beta build β€” feature complete, stability testing. + mokocassiopeia + template + site + 03.09.14 + 2026-04-14 + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/beta + + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/beta/mokocassiopeia-03.09.14-beta.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/beta/mokocassiopeia-03.09.14-beta.zip + + 4cbe4fc379182ef17580396e7d12ce4ce95a90017ef364b922bdc2d04b0b3d97 + beta + Moko Consulting + https://mokoconsulting.tech + + 8.1 + + + + + MokoCassiopeia + MokoCassiopeia release candidate β€” testing only. + mokocassiopeia + template + site + 03.09.14 + 2026-04-14 + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/release-candidate + + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/release-candidate/mokocassiopeia-03.09.14-rc.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/release-candidate/mokocassiopeia-03.09.14-rc.zip + + c2660acdf7389244462485f7ab4c286e9f851366a148acc16739a184576f7932 + rc + Moko Consulting + https://mokoconsulting.tech + + 8.1 + + + + + MokoCassiopeia + Moko Consulting's site template based on Cassiopeia. + mokocassiopeia + template + site + 03.09.14 + 2026-04-14 + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/v03 + + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.09.14.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.09.14.zip + + c2660acdf7389244462485f7ab4c286e9f851366a148acc16739a184576f7932 + stable + Moko Consulting + https://mokoconsulting.tech + + 8.1 + + +