- Rename templates/mokocassiopeia → mokoonyx
- Rename media/templates/site/mokocassiopeia → mokoonyx
- Update #__extensions element and name
- Update #__template_styles template, title, and params
- Update #__menu link references
- Update #__update_sites to point to MokoOnyx updates.xml
- Clear #__updates cached entries for old extension
- No HTTP requests, no ZIP downloads, no Installer conflicts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove hardcoded RELEASE_URL, discover from updates.xml stable channel
- Add discoverStableUrl() to parse MokoOnyx updates.xml at runtime
- Extract httpGet() helper for reuse across download + XML fetch
- Remove bridge call from update() — postflight() handles it
- Always targets stable channel for production-safe installs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Download & install MokoOnyx from Gitea release
2. Copy user files (custom themes, user.css/js) to MokoOnyx
3. Migrate template styles with params
Fallback: if download fails, copy user files only (MokoOnyx must be
installed manually)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Instead of copying/renaming files, the bridge now:
1. Downloads mokoonyx ZIP from Gitea releases
2. Installs via Joomla's Installer (proper extension registration)
3. Migrates template styles and default assignment
4. Falls back gracefully with manual install link if download fails
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pure PHP backend decodes PNG (IHDR+IDAT+zlib), resizes with bilinear
interpolation, and encodes back to PNG — zero extension dependencies.
Supports RGB, RGBA, and indexed PNG color types.
Priority: GD → Imagick → pure PHP. Falls back gracefully.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Sync: compare against standard theme (not deleted custom starters)
- Sync: handle :root{ on same line (dark.standard.css format)
- Minify: added offline.css, editor.css, a11y-high-contrast.css,
user.css, user.js to minification list
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Support all common image formats (PNG, JPEG, GIF, WebP, BMP)
not just PNG — uses getimagesize() to detect type
- Add Log::add() warnings when generation fails (GD missing,
file not found, unsupported format)
- Fix source path: try both direct path and images/ prefix
to handle Joomla media field variations
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Joomla's update system compares hash_file() output (raw hex) against
the <sha256> element value. The sha256: prefix caused mismatch.
Also adds bridge migration helper for future MokoOnyx rename.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- helper/minify.php: PHP-based CSS/JS minifier with timestamp caching
- Dev mode ON: deletes all .min.css and .min.js files
- Dev mode OFF: regenerates .min files from source if stale or missing
- Covers template.css, light/dark standard/custom theme CSS, template.js
- No external build tools needed — template is self-contained
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- New "Favicon" tab in template config with media picker for PNG upload
- helper/favicon.php generates all standard sizes from source PNG using GD:
- favicon.ico (16x16 + 32x32 embedded)
- apple-touch-icon.png (180x180)
- favicon-32x32.png, favicon-16x16.png
- android-chrome-192x192.png, android-chrome-512x512.png
- site.webmanifest for PWA icon discovery
- Generated files cached in images/favicons/ with timestamp checking
- Link tags auto-injected in <head> when favicon source is configured
- Language strings added for en-GB and en-US
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>