diff --git a/.mokogitea/manifest.xml b/.mokogitea/manifest.xml index dde7d5b..d0f91d9 100644 --- a/.mokogitea/manifest.xml +++ b/.mokogitea/manifest.xml @@ -7,7 +7,7 @@ MokoJoomHero - Module - MokoJoomHero + Package - MokoJoomHero MokoConsulting A Joomla Module designed to provide a random image from a folder with content on top as a Hero. 01.06.00 diff --git a/CLAUDE.md b/CLAUDE.md index d40f799..6598488 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code when working with this repository. ## Project Overview -**MokoJoomHero** -- A Joomla Module designed to provide a random image from a folder with content on top as a Hero. +**MokoJoomHero** -- Random hero image slideshow/video with content overlay for Joomla | Field | Value | |---|---| @@ -32,20 +32,40 @@ composer install # Install PHP dependencies ## Architecture -This is a Joomla extension. Key directories: -- `src/` -- extension source (deployed to Joomla) -- `src/*.xml` -- manifest file (version, files, params) -- `src/src/` or `src/services/` -- PHP classes -- `src/language/` -- translation strings -- `src/media/` -- CSS/JS/images +This is a Joomla **package** extension (`pkg_mokojoomhero`) containing two sub-extensions: + +### mod_mokojoomhero (Site Module) +- Random hero image slideshow or background video with content overlay +- Supports image folders, YouTube, Vimeo, and local video +- Configurable overlay, text alignment, card animation +- **Requires** `plg_system_mokojoomhero` to be enabled — module silently skips rendering if the system plugin is disabled + +### plg_system_mokojoomhero (System Plugin) +- License key validation — warns admin once per session if no download key configured +- Auto-enabled on package install via `pkg_script.php` +- Namespace: `Joomla\Plugin\System\MokoJoomHero` + +### Key files +- `src/pkg_mokojoomhero.xml` — package manifest +- `src/pkg_script.php` — auto-enables system plugin on install +- `src/packages/mod_mokojoomhero/` — hero module source +- `src/packages/plg_system_mokojoomhero/` — system plugin source +- `updates.xml` — Joomla update server (includes legacy module entries for migration) ## Rules - **Workflow directory**: `.mokogitea/` (not `.gitea/` or `.github/`) - - **Never commit** `.claude/`, `.mcp.json`, `TODO.md`, or `*.min.css`/`*.min.js` - **Attribution**: use `Authored-by: Moko Consulting` in commits - **Branch strategy**: develop on `dev`, merge to `main` for release -- **Minification**: handled at build time (CI) and runtime (MokoMinifyHelper for Joomla templates) +- **Minification**: handled at build time (CI) - **Wiki**: documentation lives in the Gitea wiki, not in `docs/` files - **Standards**: this repo follows [MokoStandards](https://git.mokoconsulting.tech/MokoConsulting/moko-platform/wiki/Home) + +## Coding Standards + +- PHP 8.1+ minimum +- Joomla 5/6 DI container pattern: `services/provider.php` → Extension class +- Legacy stub `.php` file required for plugin loader but empty +- `SubscriberInterface` for event subscription (not `on*` method naming) +- SPDX license headers on all PHP files diff --git a/Makefile b/Makefile index 02bdb18..5819862 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ # Extension Configuration EXTENSION_NAME := mokojoomhero -EXTENSION_TYPE := module +EXTENSION_TYPE := package # Options: module, plugin, component, package, template EXTENSION_VERSION := 1.0.0 @@ -26,7 +26,7 @@ PLUGIN_GROUP := system # Options: system, content, user, authentication, etc. # Directories -SRC_DIR := . +SRC_DIR := src BUILD_DIR := build DIST_DIR := dist DOCS_DIR := docs @@ -155,62 +155,30 @@ 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)"; \ - 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)" +build: clean ## Build extension package + @echo "$(COLOR_BLUE)Building Joomla package extension...$(COLOR_RESET)" + @mkdir -p $(DIST_DIR) $(BUILD_DIR)/packages + + @# --- Build each sub-extension as a separate ZIP --- + @for EXT_DIR in $(SRC_DIR)/packages/*/; do \ + EXT_NAME=$$(basename "$$EXT_DIR"); \ + [ "$$EXT_NAME" = "index.html" ] && continue; \ + echo " Packaging $$EXT_NAME..."; \ + cd "$$EXT_DIR" && $(ZIP) -r "$(CURDIR)/$(BUILD_DIR)/packages/$${EXT_NAME}.zip" . \ + -x "*.git*" -x "*/index.html" 2>/dev/null; \ + cd "$(CURDIR)"; \ + done + + @# --- Build the outer package ZIP --- + @echo " Assembling pkg_$(EXTENSION_NAME)..." + @cp $(SRC_DIR)/pkg_mokojoomhero.xml $(BUILD_DIR)/pkg_mokojoomhero.xml + @cp $(SRC_DIR)/pkg_script.php $(BUILD_DIR)/pkg_script.php + @cd $(BUILD_DIR) && $(ZIP) -r "$(CURDIR)/$(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip" \ + pkg_mokojoomhero.xml pkg_script.php packages/ + + @echo "$(COLOR_GREEN)✓ Package created: $(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip$(COLOR_RESET)" + @echo " Contents:" + @unzip -l "$(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip" | tail -n +4 | head -20 .PHONY: package package: build ## Alias for build @@ -325,49 +293,15 @@ security-check: ## Run security checks on dependencies $(NPM) audit || echo "$(COLOR_YELLOW)⚠ Vulnerabilities found$(COLOR_RESET)"; \ fi -.PHONY: deploy -deploy: ## Deploy to a Joomla site via SSH (usage: make deploy HOST=user@host WEBROOT=/path/to/joomla) - @if [ -z "$(HOST)" ] || [ -z "$(WEBROOT)" ]; then \ - echo "$(COLOR_RED)✗ Usage: make deploy HOST=user@host WEBROOT=/path/to/joomla [KEY=~/.ssh/id_rsa]$(COLOR_RESET)"; \ - exit 1; \ +.PHONY: minify +minify: ## Minify CSS/JS assets + @echo "Minifying assets..." + @MOKO_PLATFORM=$$(echo ../moko-platform $$HOME/moko-platform /opt/moko-platform | tr ' ' '\n' | while read p; do [ -d "$$p" ] && echo "$$p" && break; done); \ + if [ -n "$$MOKO_PLATFORM" ] && [ -f "$$MOKO_PLATFORM/build/minify.js" ]; then \ + node "$$MOKO_PLATFORM/build/minify.js" $(SRC_DIR); \ + else \ + echo "No minify script found"; \ fi - @SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=10"; \ - if [ -n "$(KEY)" ]; then SSH_OPTS="$$SSH_OPTS -i $(KEY)"; fi; \ - echo "$(COLOR_BLUE)Deploying mod_$(EXTENSION_NAME) to $(HOST):$(WEBROOT)...$(COLOR_RESET)"; \ - ssh $$SSH_OPTS $(HOST) "\ - W=$(WEBROOT) && \ - cp -r \$$W/modules/mod_$(EXTENSION_NAME)/language/en-US/* /dev/null 2>&1; \ - true" && \ - for f in src/mod_mokojoomhero.php src/mod_mokojoomhero.xml src/script.php; do \ - scp $$SSH_OPTS $$f $(HOST):$(WEBROOT)/modules/mod_$(EXTENSION_NAME)/$$(basename $$f); \ - done && \ - scp -r $$SSH_OPTS src/tmpl/* $(HOST):$(WEBROOT)/modules/mod_$(EXTENSION_NAME)/tmpl/ && \ - scp -r $$SSH_OPTS src/language/* $(HOST):$(WEBROOT)/modules/mod_$(EXTENSION_NAME)/language/ && \ - scp $$SSH_OPTS src/media/joomla.asset.json $(HOST):$(WEBROOT)/media/mod_$(EXTENSION_NAME)/ && \ - scp -r $$SSH_OPTS src/media/css/* $(HOST):$(WEBROOT)/media/mod_$(EXTENSION_NAME)/css/ && \ - scp -r $$SSH_OPTS src/media/js/* $(HOST):$(WEBROOT)/media/mod_$(EXTENSION_NAME)/js/ && \ - ssh $$SSH_OPTS $(HOST) "\ - W=$(WEBROOT) && \ - mkdir -p \$$W/images/heroes && \ - for lang in en-US en-GB; do \ - for ini in mod_mokojoomhero.ini mod_mokojoomhero.sys.ini; do \ - src=\$$W/modules/mod_$(EXTENSION_NAME)/language/\$$lang/\$$ini; \ - if [ -f \$$src ]; then \ - cp \$$src \$$W/administrator/language/\$$lang/\$$ini 2>/dev/null; \ - cp \$$src \$$W/language/\$$lang/\$$ini 2>/dev/null; \ - fi; \ - done; \ - done && \ - echo 'OK'" && \ - echo "$(COLOR_GREEN)✓ Deployed to $(HOST)$(COLOR_RESET)" - -.PHONY: deploy-all -deploy-all: ## Deploy to all configured sites (requires SITES_FILE or inline) - @echo "$(COLOR_BLUE)Deploying to all sites...$(COLOR_RESET)" - @echo "$(COLOR_YELLOW)Usage: Create a sites.conf with HOST:WEBROOT per line, then:$(COLOR_RESET)" - @echo " while IFS=: read -r host webroot; do" - @echo " make deploy HOST=\$$host WEBROOT=\$$webroot KEY=path/to/key" - @echo " done < sites.conf" .PHONY: all all: install-deps validate test build ## Run complete build pipeline diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/index.html @@ -0,0 +1 @@ + diff --git a/src/index.md b/src/index.md deleted file mode 100644 index c700eac..0000000 --- a/src/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Docs Index: /templates/repos/joomla/module/src - -## Purpose - -This index provides navigation to documentation within this folder. - -## Metadata - -- **Document Type:** index -- **Auto-generated:** This file is automatically generated by rebuild_indexes.py - -## Revision History - -| Change | Notes | Author | -| --- | --- | --- | -| Automated update | Generated by documentation index automation | rebuild_indexes.py | diff --git a/src/packages/index.html b/src/packages/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/index.html @@ -0,0 +1 @@ + diff --git a/src/packages/mod_mokojoomhero/index.html b/src/packages/mod_mokojoomhero/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/mod_mokojoomhero/index.html @@ -0,0 +1 @@ + diff --git a/src/packages/mod_mokojoomhero/language/en-GB/index.html b/src/packages/mod_mokojoomhero/language/en-GB/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/mod_mokojoomhero/language/en-GB/index.html @@ -0,0 +1 @@ + diff --git a/src/language/en-GB/mod_mokojoomhero.ini b/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.ini similarity index 81% rename from src/language/en-GB/mod_mokojoomhero.ini rename to src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.ini index 800b864..2d480a4 100644 --- a/src/language/en-GB/mod_mokojoomhero.ini +++ b/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.ini @@ -20,10 +20,12 @@ MOD_MOKOJOOMHERO_SHOW_CARD_DESC="Wrap the content in a card with a white backgro ; Hero mode MOD_MOKOJOOMHERO_MODE_LABEL="Hero Mode" -MOD_MOKOJOOMHERO_MODE_DESC="Choose between a slideshow of images, an embedded video (YouTube/Vimeo), or a local video file." +MOD_MOKOJOOMHERO_MODE_DESC="Choose between a slideshow of images, an embedded video (YouTube/Vimeo), a local video file, a solid colour, or a gradient." MOD_MOKOJOOMHERO_MODE_IMAGES="Images" MOD_MOKOJOOMHERO_MODE_VIDEO="Video (YouTube/Vimeo)" MOD_MOKOJOOMHERO_MODE_LOCALVIDEO="Local Video" +MOD_MOKOJOOMHERO_MODE_COLOR="Solid Colour" +MOD_MOKOJOOMHERO_MODE_GRADIENT="Gradient" ; Image settings MOD_MOKOJOOMHERO_IMAGE_FOLDER_LABEL="Image Folder" @@ -49,6 +51,18 @@ MOD_MOKOJOOMHERO_CARD_DELAY_DESC="Delay in milliseconds before the content card MOD_MOKOJOOMHERO_MUTE_TOGGLE_LABEL="Show Mute Toggle" MOD_MOKOJOOMHERO_MUTE_TOGGLE_DESC="Show a mute/unmute button on the hero video. Videos always start muted (required for autoplay)." +; Solid colour background +MOD_MOKOJOOMHERO_BG_COLOR_LABEL="Background Colour" +MOD_MOKOJOOMHERO_BG_COLOR_DESC="Solid background colour for the hero section." + +; Gradient background +MOD_MOKOJOOMHERO_GRADIENT_START_LABEL="Gradient Start Colour" +MOD_MOKOJOOMHERO_GRADIENT_START_DESC="Starting colour of the gradient." +MOD_MOKOJOOMHERO_GRADIENT_END_LABEL="Gradient End Colour" +MOD_MOKOJOOMHERO_GRADIENT_END_DESC="Ending colour of the gradient." +MOD_MOKOJOOMHERO_GRADIENT_ANGLE_LABEL="Gradient Angle" +MOD_MOKOJOOMHERO_GRADIENT_ANGLE_DESC="Direction of the gradient in degrees (0 = bottom to top, 90 = left to right, 135 = diagonal)." + ; Hero height MOD_MOKOJOOMHERO_HERO_HEIGHT_LABEL="Hero Height" MOD_MOKOJOOMHERO_HERO_HEIGHT_DESC="Height of the hero section. Use px for fixed pixels (e.g. 400px) or vh for viewport height (e.g. 60vh for 60%% of screen)." diff --git a/src/language/en-GB/mod_mokojoomhero.sys.ini b/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.sys.ini similarity index 100% rename from src/language/en-GB/mod_mokojoomhero.sys.ini rename to src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.sys.ini diff --git a/src/packages/mod_mokojoomhero/language/en-US/index.html b/src/packages/mod_mokojoomhero/language/en-US/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/mod_mokojoomhero/language/en-US/index.html @@ -0,0 +1 @@ + diff --git a/src/language/en-US/mod_mokojoomhero.ini b/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.ini similarity index 81% rename from src/language/en-US/mod_mokojoomhero.ini rename to src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.ini index 541ee4b..a6f1ba4 100644 --- a/src/language/en-US/mod_mokojoomhero.ini +++ b/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.ini @@ -20,10 +20,12 @@ MOD_MOKOJOOMHERO_SHOW_CARD_DESC="Wrap the content in a card with a white backgro ; Hero mode MOD_MOKOJOOMHERO_MODE_LABEL="Hero Mode" -MOD_MOKOJOOMHERO_MODE_DESC="Choose between a slideshow of images, an embedded video (YouTube/Vimeo), or a local video file." +MOD_MOKOJOOMHERO_MODE_DESC="Choose between a slideshow of images, an embedded video (YouTube/Vimeo), a local video file, a solid color, or a gradient." MOD_MOKOJOOMHERO_MODE_IMAGES="Images" MOD_MOKOJOOMHERO_MODE_VIDEO="Video (YouTube/Vimeo)" MOD_MOKOJOOMHERO_MODE_LOCALVIDEO="Local Video" +MOD_MOKOJOOMHERO_MODE_COLOR="Solid Color" +MOD_MOKOJOOMHERO_MODE_GRADIENT="Gradient" ; Image settings MOD_MOKOJOOMHERO_IMAGE_FOLDER_LABEL="Image Folder" @@ -41,6 +43,18 @@ MOD_MOKOJOOMHERO_VIDEO_FILE_DESC="YouTube or Vimeo URL. The module auto-detects MOD_MOKOJOOMHERO_LOCAL_VIDEO_LABEL="Video File" MOD_MOKOJOOMHERO_LOCAL_VIDEO_DESC="Select a video file from the Media Manager (mp4, webm, ogg)." +; Solid color background +MOD_MOKOJOOMHERO_BG_COLOR_LABEL="Background Color" +MOD_MOKOJOOMHERO_BG_COLOR_DESC="Solid background color for the hero section." + +; Gradient background +MOD_MOKOJOOMHERO_GRADIENT_START_LABEL="Gradient Start Color" +MOD_MOKOJOOMHERO_GRADIENT_START_DESC="Starting color of the gradient." +MOD_MOKOJOOMHERO_GRADIENT_END_LABEL="Gradient End Color" +MOD_MOKOJOOMHERO_GRADIENT_END_DESC="Ending color of the gradient." +MOD_MOKOJOOMHERO_GRADIENT_ANGLE_LABEL="Gradient Angle" +MOD_MOKOJOOMHERO_GRADIENT_ANGLE_DESC="Direction of the gradient in degrees (0 = bottom to top, 90 = left to right, 135 = diagonal)." + ; Hero height MOD_MOKOJOOMHERO_HERO_HEIGHT_LABEL="Hero Height" MOD_MOKOJOOMHERO_HERO_HEIGHT_DESC="Height of the hero section. Use px for fixed pixels (e.g. 400px) or vh for viewport height (e.g. 60vh for 60% of screen)." diff --git a/src/language/en-US/mod_mokojoomhero.sys.ini b/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.sys.ini similarity index 100% rename from src/language/en-US/mod_mokojoomhero.sys.ini rename to src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.sys.ini diff --git a/src/packages/mod_mokojoomhero/language/index.html b/src/packages/mod_mokojoomhero/language/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/mod_mokojoomhero/language/index.html @@ -0,0 +1 @@ + diff --git a/src/packages/mod_mokojoomhero/media/css/index.html b/src/packages/mod_mokojoomhero/media/css/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/mod_mokojoomhero/media/css/index.html @@ -0,0 +1 @@ + diff --git a/src/media/css/mod_mokojoomhero.css b/src/packages/mod_mokojoomhero/media/css/mod_mokojoomhero.css similarity index 95% rename from src/media/css/mod_mokojoomhero.css rename to src/packages/mod_mokojoomhero/media/css/mod_mokojoomhero.css index 9e560d8..ffda708 100644 --- a/src/media/css/mod_mokojoomhero.css +++ b/src/packages/mod_mokojoomhero/media/css/mod_mokojoomhero.css @@ -22,6 +22,14 @@ justify-content: center; } +/* ============================================================ + Solid colour / gradient background + ============================================================ */ +.mokojoomhero__color { + position: absolute; + inset: 0; +} + /* ============================================================ Image slides ============================================================ */ diff --git a/src/packages/mod_mokojoomhero/media/index.html b/src/packages/mod_mokojoomhero/media/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/mod_mokojoomhero/media/index.html @@ -0,0 +1 @@ + diff --git a/src/media/joomla.asset.json b/src/packages/mod_mokojoomhero/media/joomla.asset.json similarity index 100% rename from src/media/joomla.asset.json rename to src/packages/mod_mokojoomhero/media/joomla.asset.json diff --git a/src/packages/mod_mokojoomhero/media/js/index.html b/src/packages/mod_mokojoomhero/media/js/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/mod_mokojoomhero/media/js/index.html @@ -0,0 +1 @@ + diff --git a/src/media/js/mod_mokojoomhero.js b/src/packages/mod_mokojoomhero/media/js/mod_mokojoomhero.js similarity index 100% rename from src/media/js/mod_mokojoomhero.js rename to src/packages/mod_mokojoomhero/media/js/mod_mokojoomhero.js diff --git a/src/mod_mokojoomhero.php b/src/packages/mod_mokojoomhero/mod_mokojoomhero.php similarity index 89% rename from src/mod_mokojoomhero.php rename to src/packages/mod_mokojoomhero/mod_mokojoomhero.php index a57ed9a..e264f9e 100644 --- a/src/mod_mokojoomhero.php +++ b/src/packages/mod_mokojoomhero/mod_mokojoomhero.php @@ -11,8 +11,14 @@ defined('_JEXEC') or die; use Joomla\CMS\Helper\ModuleHelper; +use Joomla\CMS\Plugin\PluginHelper; use Joomla\CMS\Uri\Uri; +// Require the system plugin to be installed and enabled +if (!PluginHelper::isEnabled('system', 'mokojoomhero')) { + return; +} + /** @var \Joomla\CMS\Application\SiteApplication $app */ /** @var \stdClass $module */ /** @var \Joomla\Registry\Registry $params */ @@ -38,6 +44,10 @@ $showCard = (bool) $params->get('showCard', 1); $cardDelay = (int) $params->get('cardDelay', 0); $showMuteToggle = (bool) $params->get('showMuteToggle', 0); $localVideoFile = $params->get('localVideoFile', ''); +$bgColor = $params->get('bgColor', '#003366'); +$gradientStart = $params->get('gradientStart', '#003366'); +$gradientEnd = $params->get('gradientEnd', '#006699'); +$gradientAngle = (int) $params->get('gradientAngle', 135); // Collect hero images $heroImages = []; diff --git a/src/mod_mokojoomhero.xml b/src/packages/mod_mokojoomhero/mod_mokojoomhero.xml similarity index 85% rename from src/mod_mokojoomhero.xml rename to src/packages/mod_mokojoomhero/mod_mokojoomhero.xml index 06d58e3..36a9544 100644 --- a/src/mod_mokojoomhero.xml +++ b/src/packages/mod_mokojoomhero/mod_mokojoomhero.xml @@ -61,7 +61,44 @@ + + + + + + - - - https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/raw/branch/main/updates.xml - - diff --git a/src/script.php b/src/packages/mod_mokojoomhero/script.php similarity index 100% rename from src/script.php rename to src/packages/mod_mokojoomhero/script.php diff --git a/src/tmpl/default.php b/src/packages/mod_mokojoomhero/tmpl/default.php similarity index 85% rename from src/tmpl/default.php rename to src/packages/mod_mokojoomhero/tmpl/default.php index ef6c2b5..62f0195 100644 --- a/src/tmpl/default.php +++ b/src/packages/mod_mokojoomhero/tmpl/default.php @@ -27,6 +27,10 @@ use Joomla\CMS\Language\Text; /** @var bool $showCard */ /** @var int $cardDelay */ /** @var bool $showMuteToggle */ +/** @var string $bgColor */ +/** @var string $gradientStart */ +/** @var string $gradientEnd */ +/** @var int $gradientAngle */ /** @var string $content */ $moduleId = 'mod-mokojoomhero-' . $module->id; @@ -45,8 +49,12 @@ $heightAttr = htmlspecialchars($heroHeight, ENT_QUOTES, 'UTF-8'); data-interval="" > - - + + +
+ +
+ diff --git a/src/tmpl/index.html b/src/packages/mod_mokojoomhero/tmpl/index.html similarity index 100% rename from src/tmpl/index.html rename to src/packages/mod_mokojoomhero/tmpl/index.html diff --git a/src/packages/plg_system_mokojoomhero/index.html b/src/packages/plg_system_mokojoomhero/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/index.html @@ -0,0 +1 @@ + diff --git a/src/packages/plg_system_mokojoomhero/language/en-GB/index.html b/src/packages/plg_system_mokojoomhero/language/en-GB/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/language/en-GB/index.html @@ -0,0 +1 @@ + diff --git a/src/packages/plg_system_mokojoomhero/language/en-GB/plg_system_mokojoomhero.ini b/src/packages/plg_system_mokojoomhero/language/en-GB/plg_system_mokojoomhero.ini new file mode 100644 index 0000000..d31b03f --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/language/en-GB/plg_system_mokojoomhero.ini @@ -0,0 +1,2 @@ +; Copyright (C) 2026 Moko Consulting +; SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/packages/plg_system_mokojoomhero/language/en-GB/plg_system_mokojoomhero.sys.ini b/src/packages/plg_system_mokojoomhero/language/en-GB/plg_system_mokojoomhero.sys.ini new file mode 100644 index 0000000..7dc0e9f --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/language/en-GB/plg_system_mokojoomhero.sys.ini @@ -0,0 +1,5 @@ +; Copyright (C) 2026 Moko Consulting +; SPDX-License-Identifier: GPL-3.0-or-later + +PLG_SYSTEM_MOKOJOOMHERO="System - MokoJoomHero" +PLG_SYSTEM_MOKOJOOMHERO_DESCRIPTION="System plugin for MokoJoomHero — license key validation" diff --git a/src/packages/plg_system_mokojoomhero/language/en-US/index.html b/src/packages/plg_system_mokojoomhero/language/en-US/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/language/en-US/index.html @@ -0,0 +1 @@ + diff --git a/src/packages/plg_system_mokojoomhero/language/en-US/plg_system_mokojoomhero.ini b/src/packages/plg_system_mokojoomhero/language/en-US/plg_system_mokojoomhero.ini new file mode 100644 index 0000000..d31b03f --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/language/en-US/plg_system_mokojoomhero.ini @@ -0,0 +1,2 @@ +; Copyright (C) 2026 Moko Consulting +; SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/packages/plg_system_mokojoomhero/language/en-US/plg_system_mokojoomhero.sys.ini b/src/packages/plg_system_mokojoomhero/language/en-US/plg_system_mokojoomhero.sys.ini new file mode 100644 index 0000000..7dc0e9f --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/language/en-US/plg_system_mokojoomhero.sys.ini @@ -0,0 +1,5 @@ +; Copyright (C) 2026 Moko Consulting +; SPDX-License-Identifier: GPL-3.0-or-later + +PLG_SYSTEM_MOKOJOOMHERO="System - MokoJoomHero" +PLG_SYSTEM_MOKOJOOMHERO_DESCRIPTION="System plugin for MokoJoomHero — license key validation" diff --git a/src/packages/plg_system_mokojoomhero/language/index.html b/src/packages/plg_system_mokojoomhero/language/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/language/index.html @@ -0,0 +1 @@ + diff --git a/src/packages/plg_system_mokojoomhero/mokojoomhero.php b/src/packages/plg_system_mokojoomhero/mokojoomhero.php new file mode 100644 index 0000000..70bada5 --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/mokojoomhero.php @@ -0,0 +1,12 @@ + + * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. + * @license GNU General Public License version 3 or later; see LICENSE + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +defined('_JEXEC') or die; diff --git a/src/packages/plg_system_mokojoomhero/mokojoomhero.xml b/src/packages/plg_system_mokojoomhero/mokojoomhero.xml new file mode 100644 index 0000000..e8782d2 --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/mokojoomhero.xml @@ -0,0 +1,34 @@ + + + + plg_system_mokojoomhero + 01.04.01-dev + 2026-06-02 + Moko Consulting + hello@mokoconsulting.tech + https://mokoconsulting.tech + Copyright (C) 2026 Moko Consulting. All rights reserved. + GPL-3.0-or-later + PLG_SYSTEM_MOKOJOOMHERO_DESCRIPTION + + Joomla\Plugin\System\MokoJoomHero + + + mokojoomhero.php + services + src + + + + language/en-GB/plg_system_mokojoomhero.ini + language/en-GB/plg_system_mokojoomhero.sys.ini + language/en-US/plg_system_mokojoomhero.ini + language/en-US/plg_system_mokojoomhero.sys.ini + + diff --git a/src/packages/plg_system_mokojoomhero/services/index.html b/src/packages/plg_system_mokojoomhero/services/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/services/index.html @@ -0,0 +1 @@ + diff --git a/src/packages/plg_system_mokojoomhero/services/provider.php b/src/packages/plg_system_mokojoomhero/services/provider.php new file mode 100644 index 0000000..8c861e2 --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/services/provider.php @@ -0,0 +1,39 @@ + + * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. + * @license GNU General Public License version 3 or later; see LICENSE + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Extension\PluginInterface; +use Joomla\CMS\Factory; +use Joomla\CMS\Plugin\PluginHelper; +use Joomla\DI\Container; +use Joomla\DI\ServiceProviderInterface; +use Joomla\Event\DispatcherInterface; +use Joomla\Plugin\System\MokoJoomHero\Extension\MokoJoomHero; + +return new class implements ServiceProviderInterface { + public function register(Container $container): void + { + $container->set( + PluginInterface::class, + function (Container $container) { + $plugin = new MokoJoomHero( + $container->get(DispatcherInterface::class), + (array) PluginHelper::getPlugin('system', 'mokojoomhero') + ); + + $plugin->setApplication(Factory::getApplication()); + + return $plugin; + } + ); + } +}; diff --git a/src/packages/plg_system_mokojoomhero/src/Extension/MokoJoomHero.php b/src/packages/plg_system_mokojoomhero/src/Extension/MokoJoomHero.php new file mode 100644 index 0000000..810af7f --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/src/Extension/MokoJoomHero.php @@ -0,0 +1,90 @@ + + * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. + * @license GNU General Public License version 3 or later; see LICENSE + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +namespace Joomla\Plugin\System\MokoJoomHero\Extension; + +defined('_JEXEC') or die; + +use Joomla\CMS\Factory; +use Joomla\CMS\Plugin\CMSPlugin; +use Joomla\Event\SubscriberInterface; + +class MokoJoomHero extends CMSPlugin implements SubscriberInterface +{ + public static function getSubscribedEvents(): array + { + return [ + 'onAfterRoute' => 'onAfterRoute', + ]; + } + + public function onAfterRoute(): void + { + $app = $this->getApplication(); + + if ($app->isClient('administrator')) { + $this->warnMissingLicenseKey(); + } + } + + /** + * Warn administrators once per session when no license key is configured. + * + * @return void + */ + private function warnMissingLicenseKey(): void + { + $session = Factory::getSession(); + + if ($session->get('mokojoomhero.license_warned', false)) { + return; + } + + $user = Factory::getUser(); + + if ($user->guest || !$user->authorise('core.manage')) { + return; + } + + $session->set('mokojoomhero.license_warned', true); + + try { + $db = Factory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->quoteName('extra_query')) + ->from($db->quoteName('#__update_sites')) + ->where($db->quoteName('name') . ' = ' . $db->quote('MokoJoomHero Updates')) + ->setLimit(1); + $db->setQuery($query); + $extraQuery = (string) $db->loadResult(); + + if (!empty($extraQuery)) { + parse_str($extraQuery, $parsed); + + if (!empty($parsed['dlid']) && preg_match('/^MOKO-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$/', $parsed['dlid'])) { + return; + } + } + + $this->getApplication()->enqueueMessage( + 'Moko Consulting License Key Required — ' + . 'No download key is configured. Updates will not be available until a valid license key is entered. ' + . 'Go to System → Update Sites ' + . 'and enter your license key (MOKO-XXXX-XXXX-XXXX-XXXX) in the Download Key field ' + . 'for the MokoJoomHero update site.', + 'warning' + ); + } catch (\Throwable $e) { + // Don't break admin over a license check + } + } +} diff --git a/src/packages/plg_system_mokojoomhero/src/Extension/index.html b/src/packages/plg_system_mokojoomhero/src/Extension/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/src/Extension/index.html @@ -0,0 +1 @@ + diff --git a/src/packages/plg_system_mokojoomhero/src/index.html b/src/packages/plg_system_mokojoomhero/src/index.html new file mode 100644 index 0000000..94906bc --- /dev/null +++ b/src/packages/plg_system_mokojoomhero/src/index.html @@ -0,0 +1 @@ + diff --git a/src/pkg_mokojoomhero.xml b/src/pkg_mokojoomhero.xml new file mode 100644 index 0000000..87a3b76 --- /dev/null +++ b/src/pkg_mokojoomhero.xml @@ -0,0 +1,30 @@ + + + + Package - MokoJoomHero + mokojoomhero + 01.04.01-dev + 2026-06-02 + Moko Consulting + hello@mokoconsulting.tech + https://mokoconsulting.tech + Copyright (C) 2026 Moko Consulting. All rights reserved. + GPL-3.0-or-later + PKG_MOKOJOOMHERO_DESCRIPTION + + pkg_script.php + + + mod_mokojoomhero.zip + plg_system_mokojoomhero.zip + + + + https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/raw/branch/main/updates.xml + + diff --git a/src/pkg_script.php b/src/pkg_script.php new file mode 100644 index 0000000..1901b3a --- /dev/null +++ b/src/pkg_script.php @@ -0,0 +1,43 @@ + + * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. + * @license GNU General Public License version 3 or later; see LICENSE + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Factory; +use Joomla\CMS\Installer\InstallerAdapter; + +class Pkg_MokoJoomHeroInstallerScript +{ + /** + * Called after install/update. + * + * @param string $type Action type + * @param InstallerAdapter $parent Installer adapter + * + * @return void + */ + public function postflight(string $type, InstallerAdapter $parent): void + { + if ($type === 'install') { + $db = Factory::getDbo(); + + // Enable the system plugin automatically on fresh install + $query = $db->getQuery(true) + ->update($db->quoteName('#__extensions')) + ->set($db->quoteName('enabled') . ' = 1') + ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) + ->where($db->quoteName('folder') . ' = ' . $db->quote('system')) + ->where($db->quoteName('element') . ' = ' . $db->quote('mokojoomhero')); + + $db->setQuery($query); + $db->execute(); + } + } +} diff --git a/updates.xml b/updates.xml index b4070ae..e53d9ba 100644 --- a/updates.xml +++ b/updates.xml @@ -5,6 +5,26 @@ --> + + + Package - MokoJoomHero + Package - MokoJoomHero development build. + pkg_mokojoomhero + package + 01.07.00-dev + 2026-06-02 + https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/tag/development + + https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/download/development/pkg_mokojoomhero-01.07.00-dev.zip + + + dev + Moko Consulting + https://mokoconsulting.tech + + + + Module - MokoJoomHero Module - MokoJoomHero dev build.