Add "theme-dark" or "theme-light" to any module's Module Class Suffix
to force it into dark or light mode regardless of the page theme.
Implementation:
- CSS theme selectors changed from :root[data-bs-theme] to
[data-bs-theme] so variables apply to any element, not just <html>
- JS scans for .theme-dark/.theme-light classes on DOMContentLoaded
and sets data-bs-theme attribute on matching elements
- Scoped background/color/border-radius applied to themed modules
- Works with all module types, all layouts, no per-override changes
Files: template.js, template.css, light.standard.css, dark.standard.css,
light.custom.css, dark.custom.css, en-GB + en-US language docs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
BREAKING CHANGE: Sites still on MokoCassiopeia must install MokoOnyx
v01.x first to migrate settings before upgrading to v02.
Removed:
- helper/migrate.php — full migration engine (style cloning, file copy,
update server rewrite)
- script.php migration methods: migrateFromCassiopeia(),
copyUserFiles(), replaceCassiopeiaReferences() + OLD_NAME constants
- index.php first-load migration check (file_exists .migrated)
- Migration fieldset and language strings from admin UI
- "formerly MokoCassiopeia" from description
- MokoCassiopeia reference in bootstrap-toc.css comment
Updated:
- Roadmap rewritten for 01.xx→02.xx version line with clean future plan
- script.php MIN_JOOMLA bumped to 5.0.0 (Joomla 4.4 dropped)
- script.php postflight() simplified (favicon + lock only)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove GitHub mirror step from release.yml (Gitea is sole release host)
- Remove GitHub update server from templateDetails.xml
- Replace GH_TOKEN composer auth with GA_TOKEN Gitea auth
- Collapse MokoCassiopeia migration guide in <details> element
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Source dir: add htdocs/ fallback (components may use htdocs/ not src/)
- Manifest search: increase maxdepth to 3, exclude .git/ and build/
(covers src/admin/com_xxx.xml and similar nested structures)
- Exclude trigger files (.build-trigger, .beta-trigger, .rc-trigger)
from release packages
- Both release.yml and update-server.yml now consistent
Tested extension types: template, plugin (system), component, module,
library, package — all use the same generic workflow.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove hardcoded GITEA_REPO and EXT_ELEMENT env vars
- GITEA_REPO derived from github.event.repository.name
- EXT_ELEMENT auto-detected from Joomla manifest <element> tag,
falls back to manifest filename, then repo name
- Workflow is now identical across all Joomla repos — no per-repo
customization needed. Drop it in .gitea/workflows/ and it works.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Tags are now stream names: stable, development, alpha, beta, rc
- Stable releases preserve last 5 versions in the Gitea release body
(new version prepended, oldest trimmed)
- Other streams replace the release body entirely (single latest)
- Version derived from README.md, not the tag name
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tags are now release stream names: stable, release-candidate, beta,
alpha, development. Version is read from README.md and auto-bumped.
Workflow dispatch also uses stream names as a choice input.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Gitea Actions only runs from .gitea/workflows/. The .github/ copies
created ghost runs (release events on ubuntu-latest) that blocked
the runner queue. All active workflows are in .gitea/workflows/.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Stable releases now update ALL channels (dev, alpha, beta, rc, stable),
not just the matching one. Follows the same cascade map as
update-server.yml: stable→all, rc→rc+lower, beta→beta+lower, etc.
This ensures Joomla sites at any minimum stability level see the
latest version after a stable release.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- [ "$HTTP_CODE" -ge 400 ] && echo returns exit 1 when HTTP is OK
(test returns false=1, becomes step exit code). Use if/then instead.
- Skip GitHub mirror step entirely when GH_TOKEN is empty rather than
running and failing (Gitea marks job failed despite continue-on-error)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Key fixes:
- Checkout main directly for tag triggers (ref conditional) instead of
hacky detached HEAD switching after the fact
- Use git branch --show-current for target_commitish (was github.ref_name
which returns the tag name, not a branch, on tag triggers)
- All git push uses HEAD:${BRANCH} explicitly
- All curl calls use -sS with HTTP code capture and response logging
- SHA256 tag: add if missing, update if present, never leave empty
- Conditional minify/composer steps (skip if files don't exist)
- Summary step runs on always() for visibility on failures
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove empty <sha256></sha256> tags from updates.xml — Joomla fails
checksum verification when the tag is present but empty. Omitting the
tag entirely makes Joomla skip checksum validation.
- Fix release.yml detached HEAD on tag checkout — when triggered by a
version tag, git checks out in detached HEAD state and `git push`
fails. Now detects this and switches to main before committing.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The enterprise package is dev tooling (MokoStandards), not a runtime
dependency. It was listed in both require (with broken dev-version/04
constraint) and require-dev (with correct ^4.0). The duplicate in
require caused release workflow failures since the published package
04.05.00 doesn't match the dev branch constraint.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>