Compare commits
43 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1d428d0944 | |||
| 888be7ebc0 | |||
| a97b985101 | |||
| cba1423546 | |||
| a17361879f | |||
| c81df6609f | |||
| b1792627d7 | |||
| 254c06f1d6 | |||
| a6f9352686 | |||
| d21dc84564 | |||
| ca4730c12f | |||
| 83b18da22b | |||
| 6c2857820e | |||
| 363971ffa8 | |||
| 5de3d6c25c | |||
| 7063b6d633 | |||
| 2b3bcbac9a | |||
| c0aab513c0 | |||
| 24e0a1af85 | |||
| a05a93af76 | |||
| 4870336a5a | |||
| 5edcb6bd04 | |||
| d1d2cb1f77 | |||
| 388c9138c9 | |||
| a49bcd7e65 | |||
| 1592ab5efa | |||
| d5513b9517 | |||
| 36f4eeb122 | |||
| 28d90a93a1 | |||
| 4dedece818 | |||
| 5e0d6720c6 | |||
| 2fd86c1f5b | |||
| 07ec634dc0 | |||
| d6d67f8913 | |||
| f27ca6330e | |||
| 9b195d2a14 | |||
| 748bf45646 | |||
| 3b041f7008 | |||
| 3ec4c57f42 | |||
| 2170d8d83b | |||
| 7692478e22 | |||
| 3f1c5a317f | |||
| 7ffee71dee |
@@ -1,26 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!--
|
|
||||||
Moko Platform Repository Manifest
|
|
||||||
See: https://git.mokoconsulting.tech/MokoConsulting/moko-platform/wiki/Home
|
|
||||||
-->
|
|
||||||
<moko-platform xmlns="https://standards.mokoconsulting.tech/moko-platform/1.0" schema-version="1.0">
|
|
||||||
<identity>
|
|
||||||
<name>MokoOnyx</name>
|
|
||||||
<display-name>Template - MokoOnyx</display-name>
|
|
||||||
<org>MokoConsulting</org>
|
|
||||||
<description>MokoOnyx - Joomla site template (successor to MokoCassiopeia)</description>
|
|
||||||
<version>02.25.00</version>
|
|
||||||
<license spdx="GPL-3.0-or-later">GNU General Public License v3</license>
|
|
||||||
</identity>
|
|
||||||
<governance>
|
|
||||||
<platform>joomla</platform>
|
|
||||||
<standards-version>04.07.00</standards-version>
|
|
||||||
<standards-source>https://git.mokoconsulting.tech/MokoConsulting/moko-platform</standards-source>
|
|
||||||
<last-synced>2026-05-10T19:51:09+00:00</last-synced>
|
|
||||||
</governance>
|
|
||||||
<build>
|
|
||||||
<language>PHP</language>
|
|
||||||
<package-type>joomla</package-type>
|
|
||||||
<entry-point>src/</entry-point>
|
|
||||||
</build>
|
|
||||||
</moko-platform>
|
|
||||||
@@ -205,6 +205,12 @@ jobs:
|
|||||||
echo MOKO_CLI=/tmp/mokocli/cli >> $GITHUB_ENV
|
echo MOKO_CLI=/tmp/mokocli/cli >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
- name: "Detect platform"
|
||||||
|
id: platform
|
||||||
|
run: |
|
||||||
|
php ${MOKO_CLI}/platform_detect.php --path . --github-output 2>/dev/null || true
|
||||||
|
php ${MOKO_CLI}/manifest_read.php --path . --github-output 2>/dev/null || true
|
||||||
|
|
||||||
- name: "Determine version bump level"
|
- name: "Determine version bump level"
|
||||||
id: bump
|
id: bump
|
||||||
run: |
|
run: |
|
||||||
@@ -228,6 +234,18 @@ jobs:
|
|||||||
--path . --stability stable ${BUMP_FLAG} --branch main \
|
--path . --stability stable ${BUMP_FLAG} --branch main \
|
||||||
--token "${{ secrets.MOKOGITEA_TOKEN }}"
|
--token "${{ secrets.MOKOGITEA_TOKEN }}"
|
||||||
|
|
||||||
|
- name: "Read published version"
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
VERSION=$(php ${MOKO_CLI}/version_read.php --path . 2>/dev/null || echo "")
|
||||||
|
VERSION=$(echo "$VERSION" | sed 's/-\(dev\|alpha\|beta\|rc\)$//')
|
||||||
|
[ -z "$VERSION" ] && VERSION="00.00.00" && echo "skip=true" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tag=stable" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "release_tag=stable" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "branch=main" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Published version: ${VERSION}"
|
||||||
|
|
||||||
- name: Update release notes and promote changelog
|
- name: Update release notes and promote changelog
|
||||||
run: |
|
run: |
|
||||||
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
API_BASE="${GITEA_URL}/api/v1/repos/${GITEA_ORG}/${GITEA_REPO}"
|
||||||
|
|||||||
@@ -13,12 +13,6 @@
|
|||||||
name: "Generic: Project CI"
|
name: "Generic: Project CI"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- dev
|
|
||||||
- dev/**
|
|
||||||
- rc/**
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
|
|||||||
@@ -45,17 +45,17 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
php -v && composer --version
|
php -v && composer --version
|
||||||
|
|
||||||
- name: Setup moko-platform tools
|
- name: Setup mokocli tools
|
||||||
env:
|
env:
|
||||||
MOKO_CLONE_TOKEN: ${{ secrets.GA_TOKEN || github.token }}
|
MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN || secrets.GA_TOKEN || github.token }}
|
||||||
MOKO_CLONE_HOST: ${{ secrets.GA_TOKEN && 'git.mokoconsulting.tech/MokoConsulting' || 'github.com/mokoconsulting-tech' }}
|
MOKO_CLONE_HOST: ${{ secrets.MOKOGITEA_TOKEN && 'git.mokoconsulting.tech/MokoConsulting' || 'github.com/mokoconsulting-tech' }}
|
||||||
run: |
|
run: |
|
||||||
if [ -d "/tmp/moko-platform" ] || [ -d "/opt/moko-platform" ]; then
|
if [ -d "/opt/mokocli" ] || [ -d "/tmp/mokocli" ]; then
|
||||||
echo "moko-platform already available on runner — skipping clone"
|
echo "mokocli already available on runner — skipping clone"
|
||||||
else
|
else
|
||||||
git clone --depth 1 --branch main --quiet \
|
git clone --depth 1 --branch main --quiet \
|
||||||
"https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/moko-platform.git" \
|
"https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/mokocli.git" \
|
||||||
/tmp/moko-platform 2>/dev/null || echo "moko-platform clone skipped — continuing without it"
|
/tmp/mokocli 2>/dev/null || echo "mokocli clone skipped — continuing without it"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
|||||||
@@ -25,10 +25,6 @@
|
|||||||
name: "Universal: Secret Scanning"
|
name: "Universal: Secret Scanning"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- 'dev/**'
|
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 5 * * 1' # Weekly Monday 05:00 UTC
|
- cron: '0 5 * * 1' # Weekly Monday 05:00 UTC
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
#
|
#
|
||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: Gitea.Workflow
|
||||||
# INGROUP: moko-platform.Automation
|
# INGROUP: mokocli.Automation
|
||||||
# VERSION: 01.00.00
|
# VERSION: 02.27.03
|
||||||
# BRIEF: Auto-create feature branch when an issue is opened
|
# BRIEF: Auto-create feature branch when an issue is opened
|
||||||
|
|
||||||
name: "Universal: Issue Branch"
|
name: "Universal: Issue Branch"
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
#
|
#
|
||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: Gitea.Workflow
|
||||||
# INGROUP: mokocli.CI
|
# INGROUP: moko-platform.CI
|
||||||
# REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/mokocli
|
# REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/moko-platform
|
||||||
# PATH: /templates/workflows/universal/pr-check.yml.template
|
# PATH: /templates/workflows/universal/pr-check.yml.template
|
||||||
# VERSION: 09.23.00
|
# VERSION: 09.23.00
|
||||||
# BRIEF: PR gate — branch policy + code validation before merge
|
# BRIEF: PR gate — branch policy + code validation before merge
|
||||||
@@ -96,6 +96,32 @@ jobs:
|
|||||||
echo "Branch policy: OK (${HEAD} → ${BASE})"
|
echo "Branch policy: OK (${HEAD} → ${BASE})"
|
||||||
echo "## Branch Policy: Passed" >> $GITHUB_STEP_SUMMARY
|
echo "## Branch Policy: Passed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
# ── Secret Scanning ──────────────────────────────────────────────────
|
||||||
|
gitleaks:
|
||||||
|
name: Secret Scan
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install Gitleaks
|
||||||
|
run: |
|
||||||
|
GITLEAKS_VERSION="8.21.2"
|
||||||
|
curl -sSL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" \
|
||||||
|
| tar -xz -C /usr/local/bin gitleaks
|
||||||
|
|
||||||
|
- name: Scan PR commits for secrets
|
||||||
|
run: |
|
||||||
|
if gitleaks detect --source . --verbose \
|
||||||
|
--log-opts=${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} 2>&1; then
|
||||||
|
echo "**No secrets detected.**" >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "::error::Potential secrets detected in PR commits"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# ── Code Validation ────────────────────────────────────────────────────
|
# ── Code Validation ────────────────────────────────────────────────────
|
||||||
validate:
|
validate:
|
||||||
name: Validate PR
|
name: Validate PR
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
#
|
#
|
||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: Gitea.Workflow
|
||||||
# INGROUP: MokoPlatform.Universal
|
# INGROUP: mokocli.Universal
|
||||||
# REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform
|
# REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli
|
||||||
# PATH: /.mokogitea/workflows/rc-revert.yml
|
# PATH: /.mokogitea/workflows/rc-revert.yml
|
||||||
# VERSION: 09.23.00
|
# VERSION: 09.23.00
|
||||||
# BRIEF: Rename rc/ branch back to dev/ when PR is closed without merge
|
# BRIEF: Rename rc/ branch back to dev/ when PR is closed without merge
|
||||||
|
|||||||
@@ -1,82 +0,0 @@
|
|||||||
# Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
#
|
|
||||||
# FILE INFORMATION
|
|
||||||
# DEFGROUP: Gitea.Workflow
|
|
||||||
# INGROUP: MokoStandards.Security
|
|
||||||
# REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards
|
|
||||||
# PATH: /.gitea/workflows/security-audit.yml
|
|
||||||
# VERSION: 01.00.00
|
|
||||||
# BRIEF: Dependency vulnerability scanning for composer and npm packages
|
|
||||||
|
|
||||||
name: "Universal: Security Audit"
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 6 * * 1' # Weekly on Monday at 06:00 UTC
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- 'composer.json'
|
|
||||||
- 'composer.lock'
|
|
||||||
- 'package.json'
|
|
||||||
- 'package-lock.json'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
env:
|
|
||||||
NTFY_URL: ${{ vars.NTFY_URL || 'https://ntfy.mokoconsulting.tech' }}
|
|
||||||
NTFY_TOPIC: ${{ vars.NTFY_TOPIC || 'gitea-security' }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
audit:
|
|
||||||
name: Dependency Audit
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Composer audit
|
|
||||||
if: hashFiles('composer.lock') != ''
|
|
||||||
run: |
|
|
||||||
echo "=== Composer Security Audit ==="
|
|
||||||
if ! command -v composer &> /dev/null; then
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y -qq php-cli composer >/dev/null 2>&1
|
|
||||||
fi
|
|
||||||
composer audit --format=plain 2>&1 | tee /tmp/composer-audit.txt
|
|
||||||
RESULT=$?
|
|
||||||
if [ $RESULT -ne 0 ]; then
|
|
||||||
echo "::warning::Composer vulnerabilities found"
|
|
||||||
echo "composer_vulnerable=true" >> "$GITHUB_ENV"
|
|
||||||
else
|
|
||||||
echo "No known vulnerabilities in composer dependencies"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: NPM audit
|
|
||||||
if: hashFiles('package-lock.json') != ''
|
|
||||||
run: |
|
|
||||||
echo "=== NPM Security Audit ==="
|
|
||||||
npm audit --production 2>&1 | tee /tmp/npm-audit.txt || true
|
|
||||||
if npm audit --production 2>&1 | grep -q "found 0 vulnerabilities"; then
|
|
||||||
echo "No known vulnerabilities in npm dependencies"
|
|
||||||
else
|
|
||||||
echo "::warning::NPM vulnerabilities found"
|
|
||||||
echo "npm_vulnerable=true" >> "$GITHUB_ENV"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Notify on vulnerabilities
|
|
||||||
if: env.composer_vulnerable == 'true' || env.npm_vulnerable == 'true'
|
|
||||||
run: |
|
|
||||||
REPO="${{ github.event.repository.name }}"
|
|
||||||
curl -sS \
|
|
||||||
-H "Title: ${REPO} has vulnerable dependencies" \
|
|
||||||
-H "Tags: lock,warning" \
|
|
||||||
-H "Priority: high" \
|
|
||||||
-d "Security audit found vulnerabilities. Review dependency updates." \
|
|
||||||
"${NTFY_URL}/${NTFY_TOPIC}" || true
|
|
||||||
@@ -4,8 +4,8 @@
|
|||||||
#
|
#
|
||||||
# FILE INFORMATION
|
# FILE INFORMATION
|
||||||
# DEFGROUP: Gitea.Workflow
|
# DEFGROUP: Gitea.Workflow
|
||||||
# INGROUP: MokoPlatform.Universal
|
# INGROUP: mokocli.Universal
|
||||||
# REPO: https://git.mokoconsulting.tech/MokoConsulting/mokoplatform
|
# REPO: https://git.mokoconsulting.tech/MokoConsulting/mokocli
|
||||||
# PATH: /.mokogitea/workflows/workflow-sync-trigger.yml
|
# PATH: /.mokogitea/workflows/workflow-sync-trigger.yml
|
||||||
# VERSION: 01.01.00
|
# VERSION: 01.01.00
|
||||||
# BRIEF: Trigger workflow sync to live repos when a PR is merged to main
|
# BRIEF: Trigger workflow sync to live repos when a PR is merged to main
|
||||||
@@ -45,16 +45,16 @@ jobs:
|
|||||||
echo "platform=$PLATFORM" >> "$GITHUB_OUTPUT"
|
echo "platform=$PLATFORM" >> "$GITHUB_OUTPUT"
|
||||||
echo "Platform: ${PLATFORM:-all}"
|
echo "Platform: ${PLATFORM:-all}"
|
||||||
|
|
||||||
- name: Clone mokoplatform
|
- name: Clone mokocli
|
||||||
env:
|
env:
|
||||||
MOKOGITEA_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }}
|
MOKOGITEA_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
GITEA_URL="${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }}"
|
GITEA_URL="${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }}"
|
||||||
git clone --depth 1 "${GITEA_URL}/MokoConsulting/mokoplatform.git" /tmp/mokoplatform
|
git clone --depth 1 "${GITEA_URL}/MokoConsulting/mokocli.git" /tmp/mokocli
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
cd /tmp/mokoplatform
|
cd /tmp/mokocli
|
||||||
composer install --no-dev --no-interaction --quiet 2>/dev/null || true
|
composer install --no-dev --no-interaction --quiet 2>/dev/null || true
|
||||||
|
|
||||||
- name: Run workflow sync
|
- name: Run workflow sync
|
||||||
@@ -70,4 +70,4 @@ jobs:
|
|||||||
ARGS="${ARGS} --platform-filter ${PLATFORM}"
|
ARGS="${ARGS} --platform-filter ${PLATFORM}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
php /tmp/mokoplatform/cli/workflow_sync.php ${ARGS}
|
php /tmp/mokocli/cli/workflow_sync.php ${ARGS}
|
||||||
|
|||||||
+12
-7
@@ -8,13 +8,23 @@
|
|||||||
DEFGROUP: Joomla.Template.Site
|
DEFGROUP: Joomla.Template.Site
|
||||||
INGROUP: MokoOnyx.Documentation
|
INGROUP: MokoOnyx.Documentation
|
||||||
PATH: ./CHANGELOG.md
|
PATH: ./CHANGELOG.md
|
||||||
VERSION: 02.25.00
|
VERSION: 02.27.03
|
||||||
BRIEF: Changelog file documenting version history of MokoOnyx
|
BRIEF: Changelog file documenting version history of MokoOnyx
|
||||||
-->
|
-->
|
||||||
|
|
||||||
# Changelog — MokoOnyx (VERSION: 02.25.00)
|
# Changelog — MokoOnyx (VERSION: 02.27.03)
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Collapsible floating social bar with toggle button and localStorage persistence
|
||||||
|
- Bootstrap tooltips on all social icon links showing platform name on hover
|
||||||
|
- URL validation on social platform fields (browser, Joomla server-side, and PHP layout logging)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Moved footer social icons below footer-menu and footer module positions for correct display order
|
||||||
|
|
||||||
|
## [02.26.00] --- 2026-06-20
|
||||||
|
|
||||||
## [02.25.00] --- 2026-06-20
|
## [02.25.00] --- 2026-06-20
|
||||||
|
|
||||||
## [02.25.00] --- 2026-06-20
|
## [02.25.00] --- 2026-06-20
|
||||||
@@ -22,8 +32,3 @@
|
|||||||
## [02.24.00] --- 2026-06-20
|
## [02.24.00] --- 2026-06-20
|
||||||
|
|
||||||
## [02.24.00] --- 2026-06-20
|
## [02.24.00] --- 2026-06-20
|
||||||
|
|
||||||
## [02.23.02] --- 2026-06-20
|
|
||||||
|
|
||||||
|
|
||||||
## [02.23.02] --- 2026-06-20
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ A modern, lightweight Joomla site template built on Cassiopeia with Font Awesome
|
|||||||
| | |
|
| | |
|
||||||
|---|---|
|
|---|---|
|
||||||
| **Type** | Joomla Site Template |
|
| **Type** | Joomla Site Template |
|
||||||
| **Version** | 02.07.00 |
|
| **Version** | 02.22.00 |
|
||||||
| **Joomla** | 5.x / 6.x |
|
| **Joomla** | 5.x / 6.x |
|
||||||
| **PHP** | 8.1+ |
|
| **PHP** | 8.1+ |
|
||||||
| **License** | GPL-3.0-or-later |
|
| **License** | GPL-3.0-or-later |
|
||||||
@@ -39,6 +39,7 @@ On install, MokoOnyx automatically migrates settings, content references, and cu
|
|||||||
| **Table of Contents** | Automatic TOC generation for long articles |
|
| **Table of Contents** | Automatic TOC generation for long articles |
|
||||||
| **GTM / GA4** | Google Tag Manager and Analytics integration with smart visitor detection (login status, user group, page type) |
|
| **GTM / GA4** | Google Tag Manager and Analytics integration with smart visitor detection (login status, user group, page type) |
|
||||||
| **Template Overrides** | Overrides for all core Joomla modules, Community Builder, and DPCalendar |
|
| **Template Overrides** | Overrides for all core Joomla modules, Community Builder, and DPCalendar |
|
||||||
|
| **Social Icons** | Configurable social media links in topbar, footer, or collapsible floating sidebar with tooltips and URL validation |
|
||||||
| **Cassiopeia Base** | Minimal core overrides for maximum Joomla upgrade compatibility |
|
| **Cassiopeia Base** | Minimal core overrides for maximum Joomla upgrade compatibility |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -79,6 +80,7 @@ Key parameters include:
|
|||||||
- **Google Tag Manager**: GTM container ID
|
- **Google Tag Manager**: GTM container ID
|
||||||
- **GA4**: Measurement ID and tracking options
|
- **GA4**: Measurement ID and tracking options
|
||||||
- **Table of Contents**: Auto-generate TOC for articles with heading threshold
|
- **Table of Contents**: Auto-generate TOC for articles with heading threshold
|
||||||
|
- **Social Icons**: Display positions, icon style, and platform URLs
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@
|
|||||||
INGROUP: MokoOnyx.Governance
|
INGROUP: MokoOnyx.Governance
|
||||||
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||||
FILE: SECURITY.md
|
FILE: SECURITY.md
|
||||||
VERSION: 02.25.00
|
VERSION: 02.27.03
|
||||||
BRIEF: Security policy and vulnerability reporting process for MokoOnyx.
|
BRIEF: Security policy and vulnerability reporting process for MokoOnyx.
|
||||||
PATH: /SECURITY.md
|
PATH: /SECURITY.md
|
||||||
NOTE: This policy is process oriented and does not replace secure engineering practices.
|
NOTE: This policy is process oriented and does not replace secure engineering practices.
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: MokoOnyx
|
* INGROUP: MokoOnyx
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||||
* PATH: /html/layouts/joomla/module/card.php
|
* PATH: /html/layouts/joomla/module/card.php
|
||||||
* VERSION: 02.25.00
|
* VERSION: 02.27.03
|
||||||
* BRIEF: Custom card module chrome — renders module titles for all modules
|
* BRIEF: Custom card module chrome — renders module titles for all modules
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
* INGROUP: MokoOnyx.Layouts
|
* INGROUP: MokoOnyx.Layouts
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||||
* PATH: /src/html/layouts/mokoonyx/article-metadata.php
|
* PATH: /src/html/layouts/mokoonyx/article-metadata.php
|
||||||
* VERSION: 02.25.00
|
* VERSION: 02.27.03
|
||||||
* BRIEF: Article metadata footer layout -- renders jcfields grouped by field group
|
* BRIEF: Article metadata footer layout -- renders jcfields grouped by field group
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -52,14 +52,23 @@ $platforms = [
|
|||||||
$active = [];
|
$active = [];
|
||||||
foreach ($platforms as $key => [$iconClass, $langKey]) {
|
foreach ($platforms as $key => [$iconClass, $langKey]) {
|
||||||
$url = trim((string) $params->get('social_' . $key . '_url', ''));
|
$url = trim((string) $params->get('social_' . $key . '_url', ''));
|
||||||
if ($url !== '' && preg_match('#^(https?://|mailto:|/)#i', $url)) {
|
if ($url === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!preg_match('#^(https?://[^\s<>"]+|mailto:[^\s<>"]+|/[^\s<>"]*)$#i', $url)) {
|
||||||
|
\Joomla\CMS\Log\Log::add(
|
||||||
|
'MokoOnyx social: skipped invalid URL for "' . $key . '": ' . $url,
|
||||||
|
\Joomla\CMS\Log\Log::WARNING,
|
||||||
|
'template'
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
$active[] = [
|
$active[] = [
|
||||||
'url' => $url,
|
'url' => $url,
|
||||||
'iconClass' => $iconClass,
|
'iconClass' => $iconClass,
|
||||||
'label' => Text::_($langKey),
|
'label' => Text::_($langKey),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($active)) {
|
if (empty($active)) {
|
||||||
return;
|
return;
|
||||||
@@ -84,6 +93,10 @@ if ($position === 'floating') {
|
|||||||
$listClass .= ' moko-social-icons--floating-' . $floatingPos;
|
$listClass .= ' moko-social-icons--floating-' . $floatingPos;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
<?php if ($position === 'floating') : ?>
|
||||||
|
<div class="moko-social-floating-wrap moko-social-floating-wrap--<?php echo htmlspecialchars($floatingPos, ENT_QUOTES, 'UTF-8'); ?>"
|
||||||
|
id="mokoSocialFloating">
|
||||||
|
<?php endif; ?>
|
||||||
<nav class="<?php echo $listClass; ?>" aria-label="<?php echo Text::_('TPL_MOKOONYX_SOCIAL_NAV_LABEL'); ?>">
|
<nav class="<?php echo $listClass; ?>" aria-label="<?php echo Text::_('TPL_MOKOONYX_SOCIAL_NAV_LABEL'); ?>">
|
||||||
<ul>
|
<ul>
|
||||||
<?php foreach ($active as $item) : ?>
|
<?php foreach ($active as $item) : ?>
|
||||||
@@ -91,10 +104,23 @@ if ($position === 'floating') {
|
|||||||
<a href="<?php echo htmlspecialchars($item['url'], ENT_QUOTES, 'UTF-8'); ?>"
|
<a href="<?php echo htmlspecialchars($item['url'], ENT_QUOTES, 'UTF-8'); ?>"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
aria-label="<?php echo htmlspecialchars($item['label'], ENT_QUOTES, 'UTF-8'); ?>">
|
aria-label="<?php echo htmlspecialchars($item['label'], ENT_QUOTES, 'UTF-8'); ?>"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="<?php echo $position === 'floating' ? ($floatingPos === 'left' ? 'right' : 'left') : 'top'; ?>"
|
||||||
|
title="<?php echo htmlspecialchars($item['label'], ENT_QUOTES, 'UTF-8'); ?>">
|
||||||
<span class="<?php echo htmlspecialchars($item['iconClass'], ENT_QUOTES, 'UTF-8'); ?>" aria-hidden="true"></span>
|
<span class="<?php echo htmlspecialchars($item['iconClass'], ENT_QUOTES, 'UTF-8'); ?>" aria-hidden="true"></span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
<?php if ($position === 'floating') : ?>
|
||||||
|
<button type="button"
|
||||||
|
class="moko-social-floating-toggle"
|
||||||
|
id="mokoSocialFloatingToggle"
|
||||||
|
aria-label="<?php echo Text::_('TPL_MOKOONYX_SOCIAL_FLOATING_TOGGLE'); ?>"
|
||||||
|
aria-expanded="true">
|
||||||
|
<span class="fa-solid fa-chevron-<?php echo $floatingPos === 'left' ? 'left' : 'right'; ?>" aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|||||||
@@ -286,6 +286,7 @@ TPL_MOKOONYX_SOCIAL_FLOATING_POS_LABEL="Floating Position"
|
|||||||
TPL_MOKOONYX_SOCIAL_FLOATING_POS_DESC="Which side of the screen the floating social bar appears on."
|
TPL_MOKOONYX_SOCIAL_FLOATING_POS_DESC="Which side of the screen the floating social bar appears on."
|
||||||
TPL_MOKOONYX_SOCIAL_FLOATING_POS_LEFT="Left"
|
TPL_MOKOONYX_SOCIAL_FLOATING_POS_LEFT="Left"
|
||||||
TPL_MOKOONYX_SOCIAL_FLOATING_POS_RIGHT="Right"
|
TPL_MOKOONYX_SOCIAL_FLOATING_POS_RIGHT="Right"
|
||||||
|
TPL_MOKOONYX_SOCIAL_FLOATING_TOGGLE="Toggle social icons sidebar"
|
||||||
TPL_MOKOONYX_SOCIAL_COLOR_LABEL="Icon Colour"
|
TPL_MOKOONYX_SOCIAL_COLOR_LABEL="Icon Colour"
|
||||||
TPL_MOKOONYX_SOCIAL_COLOR_DESC="Choose the colour scheme for social icons."
|
TPL_MOKOONYX_SOCIAL_COLOR_DESC="Choose the colour scheme for social icons."
|
||||||
TPL_MOKOONYX_SOCIAL_COLOR_THEME="Theme (CSS variables)"
|
TPL_MOKOONYX_SOCIAL_COLOR_THEME="Theme (CSS variables)"
|
||||||
@@ -321,7 +322,7 @@ TPL_MOKOONYX_SOCIAL_MAIL="Email us"
|
|||||||
|
|
||||||
; ===== CSS Variables tab (social) =====
|
; ===== CSS Variables tab (social) =====
|
||||||
TPL_MOKOONYX_CSS_VARS_SOCIAL_LABEL="Social Icons"
|
TPL_MOKOONYX_CSS_VARS_SOCIAL_LABEL="Social Icons"
|
||||||
TPL_MOKOONYX_CSS_VARS_SOCIAL_DESC="<code>--social-icon-size</code> — Icon font size (overrides size preset)<br><code>--social-icon-gap</code> — Gap between icons (default: <code>0.5rem</code>)<br><code>--social-icon-color</code> — Icon colour (default: <code>currentColor</code>)<br><code>--social-icon-hover-color</code> — Hover colour (default: <code>var(--accent-color-primary)</code>)<br><code>--social-icon-bg</code> — Background for circle/rounded styles<br><code>--social-icon-hover-bg</code> — Hover background<br><code>--social-icon-radius</code> — Border radius for rounded style (default: <code>0.375rem</code>)"
|
TPL_MOKOONYX_CSS_VARS_SOCIAL_DESC="<code>--social-icon-size</code> — Icon font size (overrides size preset)<br><code>--social-icon-gap</code> — Gap between icons (default: <code>0.5rem</code>)<br><code>--social-icon-color</code> — Icon colour (default: <code>currentColor</code>)<br><code>--social-icon-hover-color</code> — Hover colour (default: <code>var(--accent-color-primary)</code>)<br><code>--social-icon-bg</code> — Background for circle/rounded styles<br><code>--social-icon-hover-bg</code> — Hover background<br><code>--social-icon-radius</code> — Border radius for rounded style (default: <code>0.375rem</code>)<br><br><strong>Floating bar</strong><br>The collapse toggle button inherits <code>--social-icon-bg</code>, <code>--social-icon-color</code>, and <code>--social-icon-hover-bg</code>. Tooltips appear automatically on hover showing the platform name."
|
||||||
|
|
||||||
; ===== Misc =====
|
; ===== Misc =====
|
||||||
MOD_BREADCRUMBS_HERE="YOU ARE HERE:"
|
MOD_BREADCRUMBS_HERE="YOU ARE HERE:"
|
||||||
|
|||||||
@@ -286,6 +286,7 @@ TPL_MOKOONYX_SOCIAL_FLOATING_POS_LABEL="Floating Position"
|
|||||||
TPL_MOKOONYX_SOCIAL_FLOATING_POS_DESC="Which side of the screen the floating social bar appears on."
|
TPL_MOKOONYX_SOCIAL_FLOATING_POS_DESC="Which side of the screen the floating social bar appears on."
|
||||||
TPL_MOKOONYX_SOCIAL_FLOATING_POS_LEFT="Left"
|
TPL_MOKOONYX_SOCIAL_FLOATING_POS_LEFT="Left"
|
||||||
TPL_MOKOONYX_SOCIAL_FLOATING_POS_RIGHT="Right"
|
TPL_MOKOONYX_SOCIAL_FLOATING_POS_RIGHT="Right"
|
||||||
|
TPL_MOKOONYX_SOCIAL_FLOATING_TOGGLE="Toggle social icons sidebar"
|
||||||
TPL_MOKOONYX_SOCIAL_COLOR_LABEL="Icon Color"
|
TPL_MOKOONYX_SOCIAL_COLOR_LABEL="Icon Color"
|
||||||
TPL_MOKOONYX_SOCIAL_COLOR_DESC="Choose the color scheme for social icons."
|
TPL_MOKOONYX_SOCIAL_COLOR_DESC="Choose the color scheme for social icons."
|
||||||
TPL_MOKOONYX_SOCIAL_COLOR_THEME="Theme (CSS variables)"
|
TPL_MOKOONYX_SOCIAL_COLOR_THEME="Theme (CSS variables)"
|
||||||
@@ -321,7 +322,7 @@ TPL_MOKOONYX_SOCIAL_MAIL="Email us"
|
|||||||
|
|
||||||
; ===== CSS Variables tab (social) =====
|
; ===== CSS Variables tab (social) =====
|
||||||
TPL_MOKOONYX_CSS_VARS_SOCIAL_LABEL="Social Icons"
|
TPL_MOKOONYX_CSS_VARS_SOCIAL_LABEL="Social Icons"
|
||||||
TPL_MOKOONYX_CSS_VARS_SOCIAL_DESC="<code>--social-icon-size</code> — Icon font size (overrides size preset)<br><code>--social-icon-gap</code> — Gap between icons (default: <code>0.5rem</code>)<br><code>--social-icon-color</code> — Icon color (default: <code>currentColor</code>)<br><code>--social-icon-hover-color</code> — Hover color (default: <code>var(--accent-color-primary)</code>)<br><code>--social-icon-bg</code> — Background for circle/rounded styles<br><code>--social-icon-hover-bg</code> — Hover background<br><code>--social-icon-radius</code> — Border radius for rounded style (default: <code>0.375rem</code>)"
|
TPL_MOKOONYX_CSS_VARS_SOCIAL_DESC="<code>--social-icon-size</code> — Icon font size (overrides size preset)<br><code>--social-icon-gap</code> — Gap between icons (default: <code>0.5rem</code>)<br><code>--social-icon-color</code> — Icon color (default: <code>currentColor</code>)<br><code>--social-icon-hover-color</code> — Hover color (default: <code>var(--accent-color-primary)</code>)<br><code>--social-icon-bg</code> — Background for circle/rounded styles<br><code>--social-icon-hover-bg</code> — Hover background<br><code>--social-icon-radius</code> — Border radius for rounded style (default: <code>0.375rem</code>)<br><br><strong>Floating bar</strong><br>The collapse toggle button inherits <code>--social-icon-bg</code>, <code>--social-icon-color</code>, and <code>--social-icon-hover-bg</code>. Tooltips appear automatically on hover showing the platform name."
|
||||||
|
|
||||||
; ===== Misc =====
|
; ===== Misc =====
|
||||||
MOD_BREADCRUMBS_HERE="YOU ARE HERE:"
|
MOD_BREADCRUMBS_HERE="YOU ARE HERE:"
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
* INGROUP: MokoOnyx.Accessibility
|
* INGROUP: MokoOnyx.Accessibility
|
||||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||||
* PATH: ./media/css/a11y-high-contrast.css
|
* PATH: ./media/css/a11y-high-contrast.css
|
||||||
* VERSION: 02.25.00
|
* VERSION: 02.27.03
|
||||||
* BRIEF: High-contrast stylesheet for accessibility toolbar
|
* BRIEF: High-contrast stylesheet for accessibility toolbar
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -23522,7 +23522,7 @@ font-size: 0.8125rem;
|
|||||||
.blog-item .item-image img {
|
.blog-item .item-image img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
object-fit: cover;
|
object-fit: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fa-brands {
|
.fa-brands {
|
||||||
@@ -23679,26 +23679,42 @@ font-size: 0.8125rem;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Position: floating — fixed sidebar, hidden on mobile */
|
/* Position: floating — fixed sidebar, hidden on mobile */
|
||||||
.moko-social-icons--floating {
|
.moko-social-floating-wrap {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
transform: translateY(-50%);
|
transform: translateY(-50%);
|
||||||
z-index: 1030;
|
z-index: 1030;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
transition: transform 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.moko-social-floating-wrap--left {
|
||||||
|
left: 0;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
|
||||||
|
.moko-social-floating-wrap--right {
|
||||||
|
right: 0;
|
||||||
|
flex-direction: row-reverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
.moko-social-floating-wrap--left.is-collapsed {
|
||||||
|
transform: translateY(-50%) translateX(calc(-100% + 1.5rem));
|
||||||
|
}
|
||||||
|
|
||||||
|
.moko-social-floating-wrap--right.is-collapsed {
|
||||||
|
transform: translateY(-50%) translateX(calc(100% - 1.5rem));
|
||||||
|
}
|
||||||
|
|
||||||
|
.moko-social-icons--floating {
|
||||||
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.moko-social-icons--floating ul {
|
.moko-social-icons--floating ul {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.moko-social-icons--floating-left {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.moko-social-icons--floating-right {
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.moko-social-icons--floating-left a {
|
.moko-social-icons--floating-left a {
|
||||||
border-radius: 0 var(--social-icon-radius, 0.375rem) var(--social-icon-radius, 0.375rem) 0;
|
border-radius: 0 var(--social-icon-radius, 0.375rem) var(--social-icon-radius, 0.375rem) 0;
|
||||||
}
|
}
|
||||||
@@ -23712,8 +23728,48 @@ font-size: 0.8125rem;
|
|||||||
border-radius: inherit;
|
border-radius: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Floating toggle button */
|
||||||
|
.moko-social-floating-toggle {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 1.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
padding: 0;
|
||||||
|
border: 1px solid var(--social-icon-bg, var(--border-color, hsl(0, 0%, 80%)));
|
||||||
|
background: var(--social-icon-bg, var(--body-bg, hsl(0, 0%, 100%)));
|
||||||
|
color: var(--social-icon-color, currentColor);
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 0.65rem;
|
||||||
|
transition: background 0.2s, color 0.2s;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.moko-social-floating-wrap--left .moko-social-floating-toggle {
|
||||||
|
border-radius: 0 var(--social-icon-radius, 0.375rem) var(--social-icon-radius, 0.375rem) 0;
|
||||||
|
border-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.moko-social-floating-wrap--right .moko-social-floating-toggle {
|
||||||
|
border-radius: var(--social-icon-radius, 0.375rem) 0 0 var(--social-icon-radius, 0.375rem);
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.moko-social-floating-toggle:hover {
|
||||||
|
background: var(--social-icon-hover-bg, var(--accent-color-primary, hsl(220, 70%, 50%)));
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.moko-social-floating-toggle .fa-solid {
|
||||||
|
transition: transform 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-collapsed .moko-social-floating-toggle .fa-solid {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 991.98px) {
|
@media (max-width: 991.98px) {
|
||||||
.moko-social-icons--floating {
|
.moko-social-floating-wrap {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -789,6 +789,46 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ========================================================================
|
||||||
|
// FLOATING SOCIAL BAR (collapsible)
|
||||||
|
// ========================================================================
|
||||||
|
var socialStorageKey = "moko-social-collapsed";
|
||||||
|
|
||||||
|
function initSocialFloating() {
|
||||||
|
var wrap = doc.getElementById("mokoSocialFloating");
|
||||||
|
var toggle = doc.getElementById("mokoSocialFloatingToggle");
|
||||||
|
if (!wrap || !toggle) return;
|
||||||
|
|
||||||
|
// Restore saved state
|
||||||
|
try {
|
||||||
|
if (localStorage.getItem(socialStorageKey) === "1") {
|
||||||
|
wrap.classList.add("is-collapsed");
|
||||||
|
toggle.setAttribute("aria-expanded", "false");
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
toggle.addEventListener("click", function () {
|
||||||
|
var collapsed = wrap.classList.toggle("is-collapsed");
|
||||||
|
toggle.setAttribute("aria-expanded", collapsed ? "false" : "true");
|
||||||
|
try { localStorage.setItem(socialStorageKey, collapsed ? "1" : "0"); } catch (e) {}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========================================================================
|
||||||
|
// SOCIAL ICON TOOLTIPS
|
||||||
|
// ========================================================================
|
||||||
|
function initSocialTooltips() {
|
||||||
|
var triggers = doc.querySelectorAll('.moko-social-icons [data-bs-toggle="tooltip"]');
|
||||||
|
if (!triggers.length) return;
|
||||||
|
|
||||||
|
// Bootstrap 5 tooltip init
|
||||||
|
if (typeof bootstrap !== "undefined" && bootstrap.Tooltip) {
|
||||||
|
triggers.forEach(function (el) {
|
||||||
|
new bootstrap.Tooltip(el, { trigger: "hover focus" });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run all template JS initializations
|
* Run all template JS initializations
|
||||||
*/
|
*/
|
||||||
@@ -815,6 +855,8 @@
|
|||||||
initBackTop();
|
initBackTop();
|
||||||
initSearchToggle();
|
initSearchToggle();
|
||||||
initSidebarAccordion();
|
initSidebarAccordion();
|
||||||
|
initSocialFloating();
|
||||||
|
initSocialTooltips();
|
||||||
initVarCopy();
|
initVarCopy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+23
-23
@@ -35,7 +35,7 @@
|
|||||||
</updateservers>
|
</updateservers>
|
||||||
<dlid prefix="dlid=" suffix=""/>
|
<dlid prefix="dlid=" suffix=""/>
|
||||||
<name>mokoonyx</name>
|
<name>mokoonyx</name>
|
||||||
<version>02.25.00</version>
|
<version>02.27.03</version>
|
||||||
<scriptfile>script.php</scriptfile>
|
<scriptfile>script.php</scriptfile>
|
||||||
<creationDate>2026-05-16</creationDate>
|
<creationDate>2026-05-16</creationDate>
|
||||||
<author>Jonathan Miller || Moko Consulting</author>
|
<author>Jonathan Miller || Moko Consulting</author>
|
||||||
@@ -387,28 +387,28 @@
|
|||||||
showon="social_topbar:1[OR]social_footer:1[OR]social_floating:1" />
|
showon="social_topbar:1[OR]social_footer:1[OR]social_floating:1" />
|
||||||
<field name="social_urls_note" type="note" description="TPL_MOKOONYX_SOCIAL_URLS_NOTE"
|
<field name="social_urls_note" type="note" description="TPL_MOKOONYX_SOCIAL_URLS_NOTE"
|
||||||
showon="social_topbar:1[OR]social_footer:1[OR]social_floating:1" />
|
showon="social_topbar:1[OR]social_footer:1[OR]social_floating:1" />
|
||||||
<field name="social_facebook_url" type="url" default="" label="Facebook" filter="url" />
|
<field name="social_facebook_url" type="url" default="" label="Facebook" filter="url" validate="url" />
|
||||||
<field name="social_twitter_url" type="url" default="" label="X / Twitter" filter="url" />
|
<field name="social_twitter_url" type="url" default="" label="X / Twitter" filter="url" validate="url" />
|
||||||
<field name="social_instagram_url" type="url" default="" label="Instagram" filter="url" />
|
<field name="social_instagram_url" type="url" default="" label="Instagram" filter="url" validate="url" />
|
||||||
<field name="social_linkedin_url" type="url" default="" label="LinkedIn" filter="url" />
|
<field name="social_linkedin_url" type="url" default="" label="LinkedIn" filter="url" validate="url" />
|
||||||
<field name="social_youtube_url" type="url" default="" label="YouTube" filter="url" />
|
<field name="social_youtube_url" type="url" default="" label="YouTube" filter="url" validate="url" />
|
||||||
<field name="social_github_url" type="url" default="" label="GitHub" filter="url" />
|
<field name="social_github_url" type="url" default="" label="GitHub" filter="url" validate="url" />
|
||||||
<field name="social_bluesky_url" type="url" default="" label="Bluesky" filter="url" />
|
<field name="social_bluesky_url" type="url" default="" label="Bluesky" filter="url" validate="url" />
|
||||||
<field name="social_threads_url" type="url" default="" label="Threads" filter="url" />
|
<field name="social_threads_url" type="url" default="" label="Threads" filter="url" validate="url" />
|
||||||
<field name="social_discord_url" type="url" default="" label="Discord" filter="url" />
|
<field name="social_discord_url" type="url" default="" label="Discord" filter="url" validate="url" />
|
||||||
<field name="social_tiktok_url" type="url" default="" label="TikTok" filter="url" />
|
<field name="social_tiktok_url" type="url" default="" label="TikTok" filter="url" validate="url" />
|
||||||
<field name="social_reddit_url" type="url" default="" label="Reddit" filter="url" />
|
<field name="social_reddit_url" type="url" default="" label="Reddit" filter="url" validate="url" />
|
||||||
<field name="social_pinterest_url" type="url" default="" label="Pinterest" filter="url" />
|
<field name="social_pinterest_url" type="url" default="" label="Pinterest" filter="url" validate="url" />
|
||||||
<field name="social_snapchat_url" type="url" default="" label="Snapchat" filter="url" />
|
<field name="social_snapchat_url" type="url" default="" label="Snapchat" filter="url" validate="url" />
|
||||||
<field name="social_telegram_url" type="url" default="" label="Telegram" filter="url" />
|
<field name="social_telegram_url" type="url" default="" label="Telegram" filter="url" validate="url" />
|
||||||
<field name="social_whatsapp_url" type="url" default="" label="WhatsApp" filter="url" />
|
<field name="social_whatsapp_url" type="url" default="" label="WhatsApp" filter="url" validate="url" />
|
||||||
<field name="social_tumblr_url" type="url" default="" label="Tumblr" filter="url" />
|
<field name="social_tumblr_url" type="url" default="" label="Tumblr" filter="url" validate="url" />
|
||||||
<field name="social_twitch_url" type="url" default="" label="Twitch" filter="url" />
|
<field name="social_twitch_url" type="url" default="" label="Twitch" filter="url" validate="url" />
|
||||||
<field name="social_spotify_url" type="url" default="" label="Spotify" filter="url" />
|
<field name="social_spotify_url" type="url" default="" label="Spotify" filter="url" validate="url" />
|
||||||
<field name="social_soundcloud_url" type="url" default="" label="SoundCloud" filter="url" />
|
<field name="social_soundcloud_url" type="url" default="" label="SoundCloud" filter="url" validate="url" />
|
||||||
<field name="social_flickr_url" type="url" default="" label="Flickr" filter="url" />
|
<field name="social_flickr_url" type="url" default="" label="Flickr" filter="url" validate="url" />
|
||||||
<field name="social_vimeo_url" type="url" default="" label="Vimeo" filter="url" />
|
<field name="social_vimeo_url" type="url" default="" label="Vimeo" filter="url" validate="url" />
|
||||||
<field name="social_linktree_url" type="url" default="" label="Linktree" filter="url" />
|
<field name="social_linktree_url" type="url" default="" label="Linktree" filter="url" validate="url" />
|
||||||
<field name="social_mail_url" type="url" default="" label="Email" description="TPL_MOKOONYX_SOCIAL_MAIL_DESC" filter="string" />
|
<field name="social_mail_url" type="url" default="" label="Email" description="TPL_MOKOONYX_SOCIAL_MAIL_DESC" filter="string" />
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user