WIP: Bump version to 03.08.00 and add Joomla installation cleanup script #65

Closed
Copilot wants to merge 7 commits from copilot/find-missing-variables into dev/03.08.00
25 changed files with 964 additions and 48 deletions

View File

@@ -9,7 +9,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/css/global/dark/colors_alternative.css
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Alternative dark mode color definitions for Moko-Cassiopeia template
*/

View File

@@ -9,7 +9,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/css/global/dark/colors_standard.css
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Standard dark mode color definitions for Moko-Cassiopeia template
*/
@@ -244,10 +244,308 @@
--focus-ring-opacity: .6;
--focus-ring-color: #5472ff66;
--form-valid-color: #78d694;
--form-valid-border-color: #78d694;
--form-valid-color: var(--green);
--form-valid-border-color: var(--green);
--form-invalid-color: #ff8e86;
--form-invalid-border-color: #ff8e86;
/* Missing variables from template.css - Added for compatibility */
--_fa-family: var(--fa-family, var(--fa-style-family, "Font Awesome 7 Free"));
--accordion-active-bg: #2b323b;
--accordion-active-color: #c7ccff;
--accordion-bg: var(--body-color);
--accordion-body-padding-x: 1.25rem;
--accordion-body-padding-y: 1rem;
--accordion-border-color: var(--border-color);
--accordion-border-radius: 0.25rem;
--accordion-border-width: 1px;
--accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23c7ccff'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
--accordion-btn-bg: var(--accordion-bg);
--accordion-btn-color: var(--body-color);
--accordion-btn-focus-border-color: #5472ff;
--accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(84, 114, 255, 0.6);
--accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23e6ebf1'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
--accordion-btn-icon-transform: rotate(-180deg);
--accordion-btn-icon-transition: transform 0.2s ease-in-out;
--accordion-btn-icon-width: 1.25rem;
--accordion-btn-padding-x: 1.25rem;
--accordion-btn-padding-y: 1rem;
--accordion-color: var(--body-color);
--accordion-inner-border-radius: calc(0.25rem - 1px);
--accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
--alert-bg: #2b323b;
--alert-border: 1px solid var(--alert-border-color);
--alert-border-color: #36404a;
--alert-border-radius: 0.25rem;
--alert-color: var(--body-color);
--alert-margin-bottom: 1rem;
--alert-padding-x: 1rem;
--alert-padding-y: 1rem;
--aspect-ratio: 42.8571428571%;
--backdrop-bg: hsl(0, 0%, 0%);
--backdrop-opacity: 0.5;
--backdrop-zindex: 1040;
--badge-border-radius: 0.25rem;
--badge-color: var(--body-color);
--badge-font-size: 0.75em;
--badge-font-weight: 700;
--badge-padding-x: 0.65em;
--badge-padding-y: 0.35em;
--bg-opacity: 1;
--black-rgb: 0, 0, 0;
--body-text-align: left;
--border-opacity: 1;
--border-radius-sxl: .5rem;
--breadcrumb-bg: ;
--breadcrumb-border-radius: ;
--breadcrumb-divider: "/";
--breadcrumb-divider-color: var(--secondary);
--breadcrumb-font-size: 1rem;
--breadcrumb-item-active-color: var(--link-color);
--breadcrumb-item-padding-x: 0.5rem;
--breadcrumb-margin-bottom: 1rem;
--breadcrumb-padding-x: 0;
--breadcrumb-padding-y: 0;
--bs-body-bg: var(--body-bg);
--bs-border-radius: var(--border-radius);
--btn-active-shadow-rgb: 84, 114, 255;
--btn-disabled-bg: var(--primary);
--btn-focus-bg: transparent;
--btn-focus-border-color: transparent;
--btn-focus-color: var(--btn-color);
--card-bg: var(--body-bg);
--card-border-color: var(--border-color);
--card-border-radius: var(--border-radius);
--card-border-width: var(--border-width);
--card-cap-bg: rgba(255, 255, 255, 0.03);
--card-cap-color: inherit;
--card-cap-padding-x: 1rem;
--card-cap-padding-y: 0.5rem;
--card-color: inherit;
--card-group-margin: 0.75rem;
--card-height: auto;
--card-img-overlay-padding: 1rem;
--card-inner-border-radius: calc(var(--border-radius) - var(--border-width));
--card-spacer-x: 1rem;
--card-spacer-y: 1rem;
--card-title-spacer-y: 0.5rem;
--color-active: var(--mainmenu-nav-link-color);
--color-brand: var(--color-primary);
--container-below-topbar-background-repeat: var(--container-below-topbar-bg-repeat);
--container-below-topbar-bg-color: ;
--container-bottom-a-background-repeat: var(--container-bottom-a-bg-repeat);
--container-bottom-b-background-repeat: var(--container-bottom-b-bg-repeat);
--container-sidebar-background-repeat: var(--container-sidebar-bg-repeat);
--container-top-a-background-repeat: var(--container-top-a-bg-repeat);
--container-top-b-background-repeat: var(--container-top-b-bg-repeat);
--dropdown-bg: var(--dark);
--dropdown-border-color: var(--border-color-translucent);
--dropdown-border-radius: 0.25rem;
--dropdown-border-width: 1px;
--dropdown-color: var(--body-color);
--dropdown-divider-bg: var(--border-color-translucent);
--dropdown-divider-margin-y: 0.5rem;
--dropdown-font-size: 1rem;
--dropdown-header-color: var(--secondary);
--dropdown-header-padding-x: 1rem;
--dropdown-header-padding-y: 0.5rem;
--dropdown-item-padding-x: 1rem;
--dropdown-item-padding-y: 0.25rem;
--dropdown-link-active-bg: var(--primary);
--dropdown-link-active-color: var(--body-color);
--dropdown-link-color: var(--body-color);
--dropdown-link-disabled-color: var(--secondary);
--dropdown-min-width: 10rem;
--dropdown-padding-x: 0;
--dropdown-padding-y: 0.5rem;
--dropdown-spacer: 0.125rem;
--dropdown-zindex: 1000;
--fa-display: inline-block;
--fa-family: var(--fa-style-family, "Font Awesome 7 Free");
--fa-style: 900;
--fa-style-family: "Font Awesome 7 Free";
--fa-width: 1.25em;
--font-family-body: var(--body-font-family);
--font-family-headings: var(--body-font-family);
--font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--font-weight-headings: 700;
--font-weight-normal: 400;
--gab-blue: #6fb7ff;
--gab-gray1: #222831;
--gab-gray2: #2b323b;
--gab-gray3: #36404a;
--gab-green: #78d694;
--gab-orange: #ff9c4d;
--gab-red: #ff7a73;
--gutter-x: 3rem;
--gutter-y: 3rem;
--hue: 220;
--list-group-action-active-bg: var(--primary-bg-subtle);
--list-group-action-active-color: var(--emphasis-color);
--list-group-action-color: var(--body-color);
--list-group-active-bg: var(--primary);
--list-group-active-border-color: var(--primary);
--list-group-active-color: var(--emphasis-color);
--list-group-bg: var(--body-bg);
--list-group-border-color: var(--border-color);
--list-group-border-radius: 0.25rem;
--list-group-border-width: 1px;
--list-group-color: var(--body-color);
--list-group-disabled-bg: var(--body-bg);
--list-group-disabled-color: var(--secondary);
--list-group-item-padding-x: 1rem;
--list-group-item-padding-y: 0.5rem;
--modal-bg: var(--body-bg);
--modal-border-color: var(--border-color-translucent);
--modal-border-radius: 0.3rem;
--modal-border-width: 1px;
--modal-color: ;
--modal-footer-bg: ;
--modal-footer-border-color: var(--border-color);
--modal-footer-border-width: 1px;
--modal-footer-gap: 0.5rem;
--modal-header-border-color: var(--border-color);
--modal-header-border-width: 1px;
--modal-header-padding: 1rem 1rem;
--modal-header-padding-x: 1rem;
--modal-header-padding-y: 1rem;
--modal-inner-border-radius: calc(0.3rem - 1px);
--modal-margin: 1.75rem;
--modal-padding: 1rem;
--modal-title-line-height: 1.5;
--modal-width: 1140px;
--modal-zindex: 1050;
--nav-link-active-color: var(--link-active-color);
--nav-link-color: var(--link-color);
--nav-link-disabled-color: var(--secondary);
--nav-link-font-size: 1rem;
--nav-link-font-weight: ;
--nav-link-padding-x: 1rem;
--nav-link-padding-y: 0.5rem;
--nav-pills-border-radius: 0.25rem;
--nav-pills-link-active-bg: var(--primary);
--nav-pills-link-active-color: var(--emphasis-color);
--nav-tabs-border-color: var(--border-color);
--nav-tabs-border-radius: 0.25rem;
--nav-tabs-border-width: 1px;
--nav-tabs-link-active-bg: var(--body-bg);
--nav-tabs-link-active-border-color: var(--border-color) var(--border-color) var(--body-bg);
--nav-tabs-link-active-color: var(--emphasis-color);
--navbar-active-color: var(--link-active-color);
--navbar-brand-active-color: var(--link-active-color);
--navbar-brand-color: var(--body-color);
--navbar-brand-font-size: 1.25rem;
--navbar-brand-margin-end: 1rem;
--navbar-brand-padding-y: 0.3125rem;
--navbar-color: var(--body-color);
--navbar-nav-link-padding-x: 0.5rem;
--navbar-padding-x: 1rem;
--navbar-padding-y: 0.5rem;
--navbar-toggler-font-size: 1.25rem;
--navbar-toggler-padding-x: 0.75rem;
--navbar-toggler-padding-y: 0.25rem;
--navbar-toggler-transition: box-shadow 0.15s ease-in-out;
--offcanvas-bg: var(--body-bg);
--offcanvas-border-color: var(--border-color-translucent);
--offcanvas-border-width: 0;
--offcanvas-color: ;
--offcanvas-height: auto;
--offcanvas-padding-x: 1rem;
--offcanvas-padding-y: 1rem;
--offcanvas-width: 400px;
--offcanvas-zindex: 1045;
--padding-x: 0.25rem;
--padding-y: 0.25rem;
--pagination-active-bg: var(--primary);
--pagination-active-border-color: var(--primary);
--pagination-active-color: var(--emphasis-color);
--pagination-bg: var(--body-bg);
--pagination-border-color: var(--border-color);
--pagination-border-radius: 0.2rem;
--pagination-border-width: 1px;
--pagination-color: var(--link-color);
--pagination-disabled-bg: var(--body-bg);
--pagination-disabled-border-color: var(--border-color);
--pagination-disabled-color: var(--secondary);
--pagination-focus-bg: var(--secondary-bg);
--pagination-focus-box-shadow: 0 0 0 0.25rem rgba(84, 114, 255, 0.6);
--pagination-focus-color: var(--link-active-color);
--pagination-font-size: 0.875rem;
--pagination-padding-x: 0.5rem;
--pagination-padding-y: 0.25rem;
--popover-arrow-border: var(--popover-border-color);
--popover-arrow-height: 0.5rem;
--popover-arrow-width: 1rem;
--popover-bg: var(--body-bg);
--popover-body-color: var(--body-color);
--popover-body-padding-x: 1rem;
--popover-body-padding-y: 1rem;
--popover-border-color: var(--border-color-translucent);
--popover-border-radius: 0.3rem;
--popover-border-width: 1px;
--popover-font-size: 0.875rem;
--popover-header-bg: var(--secondary-bg);
--popover-header-color: ;
--popover-header-font-size: 1rem;
--popover-header-padding-x: 1rem;
--popover-header-padding-y: 0.5rem;
--popover-inner-border-radius: calc(0.3rem - 1px);
--popover-max-width: 276px;
--popover-zindex: 1060;
--progress-bar-bg: var(--primary);
--progress-bar-color: var(--emphasis-color);
--progress-bar-transition: width 0.6s ease;
--progress-bg: var(--secondary-bg);
--progress-border-radius: 0.25rem;
--progress-font-size: 0.75rem;
--progress-height: 1rem;
--scroll-height: 75vh;
--spinner-animation-name: spinner-grow;
--spinner-animation-speed: 1.5s;
--spinner-border-width: 0.2em;
--spinner-height: 1rem;
--spinner-vertical-align: -0.125em;
--spinner-width: 1rem;
--subhead-btn-accent: #5472ff;
--table-accent-bg: var(--table-active-bg);
--table-active-bg: var(--secondary-bg);
--table-active-color: var(--emphasis-color);
--table-bg: var(--body-bg);
--table-border-color: var(--border-color);
--table-color: var(--body-color);
--table-striped-bg: var(--secondary-bg);
--table-striped-color: var(--body-color);
--template-bg-dark-80: hsl(var(--hue), 40%, 20%);
--template-bg-light: var(--body-bg);
--text-opacity: 1;
--toast-bg: rgba(21, 27, 34, 0.85);
--toast-border-color: var(--border-color-translucent);
--toast-border-radius: 0.25rem;
--toast-border-width: 1px;
--toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--toast-color: ;
--toast-font-size: 0.875rem;
--toast-header-bg: rgba(21, 27, 34, 0.85);
--toast-header-border-color: var(--border-color);
--toast-header-color: var(--secondary-text-emphasis);
--toast-max-width: 350px;
--toast-padding-x: 0.75rem;
--toast-padding-y: 0.5rem;
--toast-spacing: 1em;
--toast-zindex: 1090;
--tooltip-arrow-height: 0.4rem;
--tooltip-arrow-width: 0.8rem;
--tooltip-bg: hsl(0, 0%, 0%);
--tooltip-border-radius: 0.25rem;
--tooltip-color: var(--emphasis-color);
--tooltip-font-size: 0.875rem;
--tooltip-margin: ;
--tooltip-max-width: 200px;
--tooltip-opacity: 0.9;
--tooltip-padding-x: 0.5rem;
--tooltip-padding-y: 0.25rem;
--tooltip-zindex: 1070;
--white-rgb: 255, 255, 255;
}
.btn {

View File

@@ -9,7 +9,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/css/global/light/colors_alternative.css
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Alternative light mode color definitions for Moko-Cassiopeia template
*/

View File

@@ -9,7 +9,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/css/global/light/colors_standard.css
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Standard light mode color definitions for Moko-Cassiopeia template
*/
@@ -94,7 +94,7 @@
--nav-bg-color: var(--color-link);
--border: 5px;
--muted-color: #6d757e;
--muted-color: var(--secondary);
--hr-color: var(--border-color, #dfe3e7);
--link-active-color: var(--link-color);
--code-color-ink: var(--code-color, #e93f8e);
@@ -126,7 +126,7 @@
--gray-600: #6d757e;
--gray-700: #484f56;
--gray-800: #353b41;
--gray-900: #22262a;
--gray-900: var(--body-color);
--primary: #010156;
--secondary: #6d757e;
--success: #448344;
@@ -197,7 +197,7 @@
--link-hover-color: #424077;
--link-hover-color-rgb: 66, 64, 119;
--code-color: #e93f8e;
--highlight-color: #22262a;
--highlight-color: var(--body-color);
--highlight-bg: #fbeea8;
--border-width: 1px;
--border-style: solid;
@@ -217,10 +217,304 @@
--focus-ring-width: .25rem;
--focus-ring-opacity: .25;
--focus-ring-color: #01015640;
--form-valid-color: #448344;
--form-valid-border-color: #448344;
--form-invalid-color: #a51f18;
--form-invalid-border-color: #a51f18;
--form-valid-color: var(--success);
--form-valid-border-color: var(--success);
--form-invalid-color: var(--danger);
--form-invalid-border-color: var(--danger);
/* Missing variables from template.css - Added for compatibility */
--_fa-family: var(--fa-family, var(--fa-style-family, "Font Awesome 7 Free"));
--accordion-active-bg: #e7eaee;
--accordion-active-color: #0f244d;
--accordion-bg: var(--body-color);
--accordion-body-padding-x: 1.25rem;
--accordion-body-padding-y: 1rem;
--accordion-border-color: var(--border-color);
--accordion-border-radius: 0.25rem;
--accordion-border-width: 1px;
--accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230f244d'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
--accordion-btn-bg: var(--accordion-bg);
--accordion-btn-color: hsl(210, 11%, 15%);
--accordion-btn-focus-border-color: #8894aa;
--accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(1, 1, 86, 0.25);
--accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='hsl%28210, 11%, 15%%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
--accordion-btn-icon-transform: rotate(-180deg);
--accordion-btn-icon-transition: transform 0.2s ease-in-out;
--accordion-btn-icon-width: 1.25rem;
--accordion-btn-padding-x: 1.25rem;
--accordion-btn-padding-y: 1rem;
--accordion-color: hsl(210, 11%, 15%);
--accordion-inner-border-radius: calc(0.25rem - 1px);
--accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
--alert-bg: #d7d8d9;
--alert-border: 1px solid var(--alert-border-color);
--alert-border-color: #c2c4c6;
--alert-border-radius: 0.25rem;
--alert-color: #202327;
--alert-margin-bottom: 1rem;
--alert-padding-x: 1rem;
--alert-padding-y: 1rem;
--aspect-ratio: 42.8571428571%;
--backdrop-bg: hsl(0, 0%, 0%);
--backdrop-opacity: 0.5;
--backdrop-zindex: 1040;
--badge-border-radius: 0.25rem;
--badge-color: var(--body-color);
--badge-font-size: 0.75em;
--badge-font-weight: 700;
--badge-padding-x: 0.65em;
--badge-padding-y: 0.35em;
--bg-opacity: 1;
--body-text-align: left;
--border-opacity: 1;
--border-radius-sxl: .5rem;
--breadcrumb-bg: ;
--breadcrumb-border-radius: ;
--breadcrumb-divider: "/";
--breadcrumb-divider-color: hsl(210, 7%, 46%);
--breadcrumb-font-size: 1rem;
--breadcrumb-item-active-color: var(--link-color);
--breadcrumb-item-padding-x: 0.5rem;
--breadcrumb-margin-bottom: 1rem;
--breadcrumb-padding-x: 0;
--breadcrumb-padding-y: 0;
--bs-body-bg: var(--body-bg);
--bs-border-radius: var(--border-radius);
--btn-active-shadow-rgb: 1, 1, 86;
--btn-focus-bg: transparent;
--btn-focus-border-color: transparent;
--btn-focus-color: var(--btn-color);
--card-bg: var(--body-bg);
--card-border-color: var(--border-color);
--card-border-radius: var(--border-radius);
--card-border-width: var(--border-width);
--card-cap-bg: rgba(0, 0, 0, 0.03);
--card-cap-color: inherit;
--card-cap-padding-x: 1rem;
--card-cap-padding-y: 0.5rem;
--card-color: inherit;
--card-group-margin: 0.75rem;
--card-height: auto;
--card-img-overlay-padding: 1rem;
--card-inner-border-radius: calc(var(--border-radius) - var(--border-width));
--card-spacer-x: 1rem;
--card-spacer-y: 1rem;
--card-title-spacer-y: 0.5rem;
--color-active: var(--color-hover);
--color-brand: var(--color-primary);
--container-below-topbar-background-repeat: var(--container-below-topbar-bg-repeat);
--container-below-topbar-bg-color: ;
--container-bottom-a-background-repeat: var(--container-bottom-a-bg-repeat);
--container-bottom-b-background-repeat: var(--container-bottom-b-bg-repeat);
--container-sidebar-background-repeat: var(--container-sidebar-bg-repeat);
--container-top-a-background-repeat: var(--container-top-a-bg-repeat);
--container-top-b-background-repeat: var(--container-top-b-bg-repeat);
--dropdown-bg: hsl(210, 10%, 23%);
--dropdown-border-color: var(--border-color-translucent);
--dropdown-border-radius: 0.25rem;
--dropdown-border-width: 1px;
--dropdown-color: hsl(210, 14%, 89%);
--dropdown-divider-bg: var(--border-color-translucent);
--dropdown-divider-margin-y: 0.5rem;
--dropdown-font-size: 1rem;
--dropdown-header-color: hsl(210, 11%, 71%);
--dropdown-header-padding-x: 1rem;
--dropdown-header-padding-y: 0.5rem;
--dropdown-item-padding-x: 1rem;
--dropdown-item-padding-y: 0.25rem;
--dropdown-link-active-bg: var(--primary);
--dropdown-link-active-color: var(--body-color);
--dropdown-link-color: hsl(210, 14%, 89%);
--dropdown-link-disabled-color: hsl(210, 11%, 71%);
--dropdown-min-width: 10rem;
--dropdown-padding-x: 0;
--dropdown-padding-y: 0.5rem;
--dropdown-spacer: 0.125rem;
--dropdown-zindex: 1000;
--fa-display: inline-block;
--fa-family: var(--fa-style-family, "Font Awesome 7 Free");
--fa-style: 900;
--fa-style-family: "Font Awesome 7 Free";
--fa-width: 1.25em;
--font-family-body: var(--body-font-family);
--font-family-headings: var(--body-font-family);
--font-weight-headings: 700;
--font-weight-normal: 400;
--gab-blue: #0066cc;
--gab-gray1: #f5f5f5;
--gab-gray2: #e0e0e0;
--gab-gray3: #bdbdbd;
--gab-green: #4caf50;
--gab-orange: #ff9800;
--gab-red: #f44336;
--gutter-x: 3rem;
--gutter-y: 3rem;
--hue: 220;
--list-group-action-active-bg: hsl(210, 16%, 93%);
--list-group-action-active-color: hsl(210, 11%, 15%);
--list-group-action-color: hsl(210, 9%, 31%);
--list-group-active-bg: var(--primary);
--list-group-active-border-color: var(--primary);
--list-group-active-color: var(--body-color);
--list-group-bg: var(--body-color);
--list-group-border-color: rgba(0, 0, 0, 0.125);
--list-group-border-radius: 0.25rem;
--list-group-border-width: 1px;
--list-group-color: hsl(210, 11%, 15%);
--list-group-disabled-bg: var(--body-color);
--list-group-disabled-color: hsl(210, 7%, 46%);
--list-group-item-padding-x: 1rem;
--list-group-item-padding-y: 0.5rem;
--modal-bg: var(--body-color);
--modal-border-color: var(--border-color-translucent);
--modal-border-radius: 0.3rem;
--modal-border-width: 1px;
--modal-color: ;
--modal-footer-bg: ;
--modal-footer-border-color: var(--border-color);
--modal-footer-border-width: 1px;
--modal-footer-gap: 0.5rem;
--modal-header-border-color: var(--border-color);
--modal-header-border-width: 1px;
--modal-header-padding: 1rem 1rem;
--modal-header-padding-x: 1rem;
--modal-header-padding-y: 1rem;
--modal-inner-border-radius: calc(0.3rem - 1px);
--modal-margin: 1.75rem;
--modal-padding: 1rem;
--modal-title-line-height: 1.5;
--modal-width: 1140px;
--modal-zindex: 1050;
--nav-link-active-color: var(--link-active-color);
--nav-link-color: var(--link-color);
--nav-link-disabled-color: hsl(210, 7%, 46%);
--nav-link-font-size: 1rem;
--nav-link-font-weight: ;
--nav-link-padding-x: 1rem;
--nav-link-padding-y: 0.5rem;
--nav-pills-border-radius: 0.25rem;
--nav-pills-link-active-bg: var(--primary);
--nav-pills-link-active-color: var(--body-color);
--nav-tabs-border-color: hsl(210, 14%, 89%);
--nav-tabs-border-radius: 0.25rem;
--nav-tabs-border-width: 1px;
--nav-tabs-link-active-bg: var(--body-color);
--nav-tabs-link-active-border-color: hsl(210, 14%, 89%) hsl(210, 14%, 89%) var(--body-color);
--nav-tabs-link-active-color: hsl(210, 9%, 31%);
--navbar-active-color: var(--link-active-color);
--navbar-brand-active-color: var(--link-active-color);
--navbar-brand-color: var(--body-color);
--navbar-brand-font-size: 1.25rem;
--navbar-brand-margin-end: 1rem;
--navbar-brand-padding-y: 0.3125rem;
--navbar-color: var(--body-color);
--navbar-nav-link-padding-x: 0.5rem;
--navbar-padding-x: 1rem;
--navbar-padding-y: 0.5rem;
--navbar-toggler-font-size: 1.25rem;
--navbar-toggler-padding-x: 0.75rem;
--navbar-toggler-padding-y: 0.25rem;
--navbar-toggler-transition: box-shadow 0.15s ease-in-out;
--offcanvas-bg: var(--body-color);
--offcanvas-border-color: var(--border-color-translucent);
--offcanvas-border-width: 0;
--offcanvas-color: ;
--offcanvas-height: auto;
--offcanvas-padding-x: 1rem;
--offcanvas-padding-y: 1rem;
--offcanvas-width: 400px;
--offcanvas-zindex: 1045;
--padding-x: 0.25rem;
--padding-y: 0.25rem;
--pagination-active-bg: var(--primary);
--pagination-active-border-color: var(--primary);
--pagination-active-color: var(--body-color);
--pagination-bg: var(--body-color);
--pagination-border-color: hsl(210, 14%, 89%);
--pagination-border-radius: 0.2rem;
--pagination-border-width: 1px;
--pagination-color: var(--link-color);
--pagination-disabled-bg: var(--body-color);
--pagination-disabled-border-color: hsl(210, 14%, 89%);
--pagination-disabled-color: hsl(210, 7%, 46%);
--pagination-focus-bg: hsl(210, 16%, 93%);
--pagination-focus-box-shadow: 0 0 0 0.25rem rgba(1, 1, 86, 0.25);
--pagination-focus-color: var(--link-active-color);
--pagination-font-size: 0.875rem;
--pagination-padding-x: 0.5rem;
--pagination-padding-y: 0.25rem;
--popover-arrow-border: var(--popover-border-color);
--popover-arrow-height: 0.5rem;
--popover-arrow-width: 1rem;
--popover-bg: var(--body-color);
--popover-body-color: hsl(210, 11%, 15%);
--popover-body-padding-x: 1rem;
--popover-body-padding-y: 1rem;
--popover-border-color: var(--border-color-translucent);
--popover-border-radius: 0.3rem;
--popover-border-width: 1px;
--popover-font-size: 0.875rem;
--popover-header-bg: #f0f0f0;
--popover-header-color: ;
--popover-header-font-size: 1rem;
--popover-header-padding-x: 1rem;
--popover-header-padding-y: 0.5rem;
--popover-inner-border-radius: calc(0.3rem - 1px);
--popover-max-width: 276px;
--popover-zindex: 1060;
--progress-bar-bg: var(--primary);
--progress-bar-color: var(--body-color);
--progress-bar-transition: width 0.6s ease;
--progress-bg: hsl(210, 16%, 93%);
--progress-border-radius: 0.25rem;
--progress-font-size: 0.75rem;
--progress-height: 1rem;
--scroll-height: 75vh;
--spinner-animation-name: spinner-grow;
--spinner-animation-speed: 1.5s;
--spinner-border-width: 0.2em;
--spinner-height: 1rem;
--spinner-vertical-align: -0.125em;
--spinner-width: 1rem;
--subhead-btn-accent: #132f53;
--table-accent-bg: var(--table-active-bg);
--table-active-bg: #444a4f;
--table-active-color: var(--body-color);
--table-bg: hsl(210, 10%, 23%);
--table-border-color: #494f54;
--table-color: var(--body-color);
--table-striped-bg: #3f454b;
--table-striped-color: var(--body-color);
--template-bg-dark-80: hsl(var(--hue), 40%, 20%);
--template-bg-light: #f0f4fb;
--text-opacity: 1;
--toast-bg: rgba(255, 255, 255, 0.85);
--toast-border-color: var(--border-color-translucent);
--toast-border-radius: 0.25rem;
--toast-border-width: 1px;
--toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--toast-color: ;
--toast-font-size: 0.875rem;
--toast-header-bg: rgba(255, 255, 255, 0.85);
--toast-header-border-color: rgba(0, 0, 0, 0.05);
--toast-header-color: hsl(210, 7%, 46%);
--toast-max-width: 350px;
--toast-padding-x: 0.75rem;
--toast-padding-y: 0.5rem;
--toast-spacing: 1em;
--toast-zindex: 1090;
--tooltip-arrow-height: 0.4rem;
--tooltip-arrow-width: 0.8rem;
--tooltip-bg: hsl(0, 0%, 0%);
--tooltip-border-radius: 0.25rem;
--tooltip-color: var(--body-color);
--tooltip-font-size: 0.875rem;
--tooltip-margin: ;
--tooltip-max-width: 200px;
--tooltip-opacity: 0.9;
--tooltip-padding-x: 0.5rem;
--tooltip-padding-y: 0.25rem;
--tooltip-zindex: 1070;
}
.btn {
@@ -266,8 +560,8 @@
.btn-primary {
--btn-color: hsl(0, 0%, 100%);
--btn-bg: hsl(240, 98%, 17%);
--btn-border-color: hsl(240, 98%, 17%);
--btn-bg: var(--primary);
--btn-border-color: var(--primary);
--btn-hover-color: hsl(0, 0%, 100%);
--btn-hover-bg: #010149;
--btn-hover-border-color: #010145;
@@ -277,8 +571,8 @@
--btn-active-border-color: #010141;
--btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--btn-disabled-color: hsl(0, 0%, 100%);
--btn-disabled-bg: hsl(240, 98%, 17%);
--btn-disabled-border-color: hsl(240, 98%, 17%);
--btn-disabled-bg: var(--primary);
--btn-disabled-border-color: var(--primary);
}
.btn-secondary {
@@ -401,19 +695,19 @@
}
.btn-outline-primary {
--btn-color: hsl(240, 98%, 17%);
--btn-border-color: hsl(240, 98%, 17%);
--btn-color: var(--primary);
--btn-border-color: var(--primary);
--btn-hover-color: hsl(0, 0%, 100%);
--btn-hover-bg: hsl(240, 98%, 17%);
--btn-hover-border-color: hsl(240, 98%, 17%);
--btn-hover-bg: var(--primary);
--btn-hover-border-color: var(--primary);
--btn-focus-shadow-rgb: 1, 1, 86;
--btn-active-color: hsl(0, 0%, 100%);
--btn-active-bg: hsl(240, 98%, 17%);
--btn-active-border-color: hsl(240, 98%, 17%);
--btn-active-bg: var(--primary);
--btn-active-border-color: var(--primary);
--btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--btn-disabled-color: hsl(240, 98%, 17%);
--btn-disabled-color: var(--primary);
--btn-disabled-bg: transparent;
--btn-disabled-border-color: hsl(240, 98%, 17%);
--btn-disabled-border-color: var(--primary);
--gradient: none;
}

View File

@@ -9,7 +9,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/css/editor.css
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Stylesheet for Joomla editor content within Moko-Cassiopeia template
*/

View File

@@ -9,7 +9,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/css/system/searchtools/searchtools.css
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Stylesheet for Joomla search tools integration in Moko-Cassiopeia template
*/

View File

@@ -9,7 +9,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/css/template-rtl.css
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Right-to-left (RTL) layout stylesheet for Moko-Cassiopeia template
*/

View File

@@ -9,7 +9,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/css/template.css
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Main stylesheet providing layout, typography, and component styles for Moko-Cassiopeia
*/

View File

@@ -8,7 +8,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/js/darkmode-toggle.js
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: JavaScript logic for dark mode toggle functionality in Moko-Cassiopeia
*/

View File

@@ -8,7 +8,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/js/mod_menu/menu-metismenu-es5.js
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: ES5-compatible MetisMenu script for Joomla mod_menu in Moko-Cassiopeia
*/

View File

@@ -8,7 +8,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/js/mod_menu/menu-metismenu.js
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Modern MetisMenu script for Joomla mod_menu in Moko-Cassiopeia
*/

View File

@@ -8,7 +8,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/js/template.js
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Core JavaScript utilities and behaviors for Moko-Cassiopeia template
*/
!function(a){"use strict";window.Toc={helpers:{findOrFilter:function(e,t){var n=e.find(t);return e.filter(t).add(n).filter(":not([data-toc-skip])")},generateUniqueIdBase:function(e){return a(e).text().trim().replace(/\'/gi,"").replace(/[& +$,:;=?@"#{}|^~[`%!'<>\]\.\/\(\)\*\\\n\t\b\v]/g,"-").replace(/-{2,}/g,"-").substring(0,64).replace(/^-+|-+$/gm,"").toLowerCase()||e.tagName.toLowerCase()},generateUniqueId:function(e){for(var t=this.generateUniqueIdBase(e),n=0;;n++){var r=t;if(0<n&&(r+="-"+n),!document.getElementById(r))return r}},generateAnchor:function(e){if(e.id)return e.id;var t=this.generateUniqueId(e);return e.id=t},createNavList:function(){return a('<ul class="nav navbar-nav"></ul>')},createChildNavList:function(e){var t=this.createNavList();return e.append(t),t},generateNavEl:function(e,t){var n=a('<a class="nav-link"></a>');n.attr("href","#"+e),n.text(t);var r=a("<li></li>");return r.append(n),r},generateNavItem:function(e){var t=this.generateAnchor(e),n=a(e),r=n.data("toc-text")||n.text();return this.generateNavEl(t,r)},getTopLevel:function(e){for(var t=1;t<=6;t++){if(1<this.findOrFilter(e,"h"+t).length)return t}return 1},getHeadings:function(e,t){var n="h"+t,r="h"+(t+1);return this.findOrFilter(e,n+","+r)},getNavLevel:function(e){return parseInt(e.tagName.charAt(1),10)},populateNav:function(r,a,e){var i,s=r,c=this;e.each(function(e,t){var n=c.generateNavItem(t);c.getNavLevel(t)===a?s=r:i&&s===r&&(s=c.createChildNavList(i)),s.append(n),i=n})},parseOps:function(e){var t;return(t=e.jquery?{$nav:e}:e).$scope=t.$scope||a(document.body),t}},init:function(e){(e=this.helpers.parseOps(e)).$nav.attr("data-toggle","toc");var t=this.helpers.createChildNavList(e.$nav),n=this.helpers.getTopLevel(e.$scope),r=this.helpers.getHeadings(e.$scope,n);this.helpers.populateNav(t,n,r)}},a(function(){a('nav[data-toggle="toc"]').each(function(e,t){var n=a(t);Toc.init(n)})})}(jQuery);

View File

@@ -8,7 +8,7 @@
DEFGROUP: Joomla.Template.Site
INGROUP: Moko-Cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/js/theme-init.js
VERSION: 03.05.00
VERSION: 03.08.00
BRIEF: Initialization script for Moko-Cassiopeia theme features and behaviors
*/

View File

@@ -16,6 +16,6 @@
INGROUP: Moko-Cassiopeia
REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia
PATH: ./media/templates/site/moko-cassiopeia/js/user.js
VERSION: 03.00.00
VERSION: 03.08.00
BRIEF: JavaScript for handling user-specific interactions in Moko-Cassiopeia template
*/

View File

@@ -10,7 +10,7 @@
INGROUP: Moko-Cassiopeia
REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia
PATH: ./templates/moko-cassiopeia/component.php
VERSION: 03.06.00
VERSION: 03.08.00
BRIEF: Main template index file for Moko-Cassiopeia rendering site layout
*/

View File

@@ -10,7 +10,7 @@
INGROUP: Moko-Cassiopeia
REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia
PATH: ./templates/moko-cassiopeia/custom.php
VERSION: 03.06.00
VERSION: 03.08.00
BRIEF: Custom entry template file for Moko-Cassiopeia with user-defined overrides
*/

View File

@@ -10,7 +10,7 @@
INGROUP: Moko-Cassiopeia
REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia
PATH: ./templates/moko-cassiopeia/error.php
VERSION: 03.06.00
VERSION: 03.08.00
BRIEF: Error page template file for Moko-Cassiopeia
*/

View File

@@ -10,7 +10,7 @@
INGROUP: Moko-Cassiopeia
REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia
PATH: ./templates/moko-cassiopeia/html/com_content/article/toc-left.php
VERSION: 03.06.00
VERSION: 03.08.00
BRIEF: Template override for Joomla articles with Table of Contents aligned left
*/

View File

@@ -10,7 +10,7 @@
INGROUP: Moko-Cassiopeia
REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia
PATH: ./templates/moko-cassiopeia/html/com_content/article/toc-right.php
VERSION: 03.06.00
VERSION: 03.08.00
BRIEF: Template override for Joomla articles with Table of Contents aligned right
*/

View File

@@ -10,7 +10,7 @@
INGROUP: Moko-Cassiopeia
REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia
PATH: ./templates/moko-cassiopeia/index.php
VERSION: 03.06.00
VERSION: 03.08.00
BRIEF: Main template index file for Moko-Cassiopeia rendering site layout
*/

View File

@@ -17,7 +17,7 @@
"defgroup": "Joomla.Template.Site",
"ingroup": "Moko-Cassiopeia.Template.Assets",
"path": "./media/templates/site/moko-cassiopeia/joomla.asset.json",
"version": "03.06.00",
"version": "03.08.00",
"brief": "Joomla asset registry for Moko-Cassiopeia"
}
},

View File

@@ -10,7 +10,7 @@
INGROUP: Moko-Cassiopeia
REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia
PATH: ./templates/moko-cassiopeia/offline.php
VERSION: 03.06.00
VERSION: 03.08.00
BRIEF: Offline page template file for Moko-Cassiopeia
*/

324
src/templates/script.php Normal file
View File

@@ -0,0 +1,324 @@
<?php
/**
* @package Joomla.Site
* @subpackage Templates.moko-cassiopeia
*
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
* @license GNU General Public License version 3 or later; see LICENSE.txt
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
* FILE INFORMATION
* DEFGROUP: Joomla.Template.Site
* INGROUP: Moko-Cassiopeia
* PATH: ./templates/moko-cassiopeia/script.php
* VERSION: 03.08.00
* BRIEF: Installation and update script for Moko-Cassiopeia template
*/
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Joomla\CMS\Installer\InstallerAdapter;
use Joomla\CMS\Installer\InstallerScriptInterface;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Log\Log;
/**
* Installation script for Moko-Cassiopeia template
*
* @since 03.08.00
*/
return new class () implements InstallerScriptInterface {
/**
* The template's minimum supported Joomla version
*
* @var string
* @since 03.08.00
*/
private $minimumJoomla = '4.0';
/**
* The template's minimum supported PHP version
*
* @var string
* @since 03.08.00
*/
private $minimumPhp = '7.4';
/**
* List of files to be removed during update (old/deprecated files)
*
* @var array
* @since 03.08.00
*/
private $filesToRemove = [
// Add deprecated files here as needed
// Example: 'media/templates/site/moko-cassiopeia/js/old-script.js',
];
/**
* List of folders to be removed during update (old/deprecated folders)
*
* @var array
* @since 03.08.00
*/
private $foldersToRemove = [
// Add deprecated folders here as needed
// Example: 'media/templates/site/moko-cassiopeia/old-assets',
];
/**
* Function called before extension installation/update/removal procedure commences
*
* @param string $type The type of change (install or discover_install, update, uninstall)
* @param InstallerAdapter $parent The class calling this method
*
* @return boolean True on success
*
* @since 03.08.00
*/
public function preflight(string $type, InstallerAdapter $parent): bool
{
// Check minimum Joomla version
if (version_compare(JVERSION, $this->minimumJoomla, '<')) {
Factory::getApplication()->enqueueMessage(
sprintf(
Text::_('JLIB_INSTALLER_MINIMUM_JOOMLA'),
$this->minimumJoomla
),
'error'
);
return false;
}
// Check minimum PHP version
if (version_compare(PHP_VERSION, $this->minimumPhp, '<')) {
Factory::getApplication()->enqueueMessage(
sprintf(
Text::_('JLIB_INSTALLER_MINIMUM_PHP'),
$this->minimumPhp
),
'error'
);
return false;
}
return true;
}
/**
* Function called after extension installation/update/removal procedure completes
*
* @param string $type The type of change (install or discover_install, update, uninstall)
* @param InstallerAdapter $parent The class calling this method
*
* @return boolean True on success
*
* @since 03.08.00
*/
public function postflight(string $type, InstallerAdapter $parent): bool
{
// Only run cleanup on update
if ($type === 'update') {
$this->cleanupMediaFolder();
}
// Display success message
if ($type === 'install') {
Factory::getApplication()->enqueueMessage(
'Moko-Cassiopeia template has been successfully installed!',
'success'
);
} elseif ($type === 'update') {
Factory::getApplication()->enqueueMessage(
'Moko-Cassiopeia template has been successfully updated to version 03.08.00!',
'success'
);
}
return true;
}
/**
* Function called when extension is installed
*
* @param InstallerAdapter $parent The class calling this method
*
* @return boolean True on success
*
* @since 03.08.00
*/
public function install(InstallerAdapter $parent): bool
{
return true;
}
/**
* Function called when extension is updated
*
* @param InstallerAdapter $parent The class calling this method
*
* @return boolean True on success
*
* @since 03.08.00
*/
public function update(InstallerAdapter $parent): bool
{
return true;
}
/**
* Function called when extension is uninstalled
*
* @param InstallerAdapter $parent The class calling this method
*
* @return boolean True on success
*
* @since 03.08.00
*/
public function uninstall(InstallerAdapter $parent): bool
{
return true;
}
/**
* Clean up the media folder by removing old and deprecated files
*
* @return void
*
* @since 03.08.00
*/
private function cleanupMediaFolder(): void
{
$app = Factory::getApplication();
$mediaPath = JPATH_ROOT . '/media/templates/site/moko-cassiopeia';
$removedFiles = 0;
$removedFolders = 0;
$errors = [];
// Set up logging
Log::addLogger(
['text_file' => 'moko_cassiopeia_cleanup.php'],
Log::ALL,
['moko-cassiopeia-cleanup']
);
Log::add('Starting media folder cleanup', Log::INFO, 'moko-cassiopeia-cleanup');
// Remove deprecated files
foreach ($this->filesToRemove as $file) {
$filePath = JPATH_ROOT . '/' . $file;
if (File::exists($filePath)) {
try {
if (File::delete($filePath)) {
$removedFiles++;
Log::add("Removed file: {$file}", Log::INFO, 'moko-cassiopeia-cleanup');
} else {
$errors[] = "Failed to remove file: {$file}";
Log::add("Failed to remove file: {$file}", Log::WARNING, 'moko-cassiopeia-cleanup');
}
} catch (\Exception $e) {
$errors[] = "Error removing file {$file}: " . $e->getMessage();
Log::add("Error removing file {$file}: " . $e->getMessage(), Log::ERROR, 'moko-cassiopeia-cleanup');
}
}
}
// Remove deprecated folders
foreach ($this->foldersToRemove as $folder) {
$folderPath = JPATH_ROOT . '/' . $folder;
if (Folder::exists($folderPath)) {
try {
if (Folder::delete($folderPath)) {
$removedFolders++;
Log::add("Removed folder: {$folder}", Log::INFO, 'moko-cassiopeia-cleanup');
} else {
$errors[] = "Failed to remove folder: {$folder}";
Log::add("Failed to remove folder: {$folder}", Log::WARNING, 'moko-cassiopeia-cleanup');
}
} catch (\Exception $e) {
$errors[] = "Error removing folder {$folder}: " . $e->getMessage();
Log::add("Error removing folder {$folder}: " . $e->getMessage(), Log::ERROR, 'moko-cassiopeia-cleanup');
}
}
}
// Clean up empty directories in media folder
if (is_dir($mediaPath)) {
$this->removeEmptyDirectories($mediaPath);
}
// Display cleanup summary
if ($removedFiles > 0 || $removedFolders > 0) {
$message = sprintf(
'Media folder cleanup: Removed %d file(s) and %d folder(s).',
$removedFiles,
$removedFolders
);
$app->enqueueMessage($message, 'info');
Log::add($message, Log::INFO, 'moko-cassiopeia-cleanup');
}
// Display errors if any
foreach ($errors as $error) {
$app->enqueueMessage($error, 'warning');
}
Log::add('Media folder cleanup completed', Log::INFO, 'moko-cassiopeia-cleanup');
}
/**
* Recursively remove empty directories
*
* @param string $path The directory path to check
*
* @return boolean True if directory was removed, false otherwise
*
* @since 03.08.00
*/
private function removeEmptyDirectories(string $path): bool
{
if (!is_dir($path)) {
return false;
}
$empty = true;
$items = glob($path . '/{,.}*', GLOB_BRACE);
foreach ($items as $item) {
$basename = basename($item);
// Skip . and ..
if ($basename === '.' || $basename === '..') {
continue;
}
if (is_dir($item)) {
if (!$this->removeEmptyDirectories($item)) {
$empty = false;
}
} else {
$empty = false;
}
}
// Remove directory if it's empty
if ($empty && $path !== JPATH_ROOT . '/media/templates/site/moko-cassiopeia') {
try {
if (Folder::delete($path)) {
Log::add("Removed empty directory: {$path}", Log::INFO, 'moko-cassiopeia-cleanup');
return true;
}
} catch (\Exception $e) {
Log::add("Error removing empty directory {$path}: " . $e->getMessage(), Log::WARNING, 'moko-cassiopeia-cleanup');
}
}
return $empty;
}
};

View File

@@ -11,7 +11,7 @@
DEFGROUP: Joomla
INGROUP: Moko-Cassiopeia
PATH: templates/moko-cassiopeia/templateDetails.xml
VERSION: 03.06.00
VERSION: 03.08.00
BRIEF: Template manifest XML file for Moko-Cassiopeia
=========================================================================
-->
@@ -22,7 +22,7 @@
</server>
</updateservers>
<name>moko-cassiopeia</name>
<version>03.06.00</version>
<version>03.08.00</version>
<creationDate>2025-12-23</creationDate>
<author>Jonathan Miller || Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail>
@@ -206,7 +206,7 @@
<option value="0">JNO</option>
<option value="1">JYES</option>
</field>
<field name="logoFile" type="media" default="media/templates/site/moko-cassiopeia/images/logo.svg" label="TPL_MOKO-CASSIOPEIA_LOGO_LABEL" showon="brand:1" />
<field name="logoFile" type="media" label="TPL_MOKO-CASSIOPEIA_LOGO_LABEL" showon="brand:1" />
<field name="siteTitle" type="text" default="" label="TPL_MOKO-CASSIOPEIA_TITLE" filter="string" showon="brand:1" />
<field name="siteDescription" type="text" default="" label="TPL_MOKO-CASSIOPEIA_TAGLINE_LABEL" description="TPL_MOKO-CASSIOPEIA_TAGLINE_DESC" filter="string" showon="brand:1" />
<field name="fA6KitCode" type="text" default="" label="TPL_MOKO-CASSIOPEIA_FA6KITCODE_LABEL" description="TPL_MOKO-CASSIOPEIA_FA6KITCODE_DESC" filter="string" />

View File

@@ -10,7 +10,7 @@
INGROUP: Moko-Cassiopeia
REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia
PATH: ./updates.xml
VERSION: 03.06.00
VERSION: 03.08.00
BRIEF: Update manifest XML file for Moko-Cassiopeia
-->
@@ -22,7 +22,7 @@
<type>template</type>
<client>site</client>
<version>03.06.00</version>
<version>03.08.00</version>
<creationDate>2025-12-12</creationDate>
<author>Jonathan Miller || Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail>