From cb4468af19a83daaff23db29b31a5ed16c7d0b59 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Thu, 16 Apr 2026 00:56:20 -0500 Subject: [PATCH] v03.09.16: brand-aside columns, offline page redesign, variable click-to-copy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Brand-aside position now uses flex columns like top-a (card style, equal-width) - Offline page: external offline.css with theme variables, 3-column centered card layout, Osaka font loading, full-screen on mobile - CSS variable click-to-copy: scans text for --var patterns, wraps in clickable chips with toast notification on copy - Search button border matches input border (--input-border-color) - mod_stats override: converted from dl to table layout - Patch bump 03.09.15 → 03.09.16 Co-Authored-By: Claude Opus 4.6 (1M context) --- README.md | 2 +- src/html/mod_stats/default.php | 16 ++- src/index.php | 2 +- src/joomla.asset.json | 2 +- src/media/css/offline.css | 237 +++++++++++++++++++++++++++++++++ src/media/css/template.css | 53 +++++++- src/media/js/template.js | 149 +++++++++++++++++++++ src/offline.php | 204 ++++++++++++++-------------- src/templateDetails.xml | 6 +- updates.xml | 32 ++--- 10 files changed, 568 insertions(+), 135 deletions(-) create mode 100644 src/media/css/offline.css diff --git a/README.md b/README.md index 5eeac79..6497f4f 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ INGROUP: MokoCassiopeia.Documentation REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia FILE: ./README.md - VERSION: 03.09.15 + VERSION: 03.09.16 BRIEF: Documentation for MokoCassiopeia template --> diff --git a/src/html/mod_stats/default.php b/src/html/mod_stats/default.php index d6aa1fd..7b6fdcf 100644 --- a/src/html/mod_stats/default.php +++ b/src/html/mod_stats/default.php @@ -26,10 +26,14 @@ $headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'U showtitle) : ?> < class="mod-stats__title">title; ?>> -
- -
title; ?>
-
data; ?>
- -
+ + + + + + + + + +
title; ?>data; ?>
diff --git a/src/index.php b/src/index.php index 1198dca..e30eb97 100644 --- a/src/index.php +++ b/src/index.php @@ -406,7 +406,7 @@ $wa->useScript('user.js'); // js/user.js countModules('brand-aside', true)) : ?>
- +
diff --git a/src/joomla.asset.json b/src/joomla.asset.json index 37d692f..f51468b 100644 --- a/src/joomla.asset.json +++ b/src/joomla.asset.json @@ -17,7 +17,7 @@ "defgroup": "Joomla.Template.Site", "ingroup": "MokoCassiopeia.Template.Assets", "path": "./media/templates/site/mokocassiopeia/joomla.asset.json", - "version": "03.09.15", + "version": "03.09.16", "brief": "Joomla asset registry for MokoCassiopeia" } }, diff --git a/src/media/css/offline.css b/src/media/css/offline.css new file mode 100644 index 0000000..19c27f8 --- /dev/null +++ b/src/media/css/offline.css @@ -0,0 +1,237 @@ +/* Copyright (C) 2026 Moko Consulting + + This file is part of a Moko Consulting project. + + SPDX-License-Identifier: GPL-3.0-or-later + */ + +/* === Offline Page Layout === */ +.moko-offline-wrap { + min-height: 100vh; + display: grid; + grid-template-rows: auto 1fr auto; + background-color: var(--body-bg, #0e1318); + color: var(--body-font-color, #e6ebf1); + font-family: var(--body-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif); +} + +.moko-offline-main { + display: grid; + place-items: center; + padding: 2rem 1rem; +} + +/* === Centered Card Grid === */ +.moko-offline-grid { + display: grid; + grid-template-columns: 1fr minmax(0, 720px) 1fr; + width: 100%; + max-width: 1200px; + margin: 0 auto; +} + +.moko-offline-grid__side { + display: block; +} + +.moko-offline-grid__center { + min-width: 0; +} + +@media (max-width: 767.98px) { + .moko-offline-grid { + grid-template-columns: 1fr; + } + + .moko-offline-grid__side { + display: none; + } + + .moko-offline-main { + padding: 0; + } + + .moko-offline-card { + border-radius: 0; + border: none; + min-height: 100%; + } +} + +/* === Card === */ +.moko-offline-card { + background-color: var(--card-bg, var(--secondary-bg, #151b22)); + border: var(--card-border-width, 1px) solid var(--card-border-color, var(--border-color, #2b323b)); + border-radius: var(--border-radius, 0.25rem); + box-shadow: var(--box-shadow, 0 0.5rem 1rem rgba(0, 0, 0, 0.26)); + padding: 2.5rem; +} + +@media (min-width: 768px) { + .moko-offline-card { + padding: 3rem; + } +} + +/* === Brand / Logo === */ +.moko-offline-brand { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + gap: 0.75rem; + text-decoration: none; + color: var(--body-font-color, #e6ebf1); + margin-bottom: 2rem; +} + +.moko-offline-brand:hover { + color: var(--color-link, #8ab4f8); +} + +.moko-offline-brand img { + max-width: 200px; + max-height: 80px; + width: auto; + height: auto; +} + +.moko-offline-brand .site-title { + font-size: 1.75rem; + font-weight: 700; + font-family: 'Osaka', var(--body-font-family, sans-serif); +} + +.moko-offline-brand .brand-tagline { + display: block; + opacity: 0.75; + font-size: 0.875rem; + line-height: 1.2; +} + +/* === Header === */ +.moko-offline-header { + background-color: var(--header-bg, var(--color-primary, #112855)); + color: var(--mainmenu-nav-link-color, #fff); + padding: 1rem 0; +} + +.moko-offline-header .container { + display: flex; + align-items: center; + gap: 1rem; + max-width: 1200px; + margin: 0 auto; + padding: 0 1rem; +} + +.moko-offline-header .moko-brand { + display: flex; + align-items: center; + gap: 0.75rem; + text-decoration: none; + color: var(--mainmenu-nav-link-color, #fff); +} + +.moko-offline-header .moko-brand img { + max-width: 180px; + max-height: 60px; + width: auto; + height: auto; +} + +.moko-offline-header .moko-brand .brand-tagline { + display: block; + opacity: 0.75; + font-size: 0.875rem; + line-height: 1.2; +} + +/* === Content Typography === */ +.moko-offline-card h1 { + color: var(--heading-color, var(--body-font-color, #f1f5f9)); + font-weight: 700; +} + +.moko-offline-card .lead { + color: var(--gray-600, #48525d); + line-height: 1.6; +} + +/* === Accordion === */ +.moko-offline-card .accordion-item { + background-color: var(--card-bg, var(--secondary-bg, #151b22)); + border-color: var(--border-color, #2b323b); +} + +.moko-offline-card .accordion-button { + background-color: var(--card-bg, var(--secondary-bg, #151b22)); + color: var(--body-font-color, #e6ebf1); +} + +.moko-offline-card .accordion-button:not(.collapsed) { + background-color: var(--card-cap-bg, rgba(255, 255, 255, 0.03)); + color: var(--body-font-color, #e6ebf1); +} + +.moko-offline-card .accordion-body { + background-color: var(--card-bg, var(--secondary-bg, #151b22)); +} + +/* === Form Controls === */ +.moko-offline-card .form-control { + background-color: var(--input-bg, #1a2332); + border-color: var(--input-border-color, #3a4250); + color: var(--input-color, #e6ebf1); +} + +.moko-offline-card .form-control:focus { + border-color: var(--input-focus-border-color, #5472ff); + box-shadow: var(--input-focus-box-shadow, 0 0 0 0.25rem rgba(84, 114, 255, 0.25)); +} + +.moko-offline-card .form-label { + color: var(--body-font-color, #e6ebf1); +} + +.moko-offline-card .form-check-label { + color: var(--body-font-color, #e6ebf1); +} + +/* === Button === */ +.moko-offline-card .btn-primary { + background-color: var(--color-primary, #112855); + border-color: var(--color-primary, #112855); + color: var(--mainmenu-nav-link-color, #fff); +} + +.moko-offline-card .btn-primary:hover { + background-color: var(--color-hover, gray); + border-color: var(--color-hover, gray); +} + +/* === Links === */ +.moko-offline-card a { + color: var(--link-color, var(--color-link, #8ab4f8)); +} + +.moko-offline-card a:hover { + color: var(--link-hover-color, #c3d6ff); +} + +/* === Skip Link === */ +.skip-link { + position: absolute; + left: -9999px; + top: auto; + width: 1px; + height: 1px; + overflow: hidden; +} + +.skip-link:focus { + position: static; + width: auto; + height: auto; + padding: 0.5rem 1rem; +} diff --git a/src/media/css/template.css b/src/media/css/template.css index 889b8a3..40ffadd 100644 --- a/src/media/css/template.css +++ b/src/media/css/template.css @@ -14233,6 +14233,28 @@ fieldset>* { margin-inline-start: auto; display: flex; align-items: center; + gap: 1em; +} + +.container-brand-aside>* { + flex: 1; + margin: 0.5em 0; +} + +@media (max-width: 991.98px) { + .header-brand-wrap { + flex-direction: column; + align-items: stretch; + } + + .container-brand-aside { + margin-inline-start: 0; + flex-direction: column; + } + + .container-brand-aside>* { + flex: 0 1 auto; + } } .container-header .navbar-brand { @@ -18659,7 +18681,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ flex: 0 0 auto; background-color: var(--color-primary, #112855); color: var(--mainmenu-nav-link-color, #fff); - border-color: var(--color-primary, #112855); + border: 1px solid var(--input-border-color, #3a4250); padding: 0.6rem 1rem; border-radius: 0 0.25rem 0.25rem 0; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; @@ -18668,7 +18690,7 @@ nav[data-toggle=toc] .nav-link.active+ul{ .mod-finder__search.input-group button:hover, .container-search button[type="submit"]:hover { background-color: var(--color-hover, gray); - border-color: var(--color-hover, gray); + border-color: var(--input-border-color, #3a4250); } .mod-finder__search.input-group button:focus, @@ -21637,6 +21659,33 @@ nav[data-toggle=toc] .nav-link.active+ul{ color: var(--gray-600, #48525d); } +/* === mod_stats === */ +.mod_stats__table { + width: 100%; + border-collapse: collapse; +} + +.mod_stats__table tr { + border-bottom: 1px solid var(--border-color, #2b323b); +} + +.mod_stats__table tr:last-child { + border-bottom: none; +} + +.mod_stats__label { + text-align: start; + font-weight: 600; + padding: 0.6rem 1rem 0.6rem 0; + color: var(--body-font-color, #e6ebf1); +} + +.mod_stats__data { + text-align: end; + padding: 0.6rem 0; + color: var(--gray-600, #48525d); +} + /* === Mobile Responsive Adjustments === */ @media (max-width: 575.98px) { .mod-kunena-login__input { diff --git a/src/media/js/template.js b/src/media/js/template.js index 94a6909..7d65301 100644 --- a/src/media/js/template.js +++ b/src/media/js/template.js @@ -641,6 +641,154 @@ }); } + // ======================================================================== + // CSS VARIABLE CLICK-TO-COPY + // ======================================================================== + + /** + * Inject toast + variable-chip styles once. + */ + function injectVarCopyStyles() { + if (doc.getElementById("moko-var-copy-styles")) return; + var style = doc.createElement("style"); + style.id = "moko-var-copy-styles"; + style.textContent = + ".moko-var-chip{cursor:pointer;font-family:var(--font-monospace,monospace);font-size:.875em;" + + "background:var(--secondary-bg,#151b22);color:var(--link-color,#8ab4f8);" + + "border:1px solid var(--border-color,#2b323b);border-radius:.25rem;padding:.1em .4em;" + + "transition:background .15s,border-color .15s;white-space:nowrap;display:inline}" + + ".moko-var-chip:hover{background:var(--color-primary,#112855);color:#fff;border-color:var(--color-primary,#112855)}" + + ".moko-toast{position:fixed;bottom:1.5rem;left:50%;transform:translateX(-50%);z-index:10000;" + + "background:var(--color-primary,#112855);color:#fff;padding:.6rem 1.25rem;" + + "border-radius:.375rem;font-size:.875rem;box-shadow:0 4px 12px rgba(0,0,0,.25);" + + "opacity:0;transition:opacity .2s;pointer-events:none}" + + ".moko-toast--show{opacity:1}"; + doc.head.appendChild(style); + } + + /** + * Show a brief "Copied to clipboard" toast. + * @param {string} text - The variable name that was copied + */ + function showCopyToast(text) { + var existing = doc.querySelector(".moko-toast"); + if (existing) existing.remove(); + + var toast = doc.createElement("div"); + toast.className = "moko-toast"; + toast.textContent = "Copied to clipboard: " + text; + doc.body.appendChild(toast); + + // Trigger reflow then show + void toast.offsetWidth; + toast.classList.add("moko-toast--show"); + + setTimeout(function () { + toast.classList.remove("moko-toast--show"); + setTimeout(function () { toast.remove(); }, 200); + }, 2000); + } + + /** + * Copy text to clipboard and show toast. + * @param {string} text + */ + function copyVariable(text) { + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(text).then(function () { + showCopyToast(text); + }); + } else { + // Fallback for older browsers using deprecated API + var ta = doc.createElement("textarea"); + ta.value = text; + ta.style.cssText = "position:fixed;left:-9999px"; + doc.body.appendChild(ta); + ta.select(); + try { doc.execCommand("copy"); } catch (e) { /* noop */ } + ta.remove(); + showCopyToast(text); + } + } + + /** + * Scan text nodes for CSS variable patterns (--variable-name) and wrap + * each match in a clickable chip that copies the variable to clipboard. + */ + function initVarCopy() { + injectVarCopyStyles(); + + // Pattern: --[a-zA-Z] followed by word/hyphen chars + var varPattern = /--[a-zA-Z][\w-]*/g; + + // Elements to skip (inputs, scripts, styles, already-processed, code editors) + var SKIP_TAGS = { SCRIPT: 1, STYLE: 1, TEXTAREA: 1, INPUT: 1, SELECT: 1, NOSCRIPT: 1 }; + + var walker = doc.createTreeWalker( + doc.body, + NodeFilter.SHOW_TEXT, + { + acceptNode: function (node) { + if (SKIP_TAGS[node.parentNode.tagName]) return NodeFilter.FILTER_REJECT; + if (node.parentNode.classList && node.parentNode.classList.contains("moko-var-chip")) return NodeFilter.FILTER_REJECT; + if (!varPattern.test(node.nodeValue)) return NodeFilter.FILTER_REJECT; + varPattern.lastIndex = 0; + return NodeFilter.FILTER_ACCEPT; + } + } + ); + + var textNodes = []; + while (walker.nextNode()) textNodes.push(walker.currentNode); + + textNodes.forEach(function (node) { + var text = node.nodeValue; + var frag = doc.createDocumentFragment(); + var lastIndex = 0; + var match; + + varPattern.lastIndex = 0; + while ((match = varPattern.exec(text)) !== null) { + // Text before the match + if (match.index > lastIndex) { + frag.appendChild(doc.createTextNode(text.slice(lastIndex, match.index))); + } + + // Clickable chip + var chip = doc.createElement("span"); + chip.className = "moko-var-chip"; + chip.textContent = match[0]; + chip.setAttribute("role", "button"); + chip.setAttribute("tabindex", "0"); + chip.setAttribute("title", "Click to copy " + match[0]); + chip.addEventListener("click", (function (varName) { + return function (e) { + e.preventDefault(); + copyVariable(varName); + }; + })(match[0])); + chip.addEventListener("keydown", (function (varName) { + return function (e) { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + copyVariable(varName); + } + }; + })(match[0])); + frag.appendChild(chip); + + lastIndex = match.index + match[0].length; + } + + // Remaining text after last match + if (lastIndex < text.length) { + frag.appendChild(doc.createTextNode(text.slice(lastIndex))); + } + + node.parentNode.replaceChild(frag, node); + }); + } + /** * Run all template JS initializations */ @@ -667,6 +815,7 @@ initBackTop(); initSearchToggle(); initSidebarAccordion(); + initVarCopy(); } if (doc.readyState === "loading") { diff --git a/src/offline.php b/src/offline.php index 004dabb..196eea3 100644 --- a/src/offline.php +++ b/src/offline.php @@ -38,6 +38,10 @@ $base = rtrim(Uri::root(true), '/') . '/templates/' . $this->template . ' $jsBase = rtrim(Uri::root(true), '/') . '/templates/' . $this->template . '/js/'; $doc->addStyleSheet($base . 'template' . $assetSuffix . '.css', ['version' => 'auto'], ['id' => 'moko-template']); +$doc->addStyleSheet($base . 'offline' . $assetSuffix . '.css', ['version' => 'auto'], ['id' => 'moko-offline']); + +/* Load Osaka font for site title */ +$doc->addStyleSheet($base . 'fonts/osaka.css', ['version' => 'auto'], ['id' => 'moko-font-osaka']); /* Load theme palettes */ $doc->addStyleSheet($base . 'theme/light.standard' . $assetSuffix . '.css', ['version' => 'auto'], ['id' => 'moko-light-standard']); @@ -168,15 +172,6 @@ if (class_exists('\Joomla\Component\Users\Site\Helper\RouteHelper')) { - -
-
- - - - - - - - - - - countModules('offline-header')) : ?> -
- -
- - -
-
+ countModules('offline-header')) : ?> +
+
+ +
+
+
-
- + -
- -
-

-

-
- -
-

-

- -

-
- +
+
+
+
+ + + + + + + - - countModules('offline')) : ?> -
- -
- + +
+

+

+
+ +
+

+

+ +

+
+ - -
-
-

- -

-
-
-
-
- + + countModules('offline')) : ?> +
+ +
+ -
- - -
+ +
+
+

+ +

+
+
+ +
+ -
- - -
+
+ + +
-
- - -
+
+ + +
-
- - -
+
+ + +
-
- -
+
+ + +
- - - - -
+
+ +
-
+ + -
+
  • + +
  • + +
  • + +
  • + + + + +
    +
    -
    +
    diff --git a/src/templateDetails.xml b/src/templateDetails.xml index 1706f11..5499cb6 100644 --- a/src/templateDetails.xml +++ b/src/templateDetails.xml @@ -39,13 +39,13 @@ MokoCassiopeia - 03.09.15 + 03.09.16 script.php - 2026-04-14 + 2026-04-15 Jonathan Miller || Moko Consulting hello@mokoconsulting.tech (C)GNU General Public License Version 3 - 2026 Moko Consulting - Version 03.09.15 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.16 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/updates.xml b/updates.xml index 3fb3a81..76ab8b4 100644 --- a/updates.xml +++ b/updates.xml @@ -1,7 +1,7 @@ @@ -13,12 +13,12 @@ mokocassiopeia template site - 03.09.15 + 03.09.16 2026-04-14 https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/development - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.09.15-dev.zip - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/development/mokocassiopeia-03.09.15-dev.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.09.16-dev.zip + https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/development/mokocassiopeia-03.09.16-dev.zip 310fc79b042a042c0b518a806018011d5243893f239d000224fb197943fee5e3 development @@ -35,12 +35,12 @@ mokocassiopeia template site - 03.09.15 + 03.09.16 2026-04-14 https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/alpha - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/alpha/mokocassiopeia-03.09.15-alpha.zip - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/alpha/mokocassiopeia-03.09.15-alpha.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/alpha/mokocassiopeia-03.09.16-alpha.zip + https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/alpha/mokocassiopeia-03.09.16-alpha.zip c2660acdf7389244462485f7ab4c286e9f851366a148acc16739a184576f7932 alpha @@ -57,12 +57,12 @@ mokocassiopeia template site - 03.09.15 + 03.09.16 2026-04-14 https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/beta - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/beta/mokocassiopeia-03.09.15-beta.zip - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/beta/mokocassiopeia-03.09.15-beta.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/beta/mokocassiopeia-03.09.16-beta.zip + https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/beta/mokocassiopeia-03.09.16-beta.zip 4cbe4fc379182ef17580396e7d12ce4ce95a90017ef364b922bdc2d04b0b3d97 beta @@ -79,12 +79,12 @@ mokocassiopeia template site - 03.09.15 + 03.09.16 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.15-rc.zip - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/release-candidate/mokocassiopeia-03.09.15-rc.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/release-candidate/mokocassiopeia-03.09.16-rc.zip + https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/release-candidate/mokocassiopeia-03.09.16-rc.zip c2660acdf7389244462485f7ab4c286e9f851366a148acc16739a184576f7932 rc @@ -101,12 +101,12 @@ mokocassiopeia template site - 03.09.15 + 03.09.16 2026-04-14 https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/v03 - https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.09.15.zip - https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.09.15.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.09.16.zip + https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.09.16.zip c2660acdf7389244462485f7ab4c286e9f851366a148acc16739a184576f7932 stable