├── sass
├── bootstrap
│ ├── helpers
│ │ ├── _clearfix.scss
│ │ ├── _text-truncation.scss
│ │ ├── _visually-hidden.scss
│ │ ├── _vr.scss
│ │ ├── _stretched-link.scss
│ │ ├── _stacks.scss
│ │ ├── _color-bg.scss
│ │ ├── _colored-links.scss
│ │ ├── _ratio.scss
│ │ └── _position.scss
│ ├── mixins
│ │ ├── _clearfix.scss
│ │ ├── _lists.scss
│ │ ├── _color-scheme.scss
│ │ ├── _text-truncate.scss
│ │ ├── _resize.scss
│ │ ├── _banner.scss
│ │ ├── _backdrop.scss
│ │ ├── _pagination.scss
│ │ ├── _alert.scss
│ │ ├── _container.scss
│ │ ├── _image.scss
│ │ ├── _box-shadow.scss
│ │ ├── _reset-text.scss
│ │ ├── _list-group.scss
│ │ ├── _deprecate.scss
│ │ ├── _transition.scss
│ │ ├── _visually-hidden.scss
│ │ ├── _table-variants.scss
│ │ ├── _caret.scss
│ │ ├── _gradients.scss
│ │ ├── _border-radius.scss
│ │ └── _buttons.scss
│ ├── bootstrap-reboot.scss
│ ├── forms
│ │ ├── _form-text.scss
│ │ ├── _validation.scss
│ │ ├── _labels.scss
│ │ ├── _floating-labels.scss
│ │ ├── _form-select.scss
│ │ └── _form-range.scss
│ ├── _forms.scss
│ ├── bootstrap-utilities.scss
│ ├── _helpers.scss
│ ├── _transitions.scss
│ ├── _grid.scss
│ ├── _mixins.scss
│ ├── _placeholders.scss
│ ├── bootstrap.scss
│ ├── _badge.scss
│ ├── _close.scss
│ ├── _images.scss
│ ├── _containers.scss
│ ├── bootstrap-grid.scss
│ ├── _maps.scss
│ ├── _breadcrumb.scss
│ ├── utilities
│ │ └── _api.scss
│ ├── _type.scss
│ ├── _progress.scss
│ ├── _alert.scss
│ ├── _toasts.scss
│ ├── _root.scss
│ └── _spinners.scss
├── blocks
│ ├── _buttons.scss
│ ├── _meter.scss
│ ├── _iframe.scss
│ ├── _utils.scss
│ ├── _global.scss
│ ├── sidebar_nav-rtl.scss
│ ├── _alerts.scss
│ ├── _modal.scss
│ ├── _tooltip.scss
│ ├── _form.scss
│ ├── _toolbar.scss
│ ├── _table.scss
│ ├── _nav.scss
│ ├── _quickicons.scss
│ └── _treeselect.scss
├── media
│ ├── vendor
│ │ ├── _codemirror.scss
│ │ ├── dragula.scss
│ │ └── custom-elements
│ │ │ └── joomla-alert.scss
│ ├── com_media
│ │ ├── media-manager.scss
│ │ └── components
│ │ │ ├── _media-edit.scss
│ │ │ ├── _layout.scss
│ │ │ ├── _animations.scss
│ │ │ ├── _media-modal.scss
│ │ │ ├── _media-toolbar.scss
│ │ │ ├── _media-breadcrumb.scss
│ │ │ ├── _media-infobar.scss
│ │ │ └── _media-tree.scss
│ ├── system
│ │ └── fields
│ │ │ ├── joomla-field-media.scss
│ │ │ └── switcher.scss
│ ├── com_installer
│ │ └── installer.scss
│ └── plg_installer_webinstaller
│ │ └── client.scss
├── fontawesome-free
│ ├── webfonts
│ │ ├── fa-solid-900.eot
│ │ ├── fa-solid-900.ttf
│ │ ├── fa-brands-400.eot
│ │ ├── fa-brands-400.ttf
│ │ ├── fa-brands-400.woff
│ │ ├── fa-regular-400.eot
│ │ ├── fa-regular-400.ttf
│ │ ├── fa-solid-900.woff
│ │ ├── fa-solid-900.woff2
│ │ ├── fa-brands-400.woff2
│ │ ├── fa-regular-400.woff
│ │ └── fa-regular-400.woff2
│ ├── scss
│ │ ├── _fixed-width.scss
│ │ ├── _screen-reader.scss
│ │ ├── v4-shims.scss
│ │ ├── _animated.scss
│ │ ├── _list.scss
│ │ ├── _core.scss
│ │ ├── _larger.scss
│ │ ├── fontawesome.scss
│ │ ├── _bordered-pulled.scss
│ │ ├── _stacked.scss
│ │ ├── brands.scss
│ │ ├── solid.scss
│ │ ├── regular.scss
│ │ ├── _rotated-flipped.scss
│ │ └── _mixins.scss
│ └── css
│ │ ├── solid.min.css
│ │ ├── brands.min.css
│ │ ├── regular.min.css
│ │ ├── brands.css
│ │ ├── solid.css
│ │ └── regular.css
├── pages
│ ├── system.scss
│ ├── login.scss
│ ├── templates.scss
│ └── dashboard.scss
├── template-rtl.scss
├── fonts
│ └── fontawesome.scss
├── _mixins.scss
├── template-light.scss
└── template.scss
├── favicon.ico
├── template_preview.png
├── template_thumbnail.png
├── webfonts
├── fa-solid-900.woff2
├── fa-brands-400.woff2
└── fa-regular-400.woff2
├── .github
└── dependabot.yml
├── cpanel.php
├── html
├── mod_custom
│ └── default.php
├── mod_title
│ └── default.php
├── layouts
│ ├── chromes
│ │ ├── header-item.php
│ │ ├── title.php
│ │ └── body.php
│ ├── joomla
│ │ ├── edit
│ │ │ └── admin_modules.php
│ │ ├── installer
│ │ │ └── changelog.php
│ │ ├── toolbar
│ │ │ └── dropdown.php
│ │ ├── quickicons
│ │ │ └── icon.php
│ │ └── searchtools
│ │ │ └── default
│ │ │ └── bar.php
│ └── plugins
│ │ └── system
│ │ └── stats
│ │ └── message.php
├── mod_quickicon
│ └── default.php
├── com_config
│ ├── application
│ │ └── default_navigation.php
│ └── component
│ │ └── default_navigation.php
├── mod_frontend
│ └── default.php
├── mod_post_installation_messages
│ └── default.php
├── mod_messages
│ └── default.php
├── mod_version
│ └── default.php
├── mod_menu
│ └── default.php
├── com_modules
│ └── select
│ │ └── default.php
├── mod_multilangstatus
│ └── default.php
└── mod_user
│ └── default.php
├── js
├── mod_menu
│ ├── admin-menu.min.js
│ ├── admin-menu-sidebar.min.js
│ ├── admin-menu.js
│ └── admin-menu-sidebar.js
├── toolbar
│ ├── inline.min.js
│ └── inline.js
├── com_templates
│ ├── admin-template-compare.min.js
│ └── admin-template-compare.js
├── com_contenthistory
│ ├── admin-compare-compare.min.js
│ └── admin-compare-compare.js
├── com_users
│ ├── two-factor-switcher.min.js
│ └── two-factor-switcher.js
├── com_modules
│ ├── admin-select-modal.min.js
│ └── admin-select-modal.js
├── com_cpanel
│ ├── admin-cpanel-default.min.js
│ ├── admin-cpanel-dnd.min.js
│ ├── admin-cpanel-default.js
│ └── admin-cpanel-dnd.js
└── plg_quickicon_joomlaupdate
│ └── jupdatecheck.min.js
├── error.php
├── images
├── select-bg-active.svg
├── select-bg.svg
├── logo.svg
└── logo-sm.svg
├── .gitignore
├── language
├── en-GB
│ ├── en-GB.tpl_bettum.sys.ini
│ └── en-GB.tpl_bettum.ini
└── fr-FR
│ ├── fr-FR.tpl_lightning.sys.ini
│ └── fr-FR.tpl_bettum.ini
├── joomla.asset.json
├── updates
└── bettum_updates.xml
├── script.php
├── package.json
├── README.md
├── component.php
└── login.php
/sass/bootstrap/helpers/_clearfix.scss:
--------------------------------------------------------------------------------
1 | .clearfix {
2 | @include clearfix();
3 | }
4 |
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/favicon.ico
--------------------------------------------------------------------------------
/sass/blocks/_buttons.scss:
--------------------------------------------------------------------------------
1 | // Button
2 |
3 | .btn-primary {
4 | border-color: var(--border-color);
5 | }
6 |
--------------------------------------------------------------------------------
/sass/blocks/_meter.scss:
--------------------------------------------------------------------------------
1 | // Meter
2 |
3 | meter {
4 | width: 100%;
5 | max-width: $meter-max-width;
6 | }
7 |
--------------------------------------------------------------------------------
/sass/media/vendor/_codemirror.scss:
--------------------------------------------------------------------------------
1 | // Codemirror
2 |
3 | .CodeMirror-fullscreen {
4 | top: 63px;
5 | }
6 |
--------------------------------------------------------------------------------
/template_preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/template_preview.png
--------------------------------------------------------------------------------
/template_thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/template_thumbnail.png
--------------------------------------------------------------------------------
/webfonts/fa-solid-900.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/webfonts/fa-solid-900.woff2
--------------------------------------------------------------------------------
/webfonts/fa-brands-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/webfonts/fa-brands-400.woff2
--------------------------------------------------------------------------------
/webfonts/fa-regular-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/webfonts/fa-regular-400.woff2
--------------------------------------------------------------------------------
/sass/blocks/_iframe.scss:
--------------------------------------------------------------------------------
1 | // Iframe
2 |
3 | iframe {
4 | border: 0;
5 | }
6 |
7 | .modal iframe {
8 | width: 100%;
9 | }
10 |
--------------------------------------------------------------------------------
/sass/bootstrap/helpers/_text-truncation.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Text truncation
3 | //
4 |
5 | .text-truncate {
6 | @include text-truncate();
7 | }
8 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-solid-900.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-solid-900.eot
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-solid-900.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-solid-900.ttf
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-brands-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-brands-400.eot
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-brands-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-brands-400.ttf
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-brands-400.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-brands-400.woff
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-regular-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-regular-400.eot
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-regular-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-regular-400.ttf
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-solid-900.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-solid-900.woff
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-solid-900.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-solid-900.woff2
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-brands-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-brands-400.woff2
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-regular-400.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-regular-400.woff
--------------------------------------------------------------------------------
/sass/fontawesome-free/webfonts/fa-regular-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/C-Lodder/joomla4-backend-template/HEAD/sass/fontawesome-free/webfonts/fa-regular-400.woff2
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .#{$fa-css-prefix}-fw {
4 | text-align: center;
5 | width: $fa-fw-width;
6 | }
7 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/_screen-reader.scss:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { @include sr-only; }
5 | .sr-only-focusable { @include sr-only-focusable; }
6 |
--------------------------------------------------------------------------------
/sass/bootstrap/helpers/_visually-hidden.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Visually hidden
3 | //
4 |
5 | .visually-hidden,
6 | .visually-hidden-focusable:not(:focus):not(:focus-within) {
7 | @include visually-hidden();
8 | }
9 |
--------------------------------------------------------------------------------
/sass/bootstrap/helpers/_vr.scss:
--------------------------------------------------------------------------------
1 | .vr {
2 | display: inline-block;
3 | align-self: stretch;
4 | width: 1px;
5 | min-height: 1em;
6 | background-color: currentcolor;
7 | opacity: $hr-opacity;
8 | }
9 |
--------------------------------------------------------------------------------
/sass/blocks/_utils.scss:
--------------------------------------------------------------------------------
1 | // Utilities
2 |
3 | td.hidden,
4 | th.hidden {
5 | display: none !important;
6 | }
7 |
8 | /* Joomla's hidden utility */
9 | .hidden {
10 | display: none !important;
11 | }
12 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_clearfix.scss:
--------------------------------------------------------------------------------
1 | // scss-docs-start clearfix
2 | @mixin clearfix() {
3 | &::after {
4 | display: block;
5 | clear: both;
6 | content: "";
7 | }
8 | }
9 | // scss-docs-end clearfix
10 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_lists.scss:
--------------------------------------------------------------------------------
1 | // Lists
2 |
3 | // Unstyled keeps list items block level, just removes default browser padding and list-style
4 | @mixin list-unstyled {
5 | padding-left: 0;
6 | list-style: none;
7 | }
8 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_color-scheme.scss:
--------------------------------------------------------------------------------
1 | // scss-docs-start mixin-color-scheme
2 | @mixin color-scheme($name) {
3 | @media (prefers-color-scheme: #{$name}) {
4 | @content;
5 | }
6 | }
7 | // scss-docs-end mixin-color-scheme
8 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_text-truncate.scss:
--------------------------------------------------------------------------------
1 | // Text truncate
2 | // Requires inline-block or block for proper styling
3 |
4 | @mixin text-truncate() {
5 | overflow: hidden;
6 | text-overflow: ellipsis;
7 | white-space: nowrap;
8 | }
9 |
--------------------------------------------------------------------------------
/sass/bootstrap/bootstrap-reboot.scss:
--------------------------------------------------------------------------------
1 | @import "mixins/banner";
2 | @include bsBanner(Reboot);
3 |
4 | @import "functions";
5 | @import "variables";
6 | @import "maps";
7 | @import "mixins";
8 | @import "root";
9 | @import "reboot";
10 |
--------------------------------------------------------------------------------
/sass/blocks/_global.scss:
--------------------------------------------------------------------------------
1 | // Global
2 |
3 | body {
4 | background-color: var(--body-bg-color);
5 |
6 | &.component {
7 | background: var(--secondary);
8 | }
9 | }
10 |
11 | .content {
12 | font-size: $content-font-size;
13 | }
14 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_resize.scss:
--------------------------------------------------------------------------------
1 | // Resize anything
2 |
3 | @mixin resizable($direction) {
4 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
5 | resize: $direction; // Options: horizontal, vertical, both
6 | }
7 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: npm
4 | directory: "/"
5 | schedule:
6 | interval: weekly
7 | open-pull-requests-limit: 10
8 | ignore:
9 | - dependency-name: postcss
10 | versions:
11 | - 8.2.11
12 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/v4-shims.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 | @import 'shims';
7 |
--------------------------------------------------------------------------------
/cpanel.php:
--------------------------------------------------------------------------------
1 | content;
11 |
--------------------------------------------------------------------------------
/sass/blocks/sidebar_nav-rtl.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "../bootstrap/functions";
3 | @import "../bootstrap/variables";
4 | @import "../bootstrap/mixins";
5 |
6 | // Bettum Variables and Mixins
7 | @import "../mixins";
8 | @import "../variables";
9 |
10 |
11 | // Sidebar
12 | @import "sidebar_nav";
13 |
--------------------------------------------------------------------------------
/sass/bootstrap/_forms.scss:
--------------------------------------------------------------------------------
1 | @import "forms/labels";
2 | @import "forms/form-text";
3 | @import "forms/form-control";
4 | @import "forms/form-select";
5 | @import "forms/form-check";
6 | @import "forms/form-range";
7 | @import "forms/floating-labels";
8 | @import "forms/input-group";
9 | @import "forms/validation";
10 |
--------------------------------------------------------------------------------
/sass/bootstrap/helpers/_stretched-link.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Stretched link
3 | //
4 |
5 | .stretched-link {
6 | &::#{$stretched-link-pseudo-element} {
7 | position: absolute;
8 | top: 0;
9 | right: 0;
10 | bottom: 0;
11 | left: 0;
12 | z-index: $stretched-link-z-index;
13 | content: "";
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/js/mod_menu/admin-menu.min.js:
--------------------------------------------------------------------------------
1 | (e=>{"use strict";const t=e.getElementById("menu");e.querySelectorAll("#menu > .nav-item").forEach((e=>{new MutationObserver((e=>{Array.from(e[0].target.classList).includes("show")?t.classList.add("navbar-hover"):t.classList.remove("navbar-hover")})).observe(e,{attributes:!0,attributeFilter:["class"]})}))})(document);
--------------------------------------------------------------------------------
/sass/bootstrap/bootstrap-utilities.scss:
--------------------------------------------------------------------------------
1 | @import "mixins/banner";
2 | @include bsBanner(Utilities);
3 |
4 | // Configuration
5 | @import "functions";
6 | @import "variables";
7 | @import "maps";
8 | @import "mixins";
9 | @import "utilities";
10 |
11 | // Helpers
12 | @import "helpers";
13 |
14 | // Utilities
15 | @import "utilities/api";
16 |
--------------------------------------------------------------------------------
/sass/bootstrap/helpers/_stacks.scss:
--------------------------------------------------------------------------------
1 | // scss-docs-start stacks
2 | .hstack {
3 | display: flex;
4 | flex-direction: row;
5 | align-items: center;
6 | align-self: stretch;
7 | }
8 |
9 | .vstack {
10 | display: flex;
11 | flex: 1 1 auto;
12 | flex-direction: column;
13 | align-self: stretch;
14 | }
15 | // scss-docs-end stacks
16 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_banner.scss:
--------------------------------------------------------------------------------
1 | @mixin bsBanner($file, $suffix:"") {
2 | /*!
3 | * Bootstrap #{$file} v5.2.0 (https://getbootstrap.com/)
4 | * Copyright 2011-2022 The Bootstrap Authors
5 | * Copyright 2011-2022 Twitter, Inc.
6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
7 | */
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/sass/bootstrap/_helpers.scss:
--------------------------------------------------------------------------------
1 | @import "helpers/clearfix";
2 | @import "helpers/color-bg";
3 | @import "helpers/colored-links";
4 | @import "helpers/ratio";
5 | @import "helpers/position";
6 | @import "helpers/stacks";
7 | @import "helpers/visually-hidden";
8 | @import "helpers/stretched-link";
9 | @import "helpers/text-truncation";
10 | @import "helpers/vr";
11 |
--------------------------------------------------------------------------------
/js/toolbar/inline.min.js:
--------------------------------------------------------------------------------
1 | (e=>{"use strict";const o=e.getElementById("toolbar-dropdown-save-group");if(o){o.parentNode;o.querySelector(".dropdown-toggle-split").remove(),o.querySelectorAll("joomla-toolbar-button").forEach((e=>{const t=e.querySelector("button");t.classList.remove("dropdown-item"),t.classList.add("btn","btn-success"),o.parentNode.insertBefore(e,o.nextSibling)})),o.remove()}})(document);
--------------------------------------------------------------------------------
/sass/pages/system.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "../bootstrap/functions";
3 | @import "../bootstrap/variables";
4 | @import "../bootstrap/maps";
5 | @import "../bootstrap/mixins";
6 |
7 | // Bettum Variables and Mixins
8 | @import "../mixins";
9 | @import "../variables";
10 |
11 | // System
12 | @include media-breakpoint-up(sm) {
13 | .cpanel-system.card-columns {
14 | column-count: 3;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_backdrop.scss:
--------------------------------------------------------------------------------
1 | // Shared between modals and offcanvases
2 | @mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {
3 | position: fixed;
4 | top: 0;
5 | left: 0;
6 | z-index: $zindex;
7 | width: 100vw;
8 | height: 100vh;
9 | background-color: $backdrop-bg;
10 |
11 | // Fade for backdrop
12 | &.fade { opacity: 0; }
13 | &.show { opacity: $backdrop-opacity; }
14 | }
15 |
--------------------------------------------------------------------------------
/sass/template-rtl.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "bootstrap/functions";
3 | @import "bootstrap/variables";
4 | @import "bootstrap/maps";
5 | @import "bootstrap/mixins";
6 | @import "bootstrap/utilities";
7 |
8 | // Bettum Variables and Mixins
9 | @import "mixins";
10 | @import "variables";
11 |
12 | // Template
13 | @import "template";
14 |
15 | @import "bootstrap/helpers";
16 | @import "bootstrap/utilities/api";
17 |
--------------------------------------------------------------------------------
/html/mod_title/default.php:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/_animated.scss:
--------------------------------------------------------------------------------
1 | // Animated Icons
2 | // --------------------------
3 |
4 | .#{$fa-css-prefix}-spin {
5 | animation: fa-spin 2s infinite linear;
6 | }
7 |
8 | .#{$fa-css-prefix}-pulse {
9 | animation: fa-spin 1s infinite steps(8);
10 | }
11 |
12 | @keyframes fa-spin {
13 | 0% {
14 | transform: rotate(0deg);
15 | }
16 |
17 | 100% {
18 | transform: rotate(360deg);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/_list.scss:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | list-style-type: none;
6 | margin-left: $fa-li-width * 5/4;
7 | padding-left: 0;
8 |
9 | > li { position: relative; }
10 | }
11 |
12 | .#{$fa-css-prefix}-li {
13 | left: -$fa-li-width;
14 | position: absolute;
15 | text-align: center;
16 | width: $fa-li-width;
17 | line-height: inherit;
18 | }
19 |
--------------------------------------------------------------------------------
/sass/blocks/_alerts.scss:
--------------------------------------------------------------------------------
1 | // Alerts
2 |
3 | .notify-alerts {
4 | position: fixed;
5 | bottom: 1rem;
6 | right: 1rem;
7 | z-index: $zindex-alerts;
8 | }
9 |
10 | .alert a {
11 | color: inherit;
12 | }
13 |
14 | .alert-heading {
15 | margin-bottom: .5rem;
16 | font-weight: 700;
17 | font-size: 1.1rem;
18 | }
19 |
20 | .alert-message {
21 | background-color: transparent;
22 | border-left: none;
23 | color: inherit;
24 | }
25 |
--------------------------------------------------------------------------------
/error.php:
--------------------------------------------------------------------------------
1 | guest)
13 | {
14 | require __DIR__ . '/error_login.php';
15 | }
16 | else
17 | {
18 | require __DIR__ . '/error_full.php';
19 | }
20 |
--------------------------------------------------------------------------------
/sass/media/com_media/media-manager.scss:
--------------------------------------------------------------------------------
1 | // Imports
2 | @import "variables";
3 |
4 | // Components
5 | @import "components/animations";
6 | @import "components/layout";
7 | @import "components/media-breadcrumb";
8 | @import "components/media-browser";
9 | @import "components/media-edit";
10 | @import "components/media-infobar";
11 | @import "components/media-toolbar";
12 | @import "components/media-tree";
13 | @import "components/media-modal";
14 |
15 |
--------------------------------------------------------------------------------
/sass/blocks/_modal.scss:
--------------------------------------------------------------------------------
1 | // Modal
2 |
3 | @include media-breakpoint-up(md) {
4 | @for $i from 10 through 100 {
5 | @if $i % 10 == 0 {
6 | .modal-dialog.jviewport-width#{$i} { width: #{$i}vw; max-width: none; }
7 | }
8 | }
9 | }
10 |
11 | @for $i from 10 through 100 {
12 | @if $i % 10 == 0 {
13 | .jviewport-height#{$i} { height: #{$i}vh; }
14 | }
15 | }
16 |
17 | [class*=jviewport-height] iframe {
18 | height: 100%;
19 | }
20 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_pagination.scss:
--------------------------------------------------------------------------------
1 | // Pagination
2 |
3 | // scss-docs-start pagination-mixin
4 | @mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {
5 | --#{$prefix}pagination-padding-x: #{$padding-x};
6 | --#{$prefix}pagination-padding-y: #{$padding-y};
7 | @include rfs($font-size, --#{$prefix}pagination-font-size);
8 | --#{$prefix}pagination-border-radius: #{$border-radius};
9 | }
10 | // scss-docs-end pagination-mixin
11 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/_core.scss:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix},
5 | .fas,
6 | .far,
7 | .fal,
8 | .fad,
9 | .fab {
10 | -moz-osx-font-smoothing: grayscale;
11 | -webkit-font-smoothing: antialiased;
12 | display: inline-block;
13 | font-style: normal;
14 | font-variant: normal;
15 | text-rendering: auto;
16 | line-height: 1;
17 | }
18 |
19 | %fa-icon {
20 | @include fa-icon;
21 | }
22 |
--------------------------------------------------------------------------------
/html/layouts/chromes/header-item.php:
--------------------------------------------------------------------------------
1 | content) : ?>
13 |
16 |
17 |
--------------------------------------------------------------------------------
/images/select-bg-active.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/sass/fonts/fontawesome.scss:
--------------------------------------------------------------------------------
1 | // Bettum Variables and Mixins
2 | @import "../mixins";
3 | @import "../variables";
4 |
5 | // Font Awesome 5 Free
6 | @import "../fontawesome-free/scss/fontawesome";
7 | @import "../fontawesome-free/scss/solid";
8 | @import "../fontawesome-free/scss/regular";
9 | @import "../fontawesome-free/scss/brands";
10 |
11 | // B/C for Icomoon
12 | @import "icomoon";
13 |
14 | // RTL override
15 | html[dir=rtl] .pull-right {
16 | float: left;
17 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # IDE & System Related Files #
2 | .buildpath
3 | .project
4 | .settings
5 | .DS_Store
6 | .idea
7 | .vscode
8 |
9 | # NodeJS #
10 | node_modules/
11 |
12 | # Build
13 | .zip
14 |
15 | # CSS map files #
16 | .map
17 |
18 | # OSX #
19 | ._*
20 | .Spotlight-V100
21 | .Trashes
22 |
23 | # Windows #
24 | Thumbs.db
25 | Desktop.ini
26 |
27 | # Never ignore #
28 | # Only apply this rule to the main repository's gitignore files
29 | !/.gitignore
30 | !/build/.gitignore
31 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_alert.scss:
--------------------------------------------------------------------------------
1 | // scss-docs-start alert-variant-mixin
2 | @mixin alert-variant($background, $border, $color) {
3 | --#{$prefix}alert-color: #{$color};
4 | --#{$prefix}alert-bg: #{$background};
5 | --#{$prefix}alert-border-color: #{$border};
6 |
7 | @if $enable-gradients {
8 | background-image: var(--#{$prefix}gradient);
9 | }
10 |
11 | .alert-link {
12 | color: shade-color($color, 20%);
13 | }
14 | }
15 | // scss-docs-end alert-variant-mixin
16 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_container.scss:
--------------------------------------------------------------------------------
1 | // Container mixins
2 |
3 | @mixin make-container($gutter: $container-padding-x) {
4 | --#{$prefix}gutter-x: #{$gutter};
5 | --#{$prefix}gutter-y: 0;
6 | width: 100%;
7 | padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list
8 | padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list
9 | margin-right: auto;
10 | margin-left: auto;
11 | }
12 |
--------------------------------------------------------------------------------
/sass/blocks/_tooltip.scss:
--------------------------------------------------------------------------------
1 | // Tooltip
2 |
3 | [role="tooltip"]:not(.show) {
4 | display: none;
5 | z-index: 1070;
6 | max-width: 100%;
7 | padding: .75em;
8 | margin: .25em;
9 | color: $tooltip-color;
10 | border: 1px solid $tooltip-border-color;
11 | background: $tooltip-bg;
12 | }
13 |
14 | :focus + [role="tooltip"],
15 | :hover + [role="tooltip"] {
16 | position: absolute;
17 | display: block;
18 | }
19 |
20 | [id="filter[search]-desc"] {
21 | bottom: 100%;
22 | }
23 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_image.scss:
--------------------------------------------------------------------------------
1 | // Image Mixins
2 | // - Responsive image
3 | // - Retina image
4 |
5 |
6 | // Responsive image
7 | //
8 | // Keep images from scaling beyond the width of their parents.
9 |
10 | @mixin img-fluid {
11 | // Part 1: Set a maximum relative to the parent
12 | max-width: 100%;
13 | // Part 2: Override the height to auto, otherwise images will be stretched
14 | // when setting a width and height attribute on the img element.
15 | height: auto;
16 | }
17 |
--------------------------------------------------------------------------------
/html/layouts/chromes/title.php:
--------------------------------------------------------------------------------
1 | content) : ?>
13 |
16 | content; ?>
17 |
18 |
--------------------------------------------------------------------------------
/images/select-bg.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_box-shadow.scss:
--------------------------------------------------------------------------------
1 | @mixin box-shadow($shadow...) {
2 | @if $enable-shadows {
3 | $result: ();
4 |
5 | @each $value in $shadow {
6 | @if $value != null {
7 | $result: append($result, $value, "comma");
8 | }
9 | @if $value == none and length($shadow) > 1 {
10 | @warn "The keyword 'none' must be used as a single argument.";
11 | }
12 | }
13 |
14 | @if (length($result) > 0) {
15 | box-shadow: $result;
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/sass/bootstrap/helpers/_color-bg.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable function-name-case
2 |
3 | // All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251
4 | @each $color, $value in $theme-colors {
5 | $color-rgb: to-rgb($value);
6 | .text-bg-#{$color} {
7 | color: color-contrast($value) if($enable-important-utilities, !important, null);
8 | background-color: RGBA($color-rgb, var(--#{$prefix}bg-opacity, 1)) if($enable-important-utilities, !important, null);
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/_larger.scss:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | // makes the font 33% larger relative to the icon container
5 | .#{$fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -.0667em;
9 | }
10 |
11 | .#{$fa-css-prefix}-xs {
12 | font-size: .75em;
13 | }
14 |
15 | .#{$fa-css-prefix}-sm {
16 | font-size: .875em;
17 | }
18 |
19 | @for $i from 1 through 10 {
20 | .#{$fa-css-prefix}-#{$i}x {
21 | font-size: $i * 1em;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/sass/bootstrap/helpers/_colored-links.scss:
--------------------------------------------------------------------------------
1 | @each $color, $value in $theme-colors {
2 | .link-#{$color} {
3 | color: $value !important; // stylelint-disable-line declaration-no-important
4 |
5 | @if $link-shade-percentage != 0 {
6 | &:hover,
7 | &:focus {
8 | color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage)) !important; // stylelint-disable-line declaration-no-important
9 | }
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/fontawesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 | @import 'mixins';
7 | @import 'core';
8 | @import 'larger';
9 | @import 'fixed-width';
10 | @import 'list';
11 | @import 'bordered-pulled';
12 | @import 'animated';
13 | @import 'rotated-flipped';
14 | @import 'stacked';
15 | @import 'icons';
16 | @import 'screen-reader';
17 |
--------------------------------------------------------------------------------
/sass/bootstrap/helpers/_ratio.scss:
--------------------------------------------------------------------------------
1 | // Credit: Nicolas Gallagher and SUIT CSS.
2 |
3 | .ratio {
4 | position: relative;
5 | width: 100%;
6 |
7 | &::before {
8 | display: block;
9 | padding-top: var(--#{$prefix}aspect-ratio);
10 | content: "";
11 | }
12 |
13 | > * {
14 | position: absolute;
15 | top: 0;
16 | left: 0;
17 | width: 100%;
18 | height: 100%;
19 | }
20 | }
21 |
22 | @each $key, $ratio in $aspect-ratios {
23 | .ratio-#{$key} {
24 | --#{$prefix}aspect-ratio: #{$ratio};
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/sass/bootstrap/forms/_validation.scss:
--------------------------------------------------------------------------------
1 | // Form validation
2 | //
3 | // Provide feedback to users when form field values are valid or invalid. Works
4 | // primarily for client-side validation via scoped `:invalid` and `:valid`
5 | // pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
6 | // server-side validation.
7 |
8 | // scss-docs-start form-validation-states-loop
9 | @each $state, $data in $form-validation-states {
10 | @include form-validation-state($state, $data...);
11 | }
12 | // scss-docs-end form-validation-states-loop
13 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | border: solid .08em $fa-border-color;
6 | border-radius: .1em;
7 | padding: .2em .25em .15em;
8 | }
9 |
10 | .#{$fa-css-prefix}-pull-left { float: left; }
11 | .#{$fa-css-prefix}-pull-right { float: right; }
12 |
13 | .#{$fa-css-prefix},
14 | .fas,
15 | .far,
16 | .fal,
17 | .fab {
18 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
19 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
20 | }
21 |
--------------------------------------------------------------------------------
/sass/bootstrap/_transitions.scss:
--------------------------------------------------------------------------------
1 | .fade {
2 | @include transition($transition-fade);
3 |
4 | &:not(.show) {
5 | opacity: 0;
6 | }
7 | }
8 |
9 | // scss-docs-start collapse-classes
10 | .collapse {
11 | &:not(.show) {
12 | display: none;
13 | }
14 | }
15 |
16 | .collapsing {
17 | height: 0;
18 | overflow: hidden;
19 | @include transition($transition-collapse);
20 |
21 | &.collapse-horizontal {
22 | width: 0;
23 | height: auto;
24 | @include transition($transition-collapse-width);
25 | }
26 | }
27 | // scss-docs-end collapse-classes
28 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_reset-text.scss:
--------------------------------------------------------------------------------
1 | @mixin reset-text {
2 | font-family: $font-family-base;
3 | // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.
4 | font-style: normal;
5 | font-weight: $font-weight-normal;
6 | line-height: $line-height-base;
7 | text-align: left; // Fallback for where `start` is not supported
8 | text-align: start;
9 | text-decoration: none;
10 | text-shadow: none;
11 | text-transform: none;
12 | letter-spacing: normal;
13 | word-break: normal;
14 | white-space: normal;
15 | word-spacing: normal;
16 | line-break: auto;
17 | }
18 |
--------------------------------------------------------------------------------
/js/com_templates/admin-template-compare.min.js:
--------------------------------------------------------------------------------
1 | (()=>{"use strict";const e=(e,n)=>{const t=n.nextElementSibling,d=Diff.diffLines(e.innerHTML,n.innerHTML),a=document.createDocumentFragment();d.forEach((e=>{const n=document.createElement("pre");e.added?n.classList.add("added"):e.removed&&n.classList.add("removed"),n.appendChild(document.createTextNode((e=>{const n=document.createElement("textarea");return n.innerHTML=e,n.value})(e.value))),a.appendChild(n)})),t.appendChild(a)},n=()=>{const t=document.getElementById("original");e(t,t.nextElementSibling),document.removeEventListener("DOMContentLoaded",n)};document.addEventListener("DOMContentLoaded",n)})();
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_list-group.scss:
--------------------------------------------------------------------------------
1 | // List Groups
2 |
3 | // scss-docs-start list-group-mixin
4 | @mixin list-group-item-variant($state, $background, $color) {
5 | .list-group-item-#{$state} {
6 | color: $color;
7 | background-color: $background;
8 |
9 | &.list-group-item-action {
10 | &:hover,
11 | &:focus {
12 | color: $color;
13 | background-color: shade-color($background, 10%);
14 | }
15 |
16 | &.active {
17 | color: $white;
18 | background-color: $color;
19 | border-color: $color;
20 | }
21 | }
22 | }
23 | }
24 | // scss-docs-end list-group-mixin
25 |
--------------------------------------------------------------------------------
/language/en-GB/en-GB.tpl_bettum.sys.ini:
--------------------------------------------------------------------------------
1 | ; Package Bettum
2 | ; Copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | ; License GNU General Public License version 2 or later
4 |
5 | BETTUM="Bettum Administrator template"
6 | TPL_BETTUM_POSITION_BOTTOM="Bottom"
7 | TPL_BETTUM_POSITION_CPANEL="Cpanel"
8 | TPL_BETTUM_POSITION_DEBUG="Debug"
9 | TPL_BETTUM_POSITION_ICON="Quick Icons"
10 | TPL_BETTUM_POSITION_LOGIN="Login"
11 | TPL_BETTUM_POSITION_MENU="Menu"
12 | TPL_BETTUM_POSITION_STATUS="Status"
13 | TPL_BETTUM_POSITION_TITLE="Title"
14 | TPL_BETTUM_POSITION_TOOLBAR="Toolbar"
15 | TPL_BETTUM_XML_DESCRIPTION="Joomla 4 backend template"
16 |
--------------------------------------------------------------------------------
/js/com_contenthistory/admin-compare-compare.min.js:
--------------------------------------------------------------------------------
1 | (()=>{"use strict";const e=(e,n)=>{const t=n.nextElementSibling,d=window.Diff.diffWords(e.innerHTML,n.innerHTML),o=document.createDocumentFragment();d.forEach((e=>{let n;n=e.added?document.createElement("ins"):e.removed?document.createElement("del"):document.createElement("span"),n.appendChild(document.createTextNode((e=>{const n=document.createElement("textarea");return n.innerHTML=e,n.value})(e.value))),o.appendChild(n)})),t.appendChild(o)},n=()=>{document.querySelectorAll(".original").forEach((n=>{e(n,n.nextElementSibling)})),document.removeEventListener("DOMContentLoaded",n)};document.addEventListener("DOMContentLoaded",n)})();
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_deprecate.scss:
--------------------------------------------------------------------------------
1 | // Deprecate mixin
2 | //
3 | // This mixin can be used to deprecate mixins or functions.
4 | // `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to
5 | // some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)
6 | @mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {
7 | @if ($enable-deprecation-messages != false and $ignore-warning != true) {
8 | @warn "#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.";
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/_stacked.scss:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-stack {
5 | display: inline-block;
6 | height: 2em;
7 | line-height: 2em;
8 | position: relative;
9 | vertical-align: middle;
10 | width: ($fa-fw-width*2);
11 | }
12 |
13 | .#{$fa-css-prefix}-stack-1x,
14 | .#{$fa-css-prefix}-stack-2x {
15 | left: 0;
16 | position: absolute;
17 | text-align: center;
18 | width: 100%;
19 | }
20 |
21 | .#{$fa-css-prefix}-stack-1x {
22 | line-height: inherit;
23 | }
24 |
25 | .#{$fa-css-prefix}-stack-2x {
26 | font-size: 2em;
27 | }
28 |
29 | .#{$fa-css-prefix}-inverse {
30 | color: $fa-inverse;
31 | }
32 |
--------------------------------------------------------------------------------
/language/fr-FR/fr-FR.tpl_lightning.sys.ini:
--------------------------------------------------------------------------------
1 | ; Package Bettum
2 | ; Copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | ; License GNU General Public License version 2 or later
4 |
5 | BETTUM="Template d'administration Bettum"
6 | TPL_BETTUM_POSITION_BOTTOM="Bas"
7 | TPL_BETTUM_POSITION_CPANEL="Cpanel"
8 | TPL_BETTUM_POSITION_DEBUG="Déboguage"
9 | TPL_BETTUM_POSITION_ICON="Icônes rapides"
10 | TPL_BETTUM_POSITION_LOGIN="Connexion"
11 | TPL_BETTUM_POSITION_MENU="Menu"
12 | TPL_BETTUM_POSITION_STATUS="Statut"
13 | TPL_BETTUM_POSITION_TITLE="Titre"
14 | TPL_BETTUM_POSITION_TOOLBAR="Barre d'outils"
15 | TPL_BETTUM_XML_DESCRIPTION="Template d'administration pour Joomla 4"
16 |
--------------------------------------------------------------------------------
/sass/media/com_media/components/_media-edit.scss:
--------------------------------------------------------------------------------
1 | #media-form {
2 | .control-group {
3 | display: flex;
4 | flex-direction: column;
5 | .control-label {
6 | width: 100%;
7 | }
8 | .controls {
9 | margin-inline-start: 0;
10 | }
11 | }
12 | .input-group-addon {
13 | font-size: .9rem;
14 | }
15 | .spacer hr {
16 | width: 100%;
17 | }
18 | }
19 |
20 | .media-manager-edit {
21 | > div {
22 | padding: 0 $gutter-width;
23 | }
24 | h3 {
25 | padding: 3px;
26 | text-align: center;
27 | opacity: .6;
28 | }
29 | }
30 |
31 | .tab-pane {
32 | background-color: #fafafa;
33 | border-inline-start: 1px solid #f0f0f0;
34 | }
35 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/css/solid.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:Font Awesome\ 5 Free;font-weight:900}
--------------------------------------------------------------------------------
/sass/fontawesome-free/css/brands.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands;font-weight:400}
--------------------------------------------------------------------------------
/sass/fontawesome-free/css/regular.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:Font Awesome\ 5 Free;font-weight:400}
--------------------------------------------------------------------------------
/js/mod_menu/admin-menu-sidebar.min.js:
--------------------------------------------------------------------------------
1 | (e=>{"use strict";const t=e.getElementById("bettum-sidebar");if(t){const s=e.getElementById("navbar-toggler");s.addEventListener("click",(()=>{t.classList.toggle("show"),t.classList.contains("show")?s.setAttribute("aria-expanded",!0):s.setAttribute("aria-expanded",!1)}));const a=window.location.href.toLowerCase();t.querySelectorAll(".sidebar-item").forEach((e=>{if(a===e.href&&(e.setAttribute("aria-current","page"),!e.hasAttribute("data-toggle"))){const t=e.closest(".collapse-level-1"),s=e.closest(".collapse-level-2");t&&(t.previousElementSibling.setAttribute("aria-expanded",!0),t.classList.add("show")),s&&(s.previousElementSibling.setAttribute("aria-expanded",!0),s.classList.add("show"))}}))}})(document);
--------------------------------------------------------------------------------
/js/com_users/two-factor-switcher.min.js:
--------------------------------------------------------------------------------
1 | (e=>{"use strict";document.addEventListener("DOMContentLoaded",(()=>{e.twoFactorMethodChange=()=>{const e=document.getElementById("jform_twofactor_method");if(e){const t=`com_users_twofactor_${e.value}`;document.querySelectorAll("#com_users_twofactor_forms_container > div").forEach((e=>{const{id:o}=e;o!==t?document.getElementById(o).classList.add("hidden"):document.getElementById(o).classList.remove("hidden")}))}},(()=>{const e=document.getElementById("fieldset-accessibility");if(e){e.querySelector("div").remove();const t=document.createElement("div");t.classList.add("alert","alert-info"),t.innerText="Accessibility settings should be changed in your operating system or browser settings.",e.append(t)}})()}))})(Joomla);
--------------------------------------------------------------------------------
/sass/bootstrap/_grid.scss:
--------------------------------------------------------------------------------
1 | // Row
2 | //
3 | // Rows contain your columns.
4 |
5 | @if $enable-grid-classes {
6 | .row {
7 | @include make-row();
8 |
9 | > * {
10 | @include make-col-ready();
11 | }
12 | }
13 | }
14 |
15 | @if $enable-cssgrid {
16 | .grid {
17 | display: grid;
18 | grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);
19 | grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);
20 | gap: var(--#{$prefix}gap, #{$grid-gutter-width});
21 |
22 | @include make-cssgrid();
23 | }
24 | }
25 |
26 |
27 | // Columns
28 | //
29 | // Common styles for small and large grid columns
30 |
31 | @if $enable-grid-classes {
32 | @include make-grid-columns();
33 | }
34 |
--------------------------------------------------------------------------------
/joomla.asset.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://developer.joomla.org/schemas/json-schema/web_assets.json",
3 | "name": "bettum",
4 | "version": "1.1.1",
5 | "description": "Bettum is a Joomla 4 administrator template",
6 | "license": "GPL-2.0-or-later",
7 | "assets": [
8 | {
9 | "package": "choices.js",
10 | "name": "choicesjs",
11 | "version": "9.0.0",
12 | "type": "style",
13 | "uri": "vendor/choicesjs/choices.min.css"
14 | },
15 | {
16 | "name": "switcher",
17 | "type": "style",
18 | "uri": "system/fields/switcher.min.css"
19 | },
20 | {
21 | "name": "searchtools",
22 | "type": "style",
23 | "uri": "system/searchtools/searchtools.min.css"
24 | }
25 | ]
26 | }
--------------------------------------------------------------------------------
/js/com_modules/admin-select-modal.min.js:
--------------------------------------------------------------------------------
1 | (e=>{"use strict";e.addEventListener("DOMContentLoaded",(()=>{const t=e.getElementById("new-modules-list");t.querySelectorAll(".select-link").forEach((e=>{e.addEventListener("click",(({currentTarget:e,target:t})=>{let n=e;n||(n=t,n&&!n.classList.contains("select-link")&&(n=n.parentNode));const s=n.getAttribute("data-function");s&&"function"==typeof window.parent[s]&&window.parent[s](n)}))})),e.getElementById("new-modules-list-search").addEventListener("input",(({target:e})=>{t.querySelectorAll(".name").forEach((t=>{const n=t.closest("li");t.innerText.toLowerCase().includes(e.value.toLowerCase())?(n.classList.add("d-flex"),n.classList.remove("d-none")):(n.classList.add("d-none"),n.classList.remove("d-flex"))}))}))}))})(document);
--------------------------------------------------------------------------------
/js/com_cpanel/admin-cpanel-default.min.js:
--------------------------------------------------------------------------------
1 | ((e,t)=>{"use strict";t.unpublishModule=e=>{t.request({url:`index.php?option=com_modules&task=modules.unpublish&format=json&cid=${e.getAttribute("data-module-id")}`,method:"POST",headers:{"Content-Type":"application/json"},onSuccess:()=>{const o=e.closest(".module-wrapper");o.parentNode.removeChild(o),t.renderMessages({message:[t.JText._("COM_CPANEL_UNPUBLISH_MODULE_SUCCESS")]})},onError:()=>{t.renderMessages({error:[t.JText._("COM_CPANEL_UNPUBLISH_MODULE_ERROR")]})}})};const o=()=>{const n=e.getElementById("content");n&&n.querySelectorAll(".unpublish-module").forEach((e=>{e.addEventListener("click",(({target:e})=>t.unpublishModule(e)))})),e.removeEventListener("DOMContentLoaded",o)};e.addEventListener("DOMContentLoaded",o)})(document,Joomla);
--------------------------------------------------------------------------------
/html/mod_quickicon/default.php:
--------------------------------------------------------------------------------
1 | 'auto', 'relative' => true], ['type' => 'module']);
14 |
15 | $html = HTMLHelper::_('icons.buttons', $buttons);
16 | ?>
17 |
18 |
23 |
24 |
--------------------------------------------------------------------------------
/language/en-GB/en-GB.tpl_bettum.ini:
--------------------------------------------------------------------------------
1 | ; Package Bettum
2 | ; Copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | ; License GNU General Public License version 2 or later
4 |
5 | BETTUM="Bettum Administrator template"
6 | TPL_BETTUM_BACKEND_LOGIN="Administrator Login"
7 | TPL_BETTUM_SETTINGS="Settings"
8 | TPL_BETTUM_SETTINGS_LOGOS="Logos"
9 | TPL_BETTUM_LOGIN_LOGO_LABEL="Login Logo"
10 | TPL_BETTUM_NAVIGATION_POSITION="Navigation position"
11 | TPL_BETTUM_NAVIGATION_SIDEBAR="Sidebar"
12 | TPL_BETTUM_NAVIGATION_TOP="Top"
13 | TPL_BETTUM_SITE_LOGO_LABEL="Site Logo"
14 | TPL_BETTUM_TOOLBAR_SAVE_BUTTONS="Toolbar save buttons"
15 | TPL_BETTUM_TOOLBAR_SAVE_BUTTONS_INLINE="Inline"
16 | TPL_BETTUM_TOOLBAR_SAVE_BUTTONS_DROPDOWN="Dropdown"
17 | TPL_BETTUM_XML_DESCRIPTION="Joomla 4 backend template"
18 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_transition.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable property-disallowed-list
2 | @mixin transition($transition...) {
3 | @if length($transition) == 0 {
4 | $transition: $transition-base;
5 | }
6 |
7 | @if length($transition) > 1 {
8 | @each $value in $transition {
9 | @if $value == null or $value == none {
10 | @warn "The keyword 'none' or 'null' must be used as a single argument.";
11 | }
12 | }
13 | }
14 |
15 | @if $enable-transitions {
16 | @if nth($transition, 1) != null {
17 | transition: $transition;
18 | }
19 |
20 | @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {
21 | @media (prefers-reduced-motion: reduce) {
22 | transition: none;
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/js/mod_menu/admin-menu.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | * @license GNU General Public License version 2 or later; see LICENSE.txt
4 | */
5 |
6 | ((document) => {
7 | 'use strict'
8 |
9 | // Navbar
10 | const menu = document.getElementById('menu')
11 | document.querySelectorAll('#menu > .nav-item').forEach((item) => {
12 | const observer = new MutationObserver((mutation) => {
13 | if (Array.from(mutation[0].target.classList).includes('show')) {
14 | menu.classList.add('navbar-hover')
15 | } else {
16 | menu.classList.remove('navbar-hover')
17 | }
18 | })
19 |
20 | observer.observe(item, {
21 | attributes: true,
22 | attributeFilter: ['class']
23 | })
24 | })
25 |
26 | })(document)
27 |
--------------------------------------------------------------------------------
/sass/bootstrap/helpers/_position.scss:
--------------------------------------------------------------------------------
1 | // Shorthand
2 |
3 | .fixed-top {
4 | position: fixed;
5 | top: 0;
6 | right: 0;
7 | left: 0;
8 | z-index: $zindex-fixed;
9 | }
10 |
11 | .fixed-bottom {
12 | position: fixed;
13 | right: 0;
14 | bottom: 0;
15 | left: 0;
16 | z-index: $zindex-fixed;
17 | }
18 |
19 | // Responsive sticky top and bottom
20 | @each $breakpoint in map-keys($grid-breakpoints) {
21 | @include media-breakpoint-up($breakpoint) {
22 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
23 |
24 | .sticky#{$infix}-top {
25 | position: sticky;
26 | top: 0;
27 | z-index: $zindex-sticky;
28 | }
29 |
30 | .sticky#{$infix}-bottom {
31 | position: sticky;
32 | bottom: 0;
33 | z-index: $zindex-sticky;
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/css/brands.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @font-face {
6 | font-family: "Font Awesome 5 Brands";
7 | font-style: normal;
8 | font-weight: 400;
9 | font-display: block;
10 | src: url("../webfonts/fa-brands-400.eot");
11 | src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg");
12 | }
13 | .fab {
14 | font-family: "Font Awesome 5 Brands";
15 | font-weight: 400;
16 | }
--------------------------------------------------------------------------------
/sass/fontawesome-free/css/solid.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @font-face {
6 | font-family: "Font Awesome 5 Free";
7 | font-style: normal;
8 | font-weight: 900;
9 | font-display: block;
10 | src: url("../webfonts/fa-solid-900.eot");
11 | src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg");
12 | }
13 | .fa,
14 | .fas {
15 | font-family: "Font Awesome 5 Free";
16 | font-weight: 900;
17 | }
--------------------------------------------------------------------------------
/sass/fontawesome-free/css/regular.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @font-face {
6 | font-family: "Font Awesome 5 Free";
7 | font-style: normal;
8 | font-weight: 400;
9 | font-display: block;
10 | src: url("../webfonts/fa-regular-400.eot");
11 | src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg");
12 | }
13 | .far {
14 | font-family: "Font Awesome 5 Free";
15 | font-weight: 400;
16 | }
--------------------------------------------------------------------------------
/updates/bettum_updates.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Bettum - Administrator Template
4 | A dark themed administrator template for Joomla 4
5 | bettum
6 | template
7 | 1.1.1
8 | https://github.com/C-Lodder/joomla4-backend-template/blob/master/CHANGELOG.md
9 |
10 | https://github.com/C-Lodder/joomla4-backend-template/releases/download/v1.1.1/tpl_bettum-v1.1.1.zip
11 |
12 | Charlie Lodder
13 | https://joomjunk.co.uk
14 |
15 | administrator
16 |
17 |
18 |
--------------------------------------------------------------------------------
/sass/blocks/_form.scss:
--------------------------------------------------------------------------------
1 | // Form
2 |
3 | .form-group {
4 | margin-bottom: 1rem;
5 | }
6 |
7 | .control-group {
8 | margin-bottom: 1rem;
9 | }
10 |
11 | .controls {
12 | joomla-field-fancy-select,
13 | .form-select,
14 | .form-control {
15 | max-width: $input-max-width;
16 | }
17 | }
18 |
19 | .title-alias .controls {
20 | .form-select,
21 | .form-control {
22 | max-width: none;
23 | }
24 | }
25 |
26 | .form-control-feedback {
27 | display: block;
28 | color: var(--red);
29 | }
30 |
31 |
32 | // Form select modifiers
33 | .form-select-success {
34 | border-color: var(--green);
35 | }
36 |
37 | .form-select-danger {
38 | border-color: var(--red);
39 | }
40 |
41 | .module-options {
42 | .controls {
43 | .form-select,
44 | .form-control {
45 | max-width: none;
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/script.php:
--------------------------------------------------------------------------------
1 | removeFiles();
31 | }
32 |
33 | return true;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/language/fr-FR/fr-FR.tpl_bettum.ini:
--------------------------------------------------------------------------------
1 | ; Package Bettum
2 | ; Copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | ; License GNU General Public License version 2 or later
4 |
5 | BETTUM="Template d'administration Bettum"
6 | TPL_BETTUM_BACKEND_LOGIN="Connexion à l'administration"
7 | TPL_BETTUM_SETTINGS="Paramètres"
8 | TPL_BETTUM_SETTINGS_LOGOS="Logos"
9 | TPL_BETTUM_LOGIN_LOGO_LABEL="Logo de connexion"
10 | TPL_BETTUM_NAVIGATION_POSITION="Position de la navigation"
11 | TPL_BETTUM_NAVIGATION_SIDEBAR="Barre latérale"
12 | TPL_BETTUM_NAVIGATION_TOP="Haut"
13 | TPL_BETTUM_SITE_LOGO_LABEL="Logo du site"
14 | TPL_BETTUM_TOOLBAR_SAVE_BUTTONS="Boutons de sauvegarde pour la barre d'outils"
15 | TPL_BETTUM_TOOLBAR_SAVE_BUTTONS_INLINE="En ligne"
16 | TPL_BETTUM_TOOLBAR_SAVE_BUTTONS_DROPDOWN="Menu déroulant"
17 | TPL_BETTUM_XML_DESCRIPTION="Template d'administration pour Joomla 4"
18 |
--------------------------------------------------------------------------------
/sass/media/vendor/dragula.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "../../bootstrap/functions";
3 | @import "../../bootstrap/variables";
4 | @import "../../bootstrap/mixins";
5 |
6 | // Bettum Variables and mixins
7 | @import "../../mixins";
8 | @import "../../variables";
9 |
10 |
11 | // Dragula
12 | .gu-mirror {
13 | position: fixed !important;
14 | margin: 0 !important;
15 | z-index: $zindex-popover !important;
16 | cursor: move;
17 | opacity: .8;
18 | background-color: var(--teal);
19 |
20 | &.table {
21 | display: table;
22 |
23 | td {
24 | display: table-cell;
25 | }
26 | }
27 | }
28 |
29 | .gu-hide {
30 | display: none !important;
31 | }
32 |
33 | .gu-unselectable {
34 | user-select: none !important;
35 | }
36 |
37 | .gu-transit {
38 | opacity: .2;
39 | }
40 |
41 | .handle,
42 | .js-draggable .sortable-handler {
43 | cursor: move;
44 | }
45 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/brands.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 |
7 | @font-face {
8 | font-family: 'Font Awesome 5 Brands';
9 | font-style: normal;
10 | font-weight: 400;
11 | font-display: $fa-font-display;
12 | src: url('#{$fa-font-path}/fa-brands-400.eot');
13 | src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'),
14 | url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'),
15 | url('#{$fa-font-path}/fa-brands-400.woff') format('woff'),
16 | url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'),
17 | url('#{$fa-font-path}/fa-brands-400.svg#fontawesome') format('svg');
18 | }
19 |
20 | .fab {
21 | font-family: 'Font Awesome 5 Brands';
22 | font-weight: 400;
23 | }
24 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/solid.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 |
7 | @font-face {
8 | font-family: 'Font Awesome 5 Free';
9 | font-style: normal;
10 | font-weight: 900;
11 | font-display: $fa-font-display;
12 | src: url('#{$fa-font-path}/fa-solid-900.eot');
13 | src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
14 | url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
15 | url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
16 | url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
17 | url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
18 | }
19 |
20 | .fa,
21 | .fas {
22 | font-family: 'Font Awesome 5 Free';
23 | font-weight: 900;
24 | }
25 |
--------------------------------------------------------------------------------
/js/toolbar/inline.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | * @license GNU General Public License version 2 or later; see LICENSE.txt
4 | */
5 |
6 | ((document) => {
7 | 'use strict'
8 |
9 | const saveGroup = document.getElementById('toolbar-dropdown-save-group')
10 | if (saveGroup) {
11 | const toolbar = saveGroup.parentNode
12 | // Remove the dropdown toggle
13 | saveGroup.querySelector('.dropdown-toggle-split').remove()
14 |
15 | // Move the dropdown items outside
16 | saveGroup.querySelectorAll('joomla-toolbar-button').forEach((item) => {
17 | const button = item.querySelector('button')
18 | button.classList.remove('dropdown-item')
19 | button.classList.add('btn', 'btn-success')
20 |
21 | saveGroup.parentNode.insertBefore(item, saveGroup.nextSibling)
22 | })
23 |
24 | saveGroup.remove()
25 | }
26 |
27 | })(document)
28 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/regular.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 |
7 | @font-face {
8 | font-family: 'Font Awesome 5 Free';
9 | font-style: normal;
10 | font-weight: 400;
11 | font-display: $fa-font-display;
12 | src: url('#{$fa-font-path}/fa-regular-400.eot');
13 | src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
14 | url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
15 | url('#{$fa-font-path}/fa-regular-400.woff') format('woff'),
16 | url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'),
17 | url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
18 | }
19 |
20 | .far {
21 | font-family: 'Font Awesome 5 Free';
22 | font-weight: 400;
23 | }
24 |
--------------------------------------------------------------------------------
/js/com_cpanel/admin-cpanel-dnd.min.js:
--------------------------------------------------------------------------------
1 | (e=>{"use strict";const t=()=>{(()=>{const t=e.getElementById("cpanel-modules"),n=e.getElementById("card-columns"),l=localStorage.getItem("cpanel-modules");null!==l&&JSON.parse(l).forEach((l=>{const d=e.querySelector(`[data-cpanel-module-id="${l.id}"]`);null!==d&&(l.cardColumn?n.append(d):t.append(d),d.classList.remove("d-none"))})),e.querySelectorAll("[data-cpanel-module-id]").forEach((e=>{e.classList.remove("d-none")}))})(),dragula([e.getElementById("cpanel-modules"),e.getElementById("card-columns")],{moves:(e,t,{classList:n})=>n.contains("handle")}).on("dragend",(t=>(()=>{const t=[];e.querySelectorAll("[data-cpanel-module-id]").forEach((e=>{const n={};n.id=e.getAttribute("data-cpanel-module-id"),n.cardColumn="card-columns"===e.parentNode.id,t.push(n)})),localStorage.setItem("cpanel-modules",JSON.stringify(t))})())),e.removeEventListener("DOMContentLoaded",t)};e.addEventListener("DOMContentLoaded",t)})(document);
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/_rotated-flipped.scss:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
7 |
8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
10 | .#{$fa-css-prefix}-flip-both, .#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); }
11 |
12 | // Hook for IE8-9
13 | // -------------------------
14 |
15 | :root {
16 | .#{$fa-css-prefix}-rotate-90,
17 | .#{$fa-css-prefix}-rotate-180,
18 | .#{$fa-css-prefix}-rotate-270,
19 | .#{$fa-css-prefix}-flip-horizontal,
20 | .#{$fa-css-prefix}-flip-vertical,
21 | .#{$fa-css-prefix}-flip-both {
22 | filter: none;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "bettum",
3 | "version": "1.1.1",
4 | "description": "Bettum Template",
5 | "license": "GPL-3.0+",
6 | "repository": {
7 | "type": "git",
8 | "url": "git+https://github.com/C-Lodder/joomla4-backend-template.git"
9 | },
10 | "engines": {
11 | "node": ">=16"
12 | },
13 | "scripts": {
14 | "js": "node build-js.js",
15 | "zip": "node build-zip.js"
16 | },
17 | "browserslist": [
18 | "last 1 version"
19 | ],
20 | "dependencies": {
21 | "bootstrap": "^5.3.8"
22 | },
23 | "devDependencies": {
24 | "archiver": "^7.0.1",
25 | "autoprefixer": "^10.4.22",
26 | "cssnano": "^7.1.2",
27 | "gulp": "^5.0.1",
28 | "gulp-dart-sass": "^1.1.0",
29 | "gulp-header": "^2.0.9",
30 | "gulp-postcss": "^10.0.0",
31 | "gulp-rename": "^2.1.0",
32 | "gulp-sass": "^5.1.0",
33 | "postcss": "^8.5.6",
34 | "rtlcss": "^3.3.0",
35 | "sass": "^1.94.2",
36 | "terser": "^5.44.1"
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/sass/blocks/_toolbar.scss:
--------------------------------------------------------------------------------
1 | // Toolbar
2 |
3 | .d-unset {
4 | display: unset;
5 | }
6 |
7 | .btn-toolbar {
8 | display: flex;
9 | margin-bottom: 1rem;
10 | flex-wrap: wrap;
11 | justify-content: flex-start;
12 |
13 | > *:not(:last-child) {
14 | margin-inline-end: .5rem;
15 | }
16 | }
17 |
18 | .btn-group .dropdown-menu {
19 | background: $dropdown-bg;
20 | min-width: 100%;
21 |
22 | [class^='icon-'],
23 | [class*=' icon-'],
24 | .fas {
25 | width: 20px;
26 | }
27 |
28 | joomla-toolbar-button {
29 | border: none;
30 | }
31 | }
32 |
33 | .js-filters-show {
34 | display: block;
35 | }
36 |
37 | .subhead {
38 | background-color: var(--body-bg-color);
39 |
40 | .btn.dropdown-toggle {
41 | @extend .btn-primary;
42 | }
43 | }
44 |
45 | joomla-toolbar-button + .dropdown-toggle-split {
46 | @include border-end-radius($border-radius !important);
47 | }
48 |
49 | .btn-group joomla-toolbar-button:not(:last-child) > .btn:not(.dropdown-toggle) {
50 | @include border-end-radius(0);
51 | }
52 |
--------------------------------------------------------------------------------
/sass/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "bootstrap/functions";
3 | @import "bootstrap/variables";
4 | @import "bootstrap/maps";
5 | @import "bootstrap/mixins";
6 | @import "bootstrap/utilities";
7 |
8 | // Bettum Variables
9 | @import "variables";
10 |
11 |
12 |
13 | // Position
14 | // @include position('left', 0);
15 | @mixin position($position, $size) {
16 | $rtl-position: null;
17 | @if $position == 'left' {
18 | $rtl-position: right;
19 | } @else if $position == 'right' {
20 | $rtl-position: left;
21 | }
22 |
23 | @if $rtl and $rtl-position != null {
24 | #{$rtl-position}: $size;
25 | } @else {
26 | #{$position}: $size;
27 | }
28 | }
29 |
30 |
31 | // Translate
32 | // @include translate(0);
33 | @mixin translate($width) {
34 | @if $rtl and $width < 0 {
35 | transform: translateX(str-replace(#{$width}, "-", ""));
36 | } @else if $rtl not true and $width > 0 {
37 | transform: translateX($width);
38 | } @else {
39 | transform: translateX($width);
40 | }
41 | }
42 |
43 | @import "bootstrap/helpers";
44 | @import "bootstrap/utilities/api";
45 |
--------------------------------------------------------------------------------
/sass/bootstrap/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Toggles
2 | //
3 | // Used in conjunction with global variables to enable certain theme features.
4 |
5 | // Vendor
6 | @import "vendor/rfs";
7 |
8 | // Deprecate
9 | @import "mixins/deprecate";
10 |
11 | // Helpers
12 | @import "mixins/breakpoints";
13 | @import "mixins/color-scheme";
14 | @import "mixins/image";
15 | @import "mixins/resize";
16 | @import "mixins/visually-hidden";
17 | @import "mixins/reset-text";
18 | @import "mixins/text-truncate";
19 |
20 | // Utilities
21 | @import "mixins/utilities";
22 |
23 | // Components
24 | @import "mixins/alert";
25 | @import "mixins/backdrop";
26 | @import "mixins/buttons";
27 | @import "mixins/caret";
28 | @import "mixins/pagination";
29 | @import "mixins/lists";
30 | @import "mixins/list-group";
31 | @import "mixins/forms";
32 | @import "mixins/table-variants";
33 |
34 | // Skins
35 | @import "mixins/border-radius";
36 | @import "mixins/box-shadow";
37 | @import "mixins/gradients";
38 | @import "mixins/transition";
39 |
40 | // Layout
41 | @import "mixins/clearfix";
42 | @import "mixins/container";
43 | @import "mixins/grid";
44 |
--------------------------------------------------------------------------------
/sass/bootstrap/_placeholders.scss:
--------------------------------------------------------------------------------
1 | .placeholder {
2 | display: inline-block;
3 | min-height: 1em;
4 | vertical-align: middle;
5 | cursor: wait;
6 | background-color: currentcolor;
7 | opacity: $placeholder-opacity-max;
8 |
9 | &.btn::before {
10 | display: inline-block;
11 | content: "";
12 | }
13 | }
14 |
15 | // Sizing
16 | .placeholder-xs {
17 | min-height: .6em;
18 | }
19 |
20 | .placeholder-sm {
21 | min-height: .8em;
22 | }
23 |
24 | .placeholder-lg {
25 | min-height: 1.2em;
26 | }
27 |
28 | // Animation
29 | .placeholder-glow {
30 | .placeholder {
31 | animation: placeholder-glow 2s ease-in-out infinite;
32 | }
33 | }
34 |
35 | @keyframes placeholder-glow {
36 | 50% {
37 | opacity: $placeholder-opacity-min;
38 | }
39 | }
40 |
41 | .placeholder-wave {
42 | mask-image: linear-gradient(130deg, $black 55%, rgba(0, 0, 0, (1 - $placeholder-opacity-min)) 75%, $black 95%);
43 | mask-size: 200% 100%;
44 | animation: placeholder-wave 2s linear infinite;
45 | }
46 |
47 | @keyframes placeholder-wave {
48 | 100% {
49 | mask-position: -200% 0%;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/sass/pages/login.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "../bootstrap/functions";
3 | @import "../bootstrap/variables";
4 | @import "../bootstrap/maps";
5 | @import "../bootstrap/mixins";
6 | @import "../bootstrap/utilities";
7 |
8 | // Bettum Variables and Mixins
9 | @import "../mixins";
10 | @import "../variables";
11 |
12 | // Bootstrap
13 | @import "../bootstrap/root";
14 | @import "../bootstrap/reboot";
15 | @import "../bootstrap/type";
16 | @import "../bootstrap/images";
17 | @import "../bootstrap/forms";
18 | @import "../bootstrap/buttons";
19 |
20 | // Blocks
21 | @import "../blocks/global";
22 | @import "../blocks/alerts";
23 | @import "../blocks/form";
24 | //@import "../blocks/utilities/text";
25 | //@import "../blocks/utilities/height";
26 |
27 | // Helpers
28 | @import "../bootstrap/helpers";
29 |
30 | // Utilities
31 | @import "../bootstrap/utilities/api";
32 |
33 |
34 | // Login
35 | .login {
36 | width: 100%;
37 | max-width: 330px;
38 | padding: 15px;
39 | margin: 0 auto;
40 |
41 | h1 {
42 | margin-bottom: 2rem;
43 | }
44 | }
45 |
46 | .logo {
47 | width: 3rem;
48 | margin: 1.5rem 0;
49 | }
50 |
--------------------------------------------------------------------------------
/sass/pages/templates.scss:
--------------------------------------------------------------------------------
1 | // com_templates
2 | .com_templates {
3 |
4 | .menu-assignment {
5 | position: relative;
6 |
7 | .menu-links {
8 | padding-left: 0;
9 | margin-top: 15px;
10 | margin-left: 0;
11 | column-count: 3;
12 | column-gap: 15px;
13 |
14 | @include media-breakpoint-down(lg) {
15 | column-count: auto;
16 | }
17 |
18 | > li {
19 | display: inline-block;
20 | width: 100%;
21 | margin-bottom: 15px;
22 | vertical-align: top;
23 | list-style: none;
24 | backface-visibility: hidden;
25 | page-break-inside: avoid;
26 | break-inside: avoid;
27 | }
28 | }
29 |
30 | .menu-links-block {
31 | padding: 15px;
32 | background-color: var(--card-bg);
33 | border: 1px solid $border-color;
34 | border-radius: 3px;
35 | }
36 |
37 | label {
38 | display: block;
39 | padding: 3px 0;
40 | font-size: inherit;
41 |
42 | input {
43 | position: relative;
44 | margin-inline-end: 5px;
45 | }
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/html/com_config/application/default_navigation.php:
--------------------------------------------------------------------------------
1 |
14 |
15 | userIsSuperAdmin) : ?>
16 |
17 | -
18 |
19 |
20 |
21 |
22 | components as $component) : ?>
23 | -
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/sass/bootstrap/bootstrap.scss:
--------------------------------------------------------------------------------
1 | @import "mixins/banner";
2 | @include bsBanner("");
3 |
4 |
5 | // scss-docs-start import-stack
6 | // Configuration
7 | @import "functions";
8 | @import "variables";
9 | @import "maps";
10 | @import "mixins";
11 | @import "utilities";
12 |
13 | // Layout & components
14 | @import "root";
15 | @import "reboot";
16 | @import "type";
17 | @import "images";
18 | @import "containers";
19 | @import "grid";
20 | @import "tables";
21 | @import "forms";
22 | @import "buttons";
23 | @import "transitions";
24 | @import "dropdown";
25 | @import "button-group";
26 | @import "nav";
27 | @import "navbar";
28 | @import "card";
29 | @import "accordion";
30 | @import "breadcrumb";
31 | @import "pagination";
32 | @import "badge";
33 | @import "alert";
34 | @import "progress";
35 | @import "list-group";
36 | @import "close";
37 | @import "toasts";
38 | @import "modal";
39 | @import "tooltip";
40 | @import "popover";
41 | @import "carousel";
42 | @import "spinners";
43 | @import "offcanvas";
44 | @import "placeholders";
45 |
46 | // Helpers
47 | @import "helpers";
48 |
49 | // Utilities
50 | @import "utilities/api";
51 | // scss-docs-end import-stack
52 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_visually-hidden.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | // Hide content visually while keeping it accessible to assistive technologies
4 | //
5 | // See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/
6 | // See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/
7 |
8 | @mixin visually-hidden() {
9 | position: absolute !important;
10 | width: 1px !important;
11 | height: 1px !important;
12 | padding: 0 !important;
13 | margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686
14 | overflow: hidden !important;
15 | clip: rect(0, 0, 0, 0) !important;
16 | white-space: nowrap !important;
17 | border: 0 !important;
18 | }
19 |
20 | // Use to only display content when it's focused, or one of its child elements is focused
21 | // (i.e. when focus is within the element/container that the class was applied to)
22 | //
23 | // Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
24 |
25 | @mixin visually-hidden-focusable() {
26 | &:not(:focus):not(:focus-within) {
27 | @include visually-hidden();
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/sass/blocks/_table.scss:
--------------------------------------------------------------------------------
1 | // Table
2 |
3 | .table tbody tr:nth-of-type(#{$table-striped-order}) {
4 | background-color: var(--table-accent-bg);
5 | }
6 |
7 | .tbody-icon {
8 | padding: 0 3px;
9 | border: 0;
10 | text-align: center;
11 | background-color: transparent;
12 |
13 | [class*=" icon-"],
14 | [class^="icon-"] {
15 | display: inline-block;
16 | width: 26px;
17 | height: 26px;
18 | font-size: 1rem;
19 | line-height: 22px;
20 | color: var(--body-color);
21 | border: 1px solid var(--border-color);
22 | border-radius: 50%;
23 | }
24 |
25 | &.disabled {
26 | [class*=" icon-"],
27 | [class^="icon-"] {
28 | color: $gray-400;
29 | border-color: $gray-400;
30 | }
31 | }
32 |
33 | .icon-home,
34 | .icon-color-featured {
35 | color: $yellow !important;
36 | border-color: var(--yellow) !important;
37 | }
38 |
39 | .icon-unpublish,
40 | .icon-checkedout {
41 | color: $red !important;
42 | border-color: var(--red) !important;
43 | }
44 |
45 | .icon-publish,
46 | .fa-check {
47 | color: $green !important;
48 | border-color: var(--green) !important;
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_table-variants.scss:
--------------------------------------------------------------------------------
1 | // scss-docs-start table-variant
2 | @mixin table-variant($state, $background) {
3 | .table-#{$state} {
4 | $color: color-contrast(opaque($body-bg, $background));
5 | $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));
6 | $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));
7 | $active-bg: mix($color, $background, percentage($table-active-bg-factor));
8 | $border-color: mix($color, $background, percentage($table-border-factor));
9 |
10 | --#{$prefix}table-color: #{$color};
11 | --#{$prefix}table-bg: #{$background};
12 | --#{$prefix}table-border-color: #{$border-color};
13 | --#{$prefix}table-striped-bg: #{$striped-bg};
14 | --#{$prefix}table-striped-color: #{color-contrast($striped-bg)};
15 | --#{$prefix}table-active-bg: #{$active-bg};
16 | --#{$prefix}table-active-color: #{color-contrast($active-bg)};
17 | --#{$prefix}table-hover-bg: #{$hover-bg};
18 | --#{$prefix}table-hover-color: #{color-contrast($hover-bg)};
19 |
20 | color: var(--#{$prefix}table-color);
21 | border-color: var(--#{$prefix}table-border-color);
22 | }
23 | }
24 | // scss-docs-end table-variant
25 |
--------------------------------------------------------------------------------
/html/com_config/component/default_navigation.php:
--------------------------------------------------------------------------------
1 |
14 |
15 | userIsSuperAdmin) : ?>
16 |
17 | -
18 |
19 |
20 |
21 |
22 | components as $component) : ?>
23 | -
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/sass/media/com_media/components/_layout.scss:
--------------------------------------------------------------------------------
1 | /* General layout */
2 | .media-container {
3 | display: flex;
4 | flex-wrap: wrap;
5 | background-color: var(--secondary);
6 | border-radius: $border-radius;
7 | }
8 |
9 | .media-col-main-panel {
10 | flex: 0 0 $col-main-panel-width;
11 | max-width: $col-main-panel-width;
12 | }
13 |
14 | .media-col-side-panel {
15 | flex: 0 0 $col-side-panel-width;
16 | max-width: $col-side-panel-width;
17 | }
18 |
19 | [class^='media-col'], [class*=' media-col'] {
20 | position: relative;
21 | width: 100%;
22 | min-height: 1px;
23 | padding-inline-end: ($col-gutter-width * .5);
24 | padding-inline-start: ($col-gutter-width * .5);
25 | }
26 |
27 | @media (min-width: var(--breakpoint-md)) {
28 | [class^='media-col'], [class*=' media-col'] {
29 | flex: 0 0 100%;
30 | max-width: 100%;
31 | }
32 | }
33 |
34 | .media-main {
35 | position: relative;
36 | flex: 1 1 600px;
37 | height: calc(100vh - 160px);
38 | overflow: hidden;
39 | background-color: var(--secondary);
40 | border: 1px solid var(--border-color);
41 | border-radius: $border-radius;
42 | box-shadow: $col-box-shadow;
43 | }
44 |
45 | .media-sidebar {
46 | flex: 0 0 280px;
47 | padding: 1rem;
48 | overflow-y: auto;
49 | }
50 |
--------------------------------------------------------------------------------
/sass/bootstrap/_badge.scss:
--------------------------------------------------------------------------------
1 | // Base class
2 | //
3 | // Requires one of the contextual, color modifier classes for `color` and
4 | // `background-color`.
5 |
6 | .badge {
7 | // scss-docs-start badge-css-vars
8 | --#{$prefix}badge-padding-x: #{$badge-padding-x};
9 | --#{$prefix}badge-padding-y: #{$badge-padding-y};
10 | @include rfs($badge-font-size, --#{$prefix}badge-font-size);
11 | --#{$prefix}badge-font-weight: #{$badge-font-weight};
12 | --#{$prefix}badge-color: #{$badge-color};
13 | --#{$prefix}badge-border-radius: #{$badge-border-radius};
14 | // scss-docs-end badge-css-vars
15 |
16 | display: inline-block;
17 | padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x);
18 | @include font-size(var(--#{$prefix}badge-font-size));
19 | font-weight: var(--#{$prefix}badge-font-weight);
20 | line-height: 1;
21 | color: var(--#{$prefix}badge-color);
22 | text-align: center;
23 | white-space: nowrap;
24 | vertical-align: baseline;
25 | @include border-radius(var(--#{$prefix}badge-border-radius));
26 | @include gradient-bg();
27 |
28 | // Empty badges collapse automatically
29 | &:empty {
30 | display: none;
31 | }
32 | }
33 |
34 | // Quick fix for badges in buttons
35 | .btn .badge {
36 | position: relative;
37 | top: -1px;
38 | }
39 |
--------------------------------------------------------------------------------
/html/mod_frontend/default.php:
--------------------------------------------------------------------------------
1 |
14 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/sass/bootstrap/_close.scss:
--------------------------------------------------------------------------------
1 | // Transparent background and border properties included for button version.
2 | // iOS requires the button element instead of an anchor tag.
3 | // If you want the anchor version, it requires `href="#"`.
4 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
5 |
6 | .btn-close {
7 | box-sizing: content-box;
8 | width: $btn-close-width;
9 | height: $btn-close-height;
10 | padding: $btn-close-padding-y $btn-close-padding-x;
11 | color: $btn-close-color;
12 | background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements
13 | border: 0; // for button elements
14 | @include border-radius();
15 | opacity: $btn-close-opacity;
16 |
17 | // Override 's hover style
18 | &:hover {
19 | color: $btn-close-color;
20 | text-decoration: none;
21 | opacity: $btn-close-hover-opacity;
22 | }
23 |
24 | &:focus {
25 | outline: 0;
26 | box-shadow: $btn-close-focus-shadow;
27 | opacity: $btn-close-focus-opacity;
28 | }
29 |
30 | &:disabled,
31 | &.disabled {
32 | pointer-events: none;
33 | user-select: none;
34 | opacity: $btn-close-disabled-opacity;
35 | }
36 | }
37 |
38 | .btn-close-white {
39 | filter: $btn-close-white-filter;
40 | }
41 |
--------------------------------------------------------------------------------
/sass/bootstrap/forms/_labels.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Labels
3 | //
4 |
5 | .form-label {
6 | margin-bottom: $form-label-margin-bottom;
7 | @include font-size($form-label-font-size);
8 | font-style: $form-label-font-style;
9 | font-weight: $form-label-font-weight;
10 | color: $form-label-color;
11 | }
12 |
13 | // For use with horizontal and inline forms, when you need the label (or legend)
14 | // text to align with the form controls.
15 | .col-form-label {
16 | padding-top: add($input-padding-y, $input-border-width);
17 | padding-bottom: add($input-padding-y, $input-border-width);
18 | margin-bottom: 0; // Override the `';
58 |
59 | echo implode('', $html);
60 |
--------------------------------------------------------------------------------
/js/com_templates/admin-template-compare.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | * @license GNU General Public License version 2 or later; see LICENSE.txt
4 | */
5 |
6 | (() => {
7 | 'use strict'
8 |
9 | // This method is used to decode HTML entities
10 | const decodeHtml = html => {
11 | const textarea = document.createElement('textarea')
12 | textarea.innerHTML = html
13 | return textarea.value
14 | }
15 |
16 | const compare = (original, changed) => {
17 | const display = changed.nextElementSibling
18 | const diff = Diff.diffLines(original.innerHTML, changed.innerHTML)
19 | const fragment = document.createDocumentFragment()
20 | diff.forEach(part => {
21 | const pre = document.createElement('pre')
22 |
23 | if (part.added) {
24 | pre.classList.add('added')
25 | } else if (part.removed) {
26 | pre.classList.add('removed')
27 | }
28 |
29 | pre.appendChild(document.createTextNode(decodeHtml(part.value)))
30 | fragment.appendChild(pre)
31 | })
32 | display.appendChild(fragment)
33 | }
34 |
35 | const onBoot = () => {
36 | const original = document.getElementById('original')
37 | compare(original, original.nextElementSibling)
38 |
39 | document.removeEventListener('DOMContentLoaded', onBoot)
40 | }
41 |
42 | document.addEventListener('DOMContentLoaded', onBoot)
43 | })()
44 |
--------------------------------------------------------------------------------
/sass/media/com_media/components/_animations.scss:
--------------------------------------------------------------------------------
1 | /* Animations */
2 |
3 | // slide-fade
4 | .slide-fade-enter-active {
5 | transition: all .3s cubic-bezier(.4, 0, .2, 1);
6 | }
7 |
8 | .slide-fade-leave-active {
9 | transition: all .2s cubic-bezier(.4, 0, .2, 1);
10 | }
11 |
12 | .slide-fade-enter, .slide-fade-leave-to {
13 | opacity: 0;
14 | transform: translateY(-10px);
15 | }
16 |
17 | // Infobar
18 | .infobar-enter-active {
19 | animation: slideOutRight .2s reverse;
20 |
21 | [dir=rtl] & {
22 | animation: slideOutLeft .2s reverse;
23 | }
24 | }
25 |
26 | .infobar-leave-active {
27 | animation: slideOutRight .2s;
28 |
29 | [dir=rtl] & {
30 | animation: slideOutLeft .2s;
31 | }
32 | }
33 |
34 | // Slide out right animation
35 | @keyframes slideOutRight {
36 | from {
37 | transform: translateX(0);
38 | }
39 |
40 | to {
41 | visibility: hidden;
42 | transform: translateX(100%);
43 | }
44 | }
45 |
46 | @keyframes slideOutLeft {
47 | from {
48 | transform: translateX();
49 | }
50 |
51 | to {
52 | visibility: hidden;
53 | transform: translateX(-100%);
54 | }
55 | }
56 |
57 | // Bounce in animation
58 | .fade-in-enter-active {
59 | animation: fadeIn .2s;
60 | }
61 |
62 | .fade-in-leave-active {
63 | animation: fadeIn .2s reverse;
64 | }
65 |
66 | @keyframes fadeIn {
67 | from {
68 | opacity: 0;
69 | }
70 | to {
71 | opacity: 1;
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/sass/pages/dashboard.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "../bootstrap/functions";
3 | @import "../bootstrap/variables";
4 | @import "../bootstrap/maps";
5 | @import "../bootstrap/mixins";
6 |
7 | // Bettum Variables and Mixins
8 | @import "../mixins";
9 | @import "../variables";
10 |
11 | // Dashboard
12 | .cpanel-modules {
13 | .card {
14 | box-shadow: $shadow-default;
15 | }
16 |
17 | .card-body .list-group-flush {
18 | margin-left: -$card-spacer-x;
19 | margin-right: -$card-spacer-x;
20 | }
21 |
22 | .table {
23 | margin-bottom: 0;
24 | }
25 | }
26 |
27 | .card {
28 | box-shadow: $shadow-default;
29 | }
30 |
31 | .card-header {
32 | display: flex;
33 | flex-direction: row-reverse;
34 | justify-content: space-between;
35 | align-items: center;
36 | }
37 |
38 | .cpanel-add-module {
39 | margin: 2rem 0;
40 | border: 2px dashed var(--border-color);
41 | }
42 |
43 | .well {
44 | background-color: transparent !important;
45 | background-image: none;
46 | box-shadow: none !important;
47 |
48 | .card-header {
49 | background-color: transparent !important;
50 | padding: 8px 0px;
51 | }
52 |
53 | .card-body {
54 | padding: 0;
55 | }
56 | }
57 |
58 | // Temporarily use CSS Grid
59 | @include media-breakpoint-up(sm) {
60 | .card-columns {
61 | column-count: 2;
62 |
63 | .card {
64 | display: inline-block;
65 | width: 100%;
66 | }
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/html/layouts/joomla/installer/changelog.php:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
51 | -
52 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/sass/media/system/fields/joomla-field-media.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "../../../bootstrap/functions";
3 | @import "../../../bootstrap/variables";
4 | @import "../../../bootstrap/mixins";
5 |
6 | // Bettum Variables and mixins
7 | @import "../../../mixins";
8 | @import "../../../variables";
9 |
10 |
11 | joomla-field-media {
12 | .field-media-preview {
13 | display: flex;
14 | align-items: center;
15 | justify-content: center;
16 | max-width: 356px;
17 | height: 180px;
18 | padding: 10px;
19 | overflow: hidden;
20 | background-color: var(--primary);
21 | border: 1px solid var(--border-color);
22 | border-width: 1px 1px 0;
23 | }
24 |
25 | .field-media-preview-icon {
26 | width: 7rem;
27 | height: 7rem;
28 | background-size: 7rem;
29 | background-image: str-replace(url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='#{$text-color}' d='M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 336H54a6 6 0 0 1-6-6V118a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v276a6 6 0 0 1-6 6zM128 152c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zM96 352h320v-80l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L192 304l-39.515-39.515c-4.686-4.686-12.284-4.686-16.971 0L96 304v48z'/%3E%3C/svg%3E"), "#", "%23");
30 | }
31 |
32 | img {
33 | max-width: 100%;
34 | max-height: 100%;
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/sass/bootstrap/bootstrap-grid.scss:
--------------------------------------------------------------------------------
1 | @import "mixins/banner";
2 | @include bsBanner(Grid);
3 |
4 | $include-column-box-sizing: true !default;
5 |
6 | @import "functions";
7 | @import "variables";
8 | @import "maps";
9 |
10 | @import "mixins/lists";
11 | @import "mixins/breakpoints";
12 | @import "mixins/container";
13 | @import "mixins/grid";
14 | @import "mixins/utilities";
15 |
16 | @import "vendor/rfs";
17 |
18 | @import "root";
19 |
20 | @import "containers";
21 | @import "grid";
22 |
23 | @import "utilities";
24 | // Only use the utilities we need
25 | // stylelint-disable-next-line scss/dollar-variable-default
26 | $utilities: map-get-multiple(
27 | $utilities,
28 | (
29 | "display",
30 | "order",
31 | "flex",
32 | "flex-direction",
33 | "flex-grow",
34 | "flex-shrink",
35 | "flex-wrap",
36 | "justify-content",
37 | "align-items",
38 | "align-content",
39 | "align-self",
40 | "margin",
41 | "margin-x",
42 | "margin-y",
43 | "margin-top",
44 | "margin-end",
45 | "margin-bottom",
46 | "margin-start",
47 | "negative-margin",
48 | "negative-margin-x",
49 | "negative-margin-y",
50 | "negative-margin-top",
51 | "negative-margin-end",
52 | "negative-margin-bottom",
53 | "negative-margin-start",
54 | "padding",
55 | "padding-x",
56 | "padding-y",
57 | "padding-top",
58 | "padding-end",
59 | "padding-bottom",
60 | "padding-start",
61 | )
62 | );
63 |
64 | @import "utilities/api";
65 |
--------------------------------------------------------------------------------
/sass/fontawesome-free/scss/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | @mixin fa-icon {
5 | -webkit-font-smoothing: antialiased;
6 | -moz-osx-font-smoothing: grayscale;
7 | display: inline-block;
8 | font-style: normal;
9 | font-variant: normal;
10 | font-weight: normal;
11 | line-height: 1;
12 | }
13 |
14 | @mixin fa-icon-rotate($degrees, $rotation) {
15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
16 | transform: rotate($degrees);
17 | }
18 |
19 | @mixin fa-icon-flip($horiz, $vert, $rotation) {
20 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
21 | transform: scale($horiz, $vert);
22 | }
23 |
24 |
25 | // Only display content to screen readers. A la Bootstrap 4.
26 | //
27 | // See: http://a11yproject.com/posts/how-to-hide-content/
28 |
29 | @mixin sr-only {
30 | border: 0;
31 | clip: rect(0, 0, 0, 0);
32 | height: 1px;
33 | margin: -1px;
34 | overflow: hidden;
35 | padding: 0;
36 | position: absolute;
37 | width: 1px;
38 | }
39 |
40 | // Use in conjunction with .sr-only to only display content when it's focused.
41 | //
42 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
43 | //
44 | // Credit: HTML5 Boilerplate
45 |
46 | @mixin sr-only-focusable {
47 | &:active,
48 | &:focus {
49 | clip: auto;
50 | height: auto;
51 | margin: 0;
52 | overflow: visible;
53 | position: static;
54 | width: auto;
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/js/com_contenthistory/admin-compare-compare.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | * @license GNU General Public License version 2 or later; see LICENSE.txt
4 | */
5 |
6 | (() => {
7 | 'use strict'
8 |
9 | // This method is used to decode HTML entities
10 | const decodeHtml = html => {
11 | const textarea = document.createElement('textarea')
12 | textarea.innerHTML = html
13 | return textarea.value
14 | }
15 |
16 | const compare = (original, changed) => {
17 | const display = changed.nextElementSibling
18 | const diff = window.Diff.diffWords(original.innerHTML, changed.innerHTML)
19 | const fragment = document.createDocumentFragment()
20 | diff.forEach(part => {
21 | let node
22 |
23 | if (part.added) {
24 | node = document.createElement('ins')
25 | } else if (part.removed) {
26 | node = document.createElement('del')
27 | } else {
28 | node = document.createElement('span')
29 | }
30 |
31 | node.appendChild(document.createTextNode(decodeHtml(part.value)))
32 | fragment.appendChild(node)
33 | })
34 | display.appendChild(fragment)
35 | }
36 |
37 | const onBoot = () => {
38 | const diffs = document.querySelectorAll('.original')
39 | diffs.forEach(fragment => {
40 | compare(fragment, fragment.nextElementSibling)
41 | })
42 |
43 | document.removeEventListener('DOMContentLoaded', onBoot)
44 | }
45 |
46 | document.addEventListener('DOMContentLoaded', onBoot)
47 | })()
48 |
--------------------------------------------------------------------------------
/js/com_cpanel/admin-cpanel-default.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | * @license GNU General Public License version 2 or later; see LICENSE.txt
4 | */
5 |
6 | ((document, Joomla) => {
7 | 'use strict'
8 |
9 | Joomla.unpublishModule = element => {
10 | // Get variables
11 | const baseUrl = 'index.php?option=com_modules&task=modules.unpublish&format=json'
12 | Joomla.request({
13 | url: `${baseUrl}&cid=${element.getAttribute('data-module-id')}`,
14 | method: 'POST',
15 | headers: {
16 | 'Content-Type': 'application/json'
17 | },
18 | onSuccess: () => {
19 | const wrapper = element.closest('.module-wrapper')
20 | wrapper.parentNode.removeChild(wrapper)
21 | Joomla.renderMessages({
22 | message: [Joomla.JText._('COM_CPANEL_UNPUBLISH_MODULE_SUCCESS')]
23 | })
24 | },
25 | onError: () => {
26 | Joomla.renderMessages({
27 | error: [Joomla.JText._('COM_CPANEL_UNPUBLISH_MODULE_ERROR')]
28 | })
29 | }
30 | })
31 | }
32 |
33 | const onBoot = () => {
34 | const content = document.getElementById('content')
35 | if (content) {
36 | content.querySelectorAll('.unpublish-module').forEach(link => {
37 | link.addEventListener('click', ({ target }) => Joomla.unpublishModule(target))
38 | })
39 | }
40 |
41 | document.removeEventListener('DOMContentLoaded', onBoot)
42 | }
43 |
44 | document.addEventListener('DOMContentLoaded', onBoot)
45 |
46 | })(document, Joomla)
--------------------------------------------------------------------------------
/js/com_users/two-factor-switcher.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | * @license GNU General Public License version 2 or later; see LICENSE.txt
4 | */
5 |
6 | ((Joomla) => {
7 | 'use strict'
8 |
9 | const hideA11ySettings = () => {
10 | const settings = document.getElementById('fieldset-accessibility')
11 | if (settings) {
12 | const div = settings.querySelector('div')
13 | // Remove the settings from the DOM
14 | div.remove()
15 |
16 | // Build the alert
17 | const alert = document.createElement('div')
18 | alert.classList.add('alert', 'alert-info')
19 | alert.innerText = 'Accessibility settings should be changed in your operating system or browser settings.'
20 |
21 | // Append the alert
22 | settings.append(alert)
23 | }
24 | }
25 |
26 | document.addEventListener('DOMContentLoaded', () => {
27 | Joomla.twoFactorMethodChange = () => {
28 | const method = document.getElementById('jform_twofactor_method')
29 | if (method) {
30 | const selectedPane = `com_users_twofactor_${method.value}`
31 | const twoFactorForms = document.querySelectorAll('#com_users_twofactor_forms_container > div')
32 | twoFactorForms.forEach((value) => {
33 | const { id } = value
34 | if (id !== selectedPane) {
35 | document.getElementById(id).classList.add('hidden')
36 | } else {
37 | document.getElementById(id).classList.remove('hidden')
38 | }
39 | })
40 | }
41 | }
42 |
43 | hideA11ySettings()
44 | })
45 | })(Joomla)
46 |
--------------------------------------------------------------------------------
/js/mod_menu/admin-menu-sidebar.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | * @license GNU General Public License version 2 or later; see LICENSE.txt
4 | */
5 |
6 | ((document) => {
7 | 'use strict'
8 |
9 | const sidebar = document.getElementById('bettum-sidebar')
10 |
11 | if (sidebar) {
12 | // Toggle the sidebar
13 | const navbarToggle = document.getElementById('navbar-toggler')
14 | navbarToggle.addEventListener('click', () => {
15 | sidebar.classList.toggle('show')
16 | if (sidebar.classList.contains('show')) {
17 | navbarToggle.setAttribute('aria-expanded', true)
18 | } else {
19 | navbarToggle.setAttribute('aria-expanded', false)
20 | }
21 | })
22 |
23 | // Keep the active dropdown shown on page load
24 | const currentUrl = window.location.href.toLowerCase()
25 | sidebar.querySelectorAll('.sidebar-item').forEach(link => {
26 | if (currentUrl === link.href) {
27 | link.setAttribute('aria-current', 'page')
28 |
29 | if (!link.hasAttribute('data-toggle')) {
30 | const firstLevel = link.closest('.collapse-level-1')
31 | const secondLevel = link.closest('.collapse-level-2')
32 | if (firstLevel) {
33 | firstLevel.previousElementSibling.setAttribute('aria-expanded', true)
34 | firstLevel.classList.add('show')
35 | }
36 | if (secondLevel) {
37 | secondLevel.previousElementSibling.setAttribute('aria-expanded', true)
38 | secondLevel.classList.add('show')
39 | }
40 | }
41 | }
42 | })
43 | }
44 |
45 | })(document)
46 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Bettum
2 |
3 | A dark themed administrator template for Joomla 4.x
4 |
5 | ## Benefits of Bettum
6 |
7 | - Easier on the eyes
8 | - Saves battery life
9 | - Less bloat
10 | - Simple and familiar UI
11 | - Performance
12 |
13 | ## Browser Support
14 |
15 |  |  |  |  |  | 
16 | --- | --- | --- | --- | --- | --- |
17 | Latest :heavy_check_mark: | Latest :heavy_check_mark: | Latest :heavy_check_mark: | 11+ :x: | Latest :heavy_check_mark: | Latest :heavy_check_mark: |
18 |
19 | ## Contributing
20 | - Clone the repository:
21 | ```bash
22 | git clone https://github.com/C-Lodder/joomla4-backend-template.git
23 | ```
24 | - Go to the folder:
25 | ```bash
26 | cd
27 | ```
28 | - Install dependencies:
29 | ```bash
30 | npm i
31 | ```
32 | - Checkout a new branch:
33 | ```bash
34 | git checkout -b
35 | ```
36 |
37 | ## Build tasks:
38 | - Compile SCSS and minify CSS
39 | ```bash
40 | gulp build
41 | ```
42 |
43 | - Minify JS
44 | ```bash
45 | npm run js
46 | ```
47 |
48 | - Create an installation ZIP file
49 | ```bash
50 | npm run zip
51 | ```
52 |
53 | ## Screenshot:
54 |
55 | 
56 |
--------------------------------------------------------------------------------
/html/mod_post_installation_messages/default.php:
--------------------------------------------------------------------------------
1 | input->getBool('hidemainmenu');
14 |
15 | if ($hideLinks || $messagesCount < 1)
16 | {
17 | return;
18 | }
19 | ?>
20 | getIdentity()->authorise('core.manage', 'com_postinstall')) : ?>
21 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/html/mod_messages/default.php:
--------------------------------------------------------------------------------
1 | input->getBool('hidemainmenu');
18 | $countUnread = $app->getSession()->get('messages.unread');
19 |
20 | ?>
21 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/sass/media/com_installer/installer.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "../../bootstrap/functions";
3 | @import "../../bootstrap/variables";
4 | @import "../../bootstrap/mixins";
5 |
6 | // Bettum Variables and mixins
7 | @import "../../mixins";
8 | @import "../../variables";
9 |
10 |
11 | // Installer
12 | #loading {
13 | position: fixed;
14 | background-image: url(../../system/images/ajax-loader.gif);
15 | background-color: rgba($white, .8);
16 | background-repeat: no-repeat;
17 | background-position: center center;
18 | opacity: .8;
19 | overflow: hidden;
20 | }
21 |
22 | #dragarea {
23 | background-color: var(--secondary);
24 | border: 1px dashed var(--border-color);
25 | padding: 4rem 0;
26 | transition: all .2s ease 0s;
27 |
28 | #upload-icon,
29 | p.lead {
30 | color: var(--body-color);
31 | }
32 |
33 | &.hover {
34 | border-color: $text-color;
35 | background-color: var(--primary);
36 | }
37 |
38 | &[data-state=pending] {
39 | .upload-progress,
40 | .install-progress {
41 | display: none;
42 | }
43 | }
44 |
45 | &[data-state=uploading] {
46 | .install-progress,
47 | .upload-actions {
48 | display: none;
49 | }
50 | }
51 |
52 | &[data-state=installing] {
53 | .upload-progress,
54 | .upload-actions {
55 | display: none;
56 | }
57 | }
58 | }
59 |
60 | #upload-icon {
61 | font-size: 3rem;
62 | color: var(--body-color);
63 | transition: all .2s;
64 | }
65 |
66 | .upload-progress,
67 | .install-progress {
68 | width: 50%;
69 | margin: 5px auto;
70 | }
71 |
72 | // Default transition (.3s) is too slow, progress will not run to 100%
73 | .upload-progress .progress .bar {
74 | transition: width .1s;
75 | }
76 |
--------------------------------------------------------------------------------
/sass/blocks/_quickicons.scss:
--------------------------------------------------------------------------------
1 | // Quick Icons
2 |
3 | .quick-icons {
4 | display: grid;
5 | padding: 0;
6 | grid-template-columns: repeat(auto-fit, minmax(180px, 1fr ));
7 | grid-gap: 1rem;
8 |
9 | li {
10 | margin: 0;
11 | padding: 0;
12 | list-style: none;
13 | }
14 | }
15 |
16 | .quickicon-group,
17 | .quickicon {
18 | flex: 0 0;
19 | }
20 |
21 | .quickicon a {
22 | display: flex;
23 | align-content: center;
24 | flex-wrap: wrap;
25 | justify-content: center;
26 | flex-direction: column;
27 | min-height: 6.5rem;
28 | padding: 2rem 0;
29 | background-color: var(--quickicon-bg);
30 | color: var(--body-color);
31 | text-align: center;
32 | transition: all .2s ease-in-out;
33 | border: 1px solid var(--quickicon-border-color);
34 | border-radius: 6px;
35 | box-shadow: $quickicon-box-shadow;
36 |
37 | &:hover,
38 | &:focus {
39 | box-shadow: $quickicon-hover-box-shadow;
40 | text-decoration: none;
41 | transition: all .2s ease-in-out;
42 | }
43 |
44 | &.success {
45 | border: 1px solid var(--green);
46 |
47 | .quickicon-icon,
48 | .quickicon-text {
49 | color: var(--green);
50 | }
51 | }
52 |
53 | &.danger {
54 | border: 1px solid var(--red);
55 |
56 | .quickicon-icon,
57 | .quickicon-text {
58 | color: var(--red);
59 | }
60 | }
61 | }
62 |
63 | .quickicon-icon,
64 | .quickicon-name {
65 | justify-content: center;
66 | }
67 |
68 | .quickicon-icon {
69 | font-size: 2.2rem;
70 | margin-bottom: .75rem;
71 | color: $quickicon-icon-color;
72 | }
73 |
74 | .quickicon-name,
75 | .quickicon-text {
76 | font-size: .9rem;
77 | line-height: 1.2;
78 | }
79 |
80 | .quickicon-linkadd {
81 | display: none;
82 | }
83 |
--------------------------------------------------------------------------------
/sass/template-light.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "bootstrap/functions";
3 | @import "bootstrap/variables";
4 | @import "bootstrap/maps";
5 | @import "bootstrap/mixins";
6 | @import "bootstrap/utilities";
7 |
8 | // Bettum Variables and Mixins
9 | @import "mixins";
10 | @import "variables-light";
11 |
12 | // Bootstrap
13 | @import "bootstrap/root";
14 | @import "bootstrap/reboot";
15 | @import "bootstrap/type";
16 | @import "bootstrap/images";
17 | @import "bootstrap/containers";
18 | @import "bootstrap/grid";
19 | @import "bootstrap/tables";
20 | @import "bootstrap/forms";
21 | @import "bootstrap/buttons";
22 | @import "bootstrap/transitions";
23 | @import "bootstrap/dropdown";
24 | @import "bootstrap/button-group";
25 | @import "bootstrap/nav";
26 | @import "bootstrap/navbar";
27 | @import "bootstrap/card";
28 | @import "bootstrap/breadcrumb";
29 | @import "bootstrap/pagination";
30 | @import "bootstrap/badge";
31 | @import "bootstrap/alert";
32 | @import "bootstrap/progress";
33 | @import "bootstrap/list-group";
34 | @import "bootstrap/close";
35 | @import "bootstrap/modal";
36 | @import "bootstrap/tooltip";
37 | @import "bootstrap/popover";
38 |
39 |
40 | // Blocks
41 | @import "blocks/global";
42 | @import "blocks/alerts";
43 | @import "blocks/buttons";
44 | @import "blocks/form";
45 | @import "blocks/nav";
46 | @import "blocks/iframe";
47 | @import "blocks/meter";
48 | @import "blocks/modal";
49 | @import "blocks/treeselect";
50 | @import "blocks/quickicons";
51 | @import "blocks/table";
52 | @import "blocks/tooltip";
53 | @import "blocks/toolbar";
54 | @import "blocks/utils";
55 |
56 | // Vendor Overrides
57 | @import "media/vendor/codemirror";
58 |
59 | @import "bootstrap/helpers";
60 | @import "bootstrap/utilities/api";
61 |
--------------------------------------------------------------------------------
/component.php:
--------------------------------------------------------------------------------
1 | 'auto', 'relative' => true], ['type' => 'module']);
18 |
19 | HTMLHelper::_('stylesheet', 'template' . ($this->direction === 'rtl' ? '-rtl' : '') . '.css', ['version' => 'auto', 'relative' => true]);
20 | HTMLHelper::_('stylesheet', 'fontawesome.css', ['version' => 'auto', 'relative' => true]);
21 | HTMLHelper::_('stylesheet', 'custom.css', ['version' => 'auto', 'relative' => true]);
22 |
23 | $cachesStyleSheets = json_encode(array_keys($this->_styleSheets));
24 |
25 | foreach (array_keys($this->_styleSheets) as $style)
26 | {
27 | unset($this->_styleSheets[$style]);
28 | }
29 | ?>
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/sass/media/com_media/components/_media-modal.scss:
--------------------------------------------------------------------------------
1 | .media-modal-backdrop {
2 | position: fixed;
3 | top: 0;
4 | left: 0;
5 | z-index: 1049;
6 | display: table;
7 | width: 100%;
8 | height: 100%;
9 | background-color: $modal-backdrop-color;
10 |
11 | .modal {
12 | display: flex;
13 | align-items: center;
14 | justify-content: center;
15 | animation: .5s ease 0s normal none 1 running fadeIn;
16 | }
17 |
18 | .modal-body {
19 | width: auto;
20 | padding: 15px;
21 | }
22 |
23 | .modal-content {
24 | box-shadow: $modal-box-shadow;
25 | }
26 |
27 | }
28 |
29 | .media-preview-modal {
30 | color: $modal-preview-text-color;
31 |
32 | .modal-dialog {
33 | max-width: 70vw;
34 | max-height: 70vh;
35 | }
36 | .modal-content {
37 | display: flex;
38 | flex-direction: column;
39 | align-items: flex-start;
40 | background-color: transparent;
41 | border: 0;
42 | box-shadow: none;
43 | }
44 | .modal-header {
45 | width: 100%;
46 | padding: 0;
47 | border: 0;
48 | }
49 | .modal-body {
50 | padding: 0;
51 | background-color: $primary;
52 | box-shadow: $modal-box-shadow;
53 | img {
54 | max-width: 100%;
55 | }
56 | }
57 | .modal-footer {
58 | display: none;
59 | }
60 | }
61 |
62 | .media-preview-close {
63 | font-size: 3rem;
64 | background: none;
65 | border: none;
66 | color: inherit;
67 | &:hover {
68 | cursor: pointer;
69 | opacity: 1;
70 | }
71 | }
72 |
73 | @keyframes fadeInUp {
74 | from {
75 | opacity: 0;
76 | transition: transform .3s ease-out;
77 | transform: translate(0, -25%);
78 | }
79 |
80 | to {
81 | opacity: 1;
82 | transform: none;
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_caret.scss:
--------------------------------------------------------------------------------
1 | // scss-docs-start caret-mixins
2 | @mixin caret-down {
3 | border-top: $caret-width solid;
4 | border-right: $caret-width solid transparent;
5 | border-bottom: 0;
6 | border-left: $caret-width solid transparent;
7 | }
8 |
9 | @mixin caret-up {
10 | border-top: 0;
11 | border-right: $caret-width solid transparent;
12 | border-bottom: $caret-width solid;
13 | border-left: $caret-width solid transparent;
14 | }
15 |
16 | @mixin caret-end {
17 | border-top: $caret-width solid transparent;
18 | border-right: 0;
19 | border-bottom: $caret-width solid transparent;
20 | border-left: $caret-width solid;
21 | }
22 |
23 | @mixin caret-start {
24 | border-top: $caret-width solid transparent;
25 | border-right: $caret-width solid;
26 | border-bottom: $caret-width solid transparent;
27 | }
28 |
29 | @mixin caret($direction: down) {
30 | @if $enable-caret {
31 | &::after {
32 | display: inline-block;
33 | margin-left: $caret-spacing;
34 | vertical-align: $caret-vertical-align;
35 | content: "";
36 | @if $direction == down {
37 | @include caret-down();
38 | } @else if $direction == up {
39 | @include caret-up();
40 | } @else if $direction == end {
41 | @include caret-end();
42 | }
43 | }
44 |
45 | @if $direction == start {
46 | &::after {
47 | display: none;
48 | }
49 |
50 | &::before {
51 | display: inline-block;
52 | margin-right: $caret-spacing;
53 | vertical-align: $caret-vertical-align;
54 | content: "";
55 | @include caret-start();
56 | }
57 | }
58 |
59 | &:empty::after {
60 | margin-left: 0;
61 | }
62 | }
63 | }
64 | // scss-docs-end caret-mixins
65 |
--------------------------------------------------------------------------------
/html/mod_version/default.php:
--------------------------------------------------------------------------------
1 |
14 |
19 |
--------------------------------------------------------------------------------
/html/layouts/plugins/system/stats/message.php:
--------------------------------------------------------------------------------
1 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | render('stats', compact('statsData'));
32 | ?>
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/js/com_modules/admin-select-modal.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | * @license GNU General Public License version 2 or later; see LICENSE.txt
4 | */
5 |
6 | ((document) => {
7 | 'use strict'
8 |
9 | document.addEventListener('DOMContentLoaded', () => {
10 | const newModuleList = document.getElementById('new-modules-list')
11 | const selectLinks = newModuleList.querySelectorAll('.select-link')
12 |
13 | selectLinks.forEach((link) => {
14 | link.addEventListener('click', ({ currentTarget, target }) => {
15 | let targetElem = currentTarget
16 |
17 | // There is some bug with events in iframe where currentTarget is "null"
18 | // => prevent this here by bubble up
19 | if (!targetElem) {
20 | targetElem = target
21 |
22 | if (targetElem && !targetElem.classList.contains('select-link')) {
23 | targetElem = targetElem.parentNode
24 | }
25 | }
26 |
27 | const functionName = targetElem.getAttribute('data-function')
28 |
29 | if (functionName && typeof window.parent[functionName] === 'function') {
30 | window.parent[functionName](targetElem)
31 | }
32 | })
33 | })
34 |
35 | document.getElementById('new-modules-list-search').addEventListener('input', ({ target }) => {
36 | newModuleList.querySelectorAll('.name').forEach((name) => {
37 | const item = name.closest('li')
38 | if (!name.innerText.toLowerCase().includes(target.value.toLowerCase())) {
39 | item.classList.add('d-none')
40 | item.classList.remove('d-flex')
41 | } else {
42 | item.classList.add('d-flex')
43 | item.classList.remove('d-none')
44 | }
45 | })
46 | })
47 | })
48 | })(document)
49 |
--------------------------------------------------------------------------------
/sass/media/com_media/components/_media-toolbar.scss:
--------------------------------------------------------------------------------
1 | .media-toolbar {
2 | position: relative;
3 | display: flex;
4 | padding: 0;
5 | background-color: $toolbar-bg;
6 | border-bottom: 1px solid var(--border-color);
7 | border-radius: $border-radius $border-radius 0 0;
8 |
9 | input {
10 | padding: .3rem .75rem;
11 | }
12 |
13 | &-icon {
14 | display: inline-block;
15 | width: $toolbar-icon-width;
16 | font-size: 1.3rem;
17 | line-height: $toolbar-height;
18 | color: $body-color;
19 | text-align: center;
20 | background-color: transparent;
21 | border: 0;
22 | border-inline-start: 1px solid var(--border-color);
23 | &:hover {
24 | background-color: $toolbar-icon-bg-hover;
25 | box-shadow: none;
26 | }
27 | }
28 |
29 | &-select-all {
30 | width: 1rem;
31 | margin: 1rem;
32 | }
33 |
34 | @include media-breakpoint-down(lg) {
35 | div:last-child {
36 | margin-left: auto;
37 | }
38 | }
39 | }
40 |
41 | .media-view-icons {
42 | display: flex;
43 | }
44 |
45 | .media-view-icons {
46 | .disabled {
47 | span {
48 | opacity: .3;
49 | }
50 | &:hover, span:hover {
51 | cursor: default;
52 | }
53 | }
54 | }
55 |
56 | .media-view-search-input {
57 | display: none;
58 | align-items: center;
59 | padding: 0 10px;
60 |
61 | @include media-breakpoint-up(md) {
62 | display: flex;
63 | }
64 | }
65 |
66 | .media-loader {
67 | position: absolute;
68 | right: 100%;
69 | bottom: 0;
70 | left: 0;
71 | z-index: 10;
72 | height: $toolbar-loader-height;
73 | background-image: $toolbar-loader-color;
74 | animation: 10s ease 0s normal none 1 running mediaLoader;
75 | animation-fill-mode: forwards;
76 | }
77 |
78 | @keyframes mediaLoader {
79 | from {
80 | right: 100%;
81 | }
82 |
83 | to {
84 | right: 0;
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/sass/bootstrap/_maps.scss:
--------------------------------------------------------------------------------
1 | // Re-assigned maps
2 | //
3 | // Placed here so that others can override the default Sass maps and see automatic updates to utilities and more.
4 |
5 | // scss-docs-start theme-colors-rgb
6 | $theme-colors-rgb: map-loop($theme-colors, to-rgb, "$value") !default;
7 | // scss-docs-end theme-colors-rgb
8 |
9 | // Utilities maps
10 | //
11 | // Extends the default `$theme-colors` maps to help create our utilities.
12 |
13 | // Come v6, we'll de-dupe these variables. Until then, for backward compatibility, we keep them to reassign.
14 | // scss-docs-start utilities-colors
15 | $utilities-colors: $theme-colors-rgb !default;
16 | // scss-docs-end utilities-colors
17 |
18 | // scss-docs-start utilities-text-colors
19 | $utilities-text: map-merge(
20 | $utilities-colors,
21 | (
22 | "black": to-rgb($black),
23 | "white": to-rgb($white),
24 | "body": to-rgb($body-color)
25 | )
26 | ) !default;
27 | $utilities-text-colors: map-loop($utilities-text, rgba-css-var, "$key", "text") !default;
28 | // scss-docs-end utilities-text-colors
29 |
30 | // scss-docs-start utilities-bg-colors
31 | $utilities-bg: map-merge(
32 | $utilities-colors,
33 | (
34 | "black": to-rgb($black),
35 | "white": to-rgb($white),
36 | "body": to-rgb($body-bg)
37 | )
38 | ) !default;
39 | $utilities-bg-colors: map-loop($utilities-bg, rgba-css-var, "$key", "bg") !default;
40 | // scss-docs-end utilities-bg-colors
41 |
42 | // scss-docs-start utilities-border-colors
43 | $utilities-border: map-merge(
44 | $utilities-colors,
45 | (
46 | "white": to-rgb($white)
47 | )
48 | ) !default;
49 | $utilities-border-colors: map-loop($utilities-border, rgba-css-var, "$key", "border") !default;
50 | // scss-docs-end utilities-border-colors
51 |
52 | $negative-spacers: if($enable-negative-margins, negativify-map($spacers), null) !default;
53 |
54 | $gutters: $spacers !default;
55 |
--------------------------------------------------------------------------------
/sass/template.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "bootstrap/functions";
3 | @import "bootstrap/variables";
4 | @import "bootstrap/maps";
5 | @import "bootstrap/mixins";
6 | @import "bootstrap/utilities";
7 |
8 | // Bettum Variables and Mixins
9 | @import "mixins";
10 | @import "variables";
11 |
12 | // Bootstrap
13 | @import "bootstrap/root";
14 | @import "bootstrap/reboot";
15 | @import "bootstrap/type";
16 | @import "bootstrap/images";
17 | @import "bootstrap/containers";
18 | @import "bootstrap/grid";
19 | @import "bootstrap/tables";
20 | @import "bootstrap/forms";
21 | @import "bootstrap/buttons";
22 | @import "bootstrap/transitions";
23 | @import "bootstrap/dropdown";
24 | @import "bootstrap/button-group";
25 | @import "bootstrap/nav";
26 | @import "bootstrap/navbar";
27 | @import "bootstrap/card";
28 | @import "bootstrap/accordion";
29 | @import "bootstrap/breadcrumb";
30 | @import "bootstrap/pagination";
31 | @import "bootstrap/badge";
32 | @import "bootstrap/alert";
33 | @import "bootstrap/progress";
34 | @import "bootstrap/list-group";
35 | @import "bootstrap/close";
36 | @import "bootstrap/modal";
37 | @import "bootstrap/tooltip";
38 | @import "bootstrap/popover";
39 |
40 |
41 | // Blocks
42 | @import "blocks/global";
43 | @import "blocks/alerts";
44 | @import "blocks/buttons";
45 | @import "blocks/form";
46 | @import "blocks/nav";
47 | @import "blocks/iframe";
48 | @import "blocks/meter";
49 | @import "blocks/modal";
50 | @import "blocks/treeselect";
51 | @import "blocks/quickicons";
52 | @import "blocks/table";
53 | @import "blocks/tooltip";
54 | @import "blocks/toolbar";
55 | @import "blocks/utils";
56 |
57 |
58 | // START TEMPORARY
59 | @import "pages/templates"; // until https://github.com/joomla/joomla-cms/pull/35777 is merged
60 | // END TEMPORARY
61 |
62 | // Vendor Overrides
63 | @import "media/vendor/codemirror";
64 |
65 | @import "bootstrap/helpers";
66 | @import "bootstrap/utilities/api";
67 |
--------------------------------------------------------------------------------
/html/mod_menu/default.php:
--------------------------------------------------------------------------------
1 | getTemplate(true)->params;
19 | $sidebar = $params->get('menu', 1) ? true : false;
20 |
21 | $hideLinks = $app->input->getBool('hidemainmenu');
22 |
23 | // Only load the JS if the menu is allowed to be used
24 | if (!$hideLinks)
25 | {
26 | HTMLHelper::_('bootstrap.framework');
27 |
28 | if ($sidebar)
29 | {
30 | HTMLHelper::_('script', 'mod_menu/admin-menu-sidebar.min.js', ['version' => 'auto', 'relative' => true], ['type' => 'module']);
31 | }
32 | else
33 | {
34 | HTMLHelper::_('script', 'mod_menu/admin-menu.min.js', ['version' => 'auto', 'relative' => true], ['type' => 'module']);
35 | }
36 | }
37 |
38 | // Recurse through children of root node if they exist
39 | ?>
40 | hasChildren()) : ?>
41 | direction === 'rtl' ? '-rtl' : '') . '.css', ['version' => 'auto']); ?>
42 |
43 | renderSubmenu(ModuleHelper::getLayoutPath('mod_menu', 'default_submenu_sidebar'), $root); ?>
44 |
45 | hasChildren()) : ?>
46 |
51 |
52 |
--------------------------------------------------------------------------------
/sass/bootstrap/_breadcrumb.scss:
--------------------------------------------------------------------------------
1 | .breadcrumb {
2 | // scss-docs-start breadcrumb-css-vars
3 | --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x};
4 | --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y};
5 | --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom};
6 | @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size);
7 | --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg};
8 | --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius};
9 | --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color};
10 | --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x};
11 | --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color};
12 | // scss-docs-end breadcrumb-css-vars
13 |
14 | display: flex;
15 | flex-wrap: wrap;
16 | padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x);
17 | margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom);
18 | @include font-size(var(--#{$prefix}breadcrumb-font-size));
19 | list-style: none;
20 | background-color: var(--#{$prefix}breadcrumb-bg);
21 | @include border-radius(var(--#{$prefix}breadcrumb-border-radius));
22 | }
23 |
24 | .breadcrumb-item {
25 | // The separator between breadcrumbs (by default, a forward-slash: "/")
26 | + .breadcrumb-item {
27 | padding-left: var(--#{$prefix}breadcrumb-item-padding-x);
28 |
29 | &::before {
30 | float: left; // Suppress inline spacings and underlining of the separator
31 | padding-right: var(--#{$prefix}breadcrumb-item-padding-x);
32 | color: var(--#{$prefix}breadcrumb-divider-color);
33 | content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"};
34 | }
35 | }
36 |
37 | &.active {
38 | color: var(--#{$prefix}breadcrumb-item-active-color);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/sass/bootstrap/utilities/_api.scss:
--------------------------------------------------------------------------------
1 | // Loop over each breakpoint
2 | @each $breakpoint in map-keys($grid-breakpoints) {
3 |
4 | // Generate media query if needed
5 | @include media-breakpoint-up($breakpoint) {
6 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
7 |
8 | // Loop over each utility property
9 | @each $key, $utility in $utilities {
10 | // The utility can be disabled with `false`, thus check if the utility is a map first
11 | // Only proceed if responsive media queries are enabled or if it's the base media query
12 | @if type-of($utility) == "map" and (map-get($utility, responsive) or $infix == "") {
13 | @include generate-utility($utility, $infix);
14 | }
15 | }
16 | }
17 | }
18 |
19 | // RFS rescaling
20 | @media (min-width: $rfs-mq-value) {
21 | @each $breakpoint in map-keys($grid-breakpoints) {
22 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
23 |
24 | @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {
25 | // Loop over each utility property
26 | @each $key, $utility in $utilities {
27 | // The utility can be disabled with `false`, thus check if the utility is a map first
28 | // Only proceed if responsive media queries are enabled or if it's the base media query
29 | @if type-of($utility) == "map" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == "") {
30 | @include generate-utility($utility, $infix, true);
31 | }
32 | }
33 | }
34 | }
35 | }
36 |
37 |
38 | // Print utilities
39 | @media print {
40 | @each $key, $utility in $utilities {
41 | // The utility can be disabled with `false`, thus check if the utility is a map first
42 | // Then check if the utility needs print styles
43 | @if type-of($utility) == "map" and map-get($utility, print) == true {
44 | @include generate-utility($utility, "-print");
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/js/plg_quickicon_joomlaupdate/jupdatecheck.min.js:
--------------------------------------------------------------------------------
1 | ((e,a)=>{"use strict";const s=()=>{if(a.getOptions("js-extensions-update")){const s=a.getOptions("js-joomla-update"),n=(a,s)=>{const n=e.getElementById("plg_quickicon_joomlaupdate"),t=[].slice.call(n.querySelectorAll("span.j-links-link"));n&&n.classList.add(a),t.length&&t.forEach((e=>{e.innerHTML=s}))};a.request({url:s.ajaxUrl,method:"GET",data:"",perform:!0,onSuccess:t=>{const o=JSON.parse(t);if(Array.isArray(o))if(0===o.length)n("success",a.Text._("PLG_QUICKICON_JOOMLAUPDATE_UPTODATE"));else{const t=o.shift();t.version!==s.version?(n("danger",a.Text._("PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND").replace("%s",` ${t.version}`)),(s=>{const n=``,t=e.createElement("div");t.innerHTML=n,e.body.append(t)})(t.version)):n("success",a.Text._("PLG_QUICKICON_JOOMLAUPDATE_UPTODATE"))}else n("danger",a.Text._("PLG_QUICKICON_JOOMLAUPDATE_ERROR"))},onError:()=>{n("danger",a.Text._("PLG_QUICKICON_JOOMLAUPDATE_ERROR"))}})}},n=()=>{if(!a||"function"!=typeof a.getOptions||!a.getOptions("js-joomla-update"))throw new Error("Script is not properly initialised");setTimeout(s,2e3),e.removeEventListener("DOMContentLoaded",n)};e.addEventListener("DOMContentLoaded",n)})(document,Joomla);
--------------------------------------------------------------------------------
/sass/media/com_media/components/_media-breadcrumb.scss:
--------------------------------------------------------------------------------
1 | .media-breadcrumb {
2 | display: none;
3 | padding: 0;
4 | margin: 0;
5 | margin-inline-end: auto;
6 | font-size: .9rem;
7 | line-height: $toolbar-height;
8 | background: transparent;
9 | border-inline-start: 1px solid var(--border-color);
10 |
11 | @include media-breakpoint-up(md) {
12 | display: flex;
13 | }
14 |
15 | ol {
16 | display: flex;
17 | margin: 0;
18 | padding: 0;
19 | list-style: outside none none;
20 |
21 | & > li > a {
22 | cursor: pointer;
23 | }
24 | }
25 | }
26 |
27 | .media-breadcrumb-item {
28 | padding: 0;
29 | padding-inline-end: 8px;
30 | padding-inline-start: 22px;
31 | background-color: $breadcrumbs-bg;
32 | &:first-of-type {
33 | padding-inline-start: 16px;
34 | }
35 | &:last-of-type {
36 | background-color: $breadcrumbs-current-bg;
37 | &::after {
38 | border-inline-start-color: $breadcrumbs-current-bg;
39 | }
40 | a {
41 | color: $white;
42 | }
43 | }
44 | &:hover {
45 | color: $highlight-color;
46 | }
47 | }
48 |
49 | .media-breadcrumb-item {
50 | position: relative;
51 |
52 | &::before,
53 | &::after {
54 | position: absolute;
55 | top: 0;
56 | bottom: 0;
57 | left: 100%;
58 | z-index: 2;
59 | display: block;
60 | width: 0;
61 | height: 0;
62 | margin: auto;
63 | content: "" !important;
64 | border-top: 23px solid transparent;
65 | border-bottom: 23px solid transparent;
66 | border-inline-start: 10px solid transparent;
67 | }
68 | &::before {
69 | border-inline-start-color: var(--border-color);
70 | }
71 | &::after {
72 | border-inline-start-color: $breadcrumbs-bg;
73 | }
74 | }
75 |
76 | // RTL overrides
77 | html[dir=rtl] .media-breadcrumb-item {
78 | &::before,
79 | &::after {
80 | left: 0;
81 | right: 100%;
82 | }
83 | }
84 |
85 | .breadcrumb-item + .breadcrumb-item::before {
86 | display: none;
87 | }
88 |
--------------------------------------------------------------------------------
/sass/bootstrap/_type.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Headings
3 | //
4 | .h1 {
5 | @extend h1;
6 | }
7 |
8 | .h2 {
9 | @extend h2;
10 | }
11 |
12 | .h3 {
13 | @extend h3;
14 | }
15 |
16 | .h4 {
17 | @extend h4;
18 | }
19 |
20 | .h5 {
21 | @extend h5;
22 | }
23 |
24 | .h6 {
25 | @extend h6;
26 | }
27 |
28 |
29 | .lead {
30 | @include font-size($lead-font-size);
31 | font-weight: $lead-font-weight;
32 | }
33 |
34 | // Type display classes
35 | @each $display, $font-size in $display-font-sizes {
36 | .display-#{$display} {
37 | @include font-size($font-size);
38 | font-family: $display-font-family;
39 | font-style: $display-font-style;
40 | font-weight: $display-font-weight;
41 | line-height: $display-line-height;
42 | }
43 | }
44 |
45 | //
46 | // Emphasis
47 | //
48 | .small {
49 | @extend small;
50 | }
51 |
52 | .mark {
53 | @extend mark;
54 | }
55 |
56 | //
57 | // Lists
58 | //
59 |
60 | .list-unstyled {
61 | @include list-unstyled();
62 | }
63 |
64 | // Inline turns list items into inline-block
65 | .list-inline {
66 | @include list-unstyled();
67 | }
68 | .list-inline-item {
69 | display: inline-block;
70 |
71 | &:not(:last-child) {
72 | margin-right: $list-inline-padding;
73 | }
74 | }
75 |
76 |
77 | //
78 | // Misc
79 | //
80 |
81 | // Builds on `abbr`
82 | .initialism {
83 | @include font-size($initialism-font-size);
84 | text-transform: uppercase;
85 | }
86 |
87 | // Blockquotes
88 | .blockquote {
89 | margin-bottom: $blockquote-margin-y;
90 | @include font-size($blockquote-font-size);
91 |
92 | > :last-child {
93 | margin-bottom: 0;
94 | }
95 | }
96 |
97 | .blockquote-footer {
98 | margin-top: -$blockquote-margin-y;
99 | margin-bottom: $blockquote-margin-y;
100 | @include font-size($blockquote-footer-font-size);
101 | color: $blockquote-footer-color;
102 |
103 | &::before {
104 | content: "\2014\00A0"; // em dash, nbsp
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/sass/media/com_media/components/_media-infobar.scss:
--------------------------------------------------------------------------------
1 | .media-infobar {
2 | position: absolute;
3 | top: ($toolbar-height + 1px);
4 | right: 0;
5 | bottom: 0;
6 | z-index: 4;
7 | width: 25%;
8 | padding: $gutter-width;
9 | overflow-y: scroll;
10 | background-color: $info-bg;
11 | border-inline-start: 1px solid var(--border-color);
12 |
13 | [dir=rtl] & {
14 | right: auto;
15 | left: 0;
16 | }
17 |
18 | h2 {
19 | padding: 20px ($gutter-width + 15px) 10px ($gutter-width - 5px);
20 | margin: (-$gutter-width) (-$gutter-width) $gutter-width;
21 | font-weight: normal;
22 | line-height: $info-title-height;
23 | word-wrap: break-word;
24 | background-color: $info-title-bg;
25 | border-bottom: 1px solid var(--border-color);
26 | }
27 |
28 | dl {
29 | display: flex;
30 | flex-wrap: wrap;
31 | margin-inline-end: -($col-gutter-width * .5);
32 | margin-inline-start: -($col-gutter-width * .5);
33 | }
34 |
35 | dt,
36 | dd {
37 | position: relative;
38 | width: 100%;
39 | min-height: 1px;
40 | padding-inline-end: ($col-gutter-width * .5);
41 | padding-inline-start: ($col-gutter-width * .5);
42 | }
43 |
44 | dt {
45 | font-weight: normal;
46 | color: var(--body-color);
47 | }
48 | }
49 |
50 | .infobar-close {
51 | position: absolute;
52 | top: 0;
53 | right: 0;
54 | z-index: 2;
55 | padding: 0 $gutter-width;
56 | font-size: 2.6rem;
57 | line-height: $info-title-height;
58 | color: $info-close-color;
59 | text-indent: 0;
60 | text-shadow: none;
61 |
62 | [dir=rtl] & {
63 | right: auto;
64 | left: 0;
65 | }
66 |
67 | &:hover {
68 | color: $info-close-color-hover;
69 | cursor: pointer;
70 | }
71 | }
72 |
73 | .placeholder-icon.fa {
74 | display: block;
75 | width: 4rem;
76 | height: 4rem;
77 | margin: 20px auto 15px;
78 | font-size: 2rem;
79 | line-height: calc(4rem - 4px);
80 | color: var(--body-color);
81 | border: 2px solid var(--border-color);
82 | border-radius: 50%;
83 | }
84 |
--------------------------------------------------------------------------------
/js/com_cpanel/admin-cpanel-dnd.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @copyright Copyright (C) 2020 Charlie Lodder. All rights reserved.
3 | * @license GNU General Public License version 2 or later; see LICENSE.txt
4 | */
5 |
6 | ((document) => {
7 | 'use strict'
8 |
9 | const setModuleIds = () => {
10 | const modules = []
11 | document.querySelectorAll('[data-cpanel-module-id]').forEach(module => {
12 | const obj = {}
13 | obj.id = module.getAttribute('data-cpanel-module-id')
14 | obj.cardColumn = module.parentNode.id === 'card-columns' ? true : false
15 | modules.push(obj)
16 | })
17 | localStorage.setItem('cpanel-modules', JSON.stringify(modules))
18 | }
19 |
20 | const renderModules = () => {
21 | const cpanelModules = document.getElementById('cpanel-modules')
22 | const cardColumns = document.getElementById('card-columns')
23 | const moduleIds = localStorage.getItem('cpanel-modules')
24 | if (moduleIds !== null) {
25 | JSON.parse(moduleIds).forEach(module => {
26 | const element = document.querySelector(`[data-cpanel-module-id="${module.id}"]`)
27 | if (element !== null) {
28 | if (module.cardColumn) {
29 | cardColumns.append(element)
30 | } else {
31 | cpanelModules.append(element)
32 | }
33 | element.classList.remove('d-none')
34 | }
35 | })
36 | }
37 |
38 | // Show all the other modules
39 | document.querySelectorAll('[data-cpanel-module-id]').forEach(module => {
40 | module.classList.remove('d-none')
41 | })
42 | }
43 |
44 | const onBoot = () => {
45 | renderModules()
46 |
47 | dragula([document.getElementById('cpanel-modules'), document.getElementById('card-columns')], {
48 | moves: (el, container, { classList }) => classList.contains('handle')
49 | }).on('dragend', event => setModuleIds())
50 |
51 | document.removeEventListener('DOMContentLoaded', onBoot)
52 | }
53 |
54 | document.addEventListener('DOMContentLoaded', onBoot)
55 |
56 | })(document)
--------------------------------------------------------------------------------
/html/com_modules/select/default.php:
--------------------------------------------------------------------------------
1 | input->getCmd('function');
16 |
17 | if ($function)
18 | {
19 | HTMLHelper::_('script', 'com_modules/admin-select-modal.js', ['version' => 'auto', 'relative' => true], ['type' => 'module']);
20 | }
21 | ?>
22 |
28 |
29 |
30 | items as &$item) : ?>
31 | -
32 |
33 | state->get('client_id', 0) . $this->modalLink . '&eid=' . $item->extension_id; ?>
34 | escape($item->name); ?>
35 | escape(strip_tags($item->desc)), 200); ?>
36 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/sass/bootstrap/_progress.scss:
--------------------------------------------------------------------------------
1 | // Disable animation if transitions are disabled
2 |
3 | // scss-docs-start progress-keyframes
4 | @if $enable-transitions {
5 | @keyframes progress-bar-stripes {
6 | 0% { background-position-x: $progress-height; }
7 | }
8 | }
9 | // scss-docs-end progress-keyframes
10 |
11 | .progress {
12 | // scss-docs-start progress-css-vars
13 | --#{$prefix}progress-height: #{$progress-height};
14 | @include rfs($progress-font-size, --#{$prefix}progress-font-size);
15 | --#{$prefix}progress-bg: #{$progress-bg};
16 | --#{$prefix}progress-border-radius: #{$progress-border-radius};
17 | --#{$prefix}progress-box-shadow: #{$progress-box-shadow};
18 | --#{$prefix}progress-bar-color: #{$progress-bar-color};
19 | --#{$prefix}progress-bar-bg: #{$progress-bar-bg};
20 | --#{$prefix}progress-bar-transition: #{$progress-bar-transition};
21 | // scss-docs-end progress-css-vars
22 |
23 | display: flex;
24 | height: var(--#{$prefix}progress-height);
25 | overflow: hidden; // force rounded corners by cropping it
26 | @include font-size(var(--#{$prefix}progress-font-size));
27 | background-color: var(--#{$prefix}progress-bg);
28 | @include border-radius(var(--#{$prefix}progress-border-radius));
29 | @include box-shadow(var(--#{$prefix}progress-box-shadow));
30 | }
31 |
32 | .progress-bar {
33 | display: flex;
34 | flex-direction: column;
35 | justify-content: center;
36 | overflow: hidden;
37 | color: var(--#{$prefix}progress-bar-color);
38 | text-align: center;
39 | white-space: nowrap;
40 | background-color: var(--#{$prefix}progress-bar-bg);
41 | @include transition(var(--#{$prefix}progress-bar-transition));
42 | }
43 |
44 | .progress-bar-striped {
45 | @include gradient-striped();
46 | background-size: var(--#{$prefix}progress-height) var(--#{$prefix}progress-height);
47 | }
48 |
49 | @if $enable-transitions {
50 | .progress-bar-animated {
51 | animation: $progress-bar-animation-timing progress-bar-stripes;
52 |
53 | @if $enable-reduced-motion {
54 | @media (prefers-reduced-motion: reduce) {
55 | animation: none;
56 | }
57 | }
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_gradients.scss:
--------------------------------------------------------------------------------
1 | // Gradients
2 |
3 | // scss-docs-start gradient-bg-mixin
4 | @mixin gradient-bg($color: null) {
5 | background-color: $color;
6 |
7 | @if $enable-gradients {
8 | background-image: var(--#{$prefix}gradient);
9 | }
10 | }
11 | // scss-docs-end gradient-bg-mixin
12 |
13 | // scss-docs-start gradient-mixins
14 | // Horizontal gradient, from left to right
15 | //
16 | // Creates two color stops, start and end, by specifying a color and position for each color stop.
17 | @mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {
18 | background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);
19 | }
20 |
21 | // Vertical gradient, from top to bottom
22 | //
23 | // Creates two color stops, start and end, by specifying a color and position for each color stop.
24 | @mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {
25 | background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);
26 | }
27 |
28 | @mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {
29 | background-image: linear-gradient($deg, $start-color, $end-color);
30 | }
31 |
32 | @mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {
33 | background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
34 | }
35 |
36 | @mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {
37 | background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
38 | }
39 |
40 | @mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {
41 | background-image: radial-gradient(circle, $inner-color, $outer-color);
42 | }
43 |
44 | @mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {
45 | background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
46 | }
47 | // scss-docs-end gradient-mixins
48 |
--------------------------------------------------------------------------------
/html/layouts/joomla/toolbar/dropdown.php:
--------------------------------------------------------------------------------
1 | isRtl() ? 'dropdown-menu-end' : '';
19 | $saveStyle = $app->getTemplate(true)->params->get('toolbar', 'dropdown');
20 |
21 | if ($saveStyle === 'inline')
22 | {
23 | HTMLHelper::_('script', Uri::root() . '/administrator/templates/' . $app->getTemplate() . '/js/toolbar/inline.js', ['version' => 'auto'], ['type' => 'module']);
24 | }
25 |
26 | /**
27 | * @var string $id
28 | * @var string $onclick
29 | * @var string $class
30 | * @var string $text
31 | * @var string $btnClass
32 | * @var string $tagName
33 | * @var string $htmlAttributes
34 | * @var string $hasButtons
35 | * @var string $button
36 | * @var string $dropdownItems
37 | * @var string $caretClass
38 | * @var string $toggleSplit
39 | */
40 | extract($displayData, EXTR_OVERWRITE);
41 | ?>
42 |
43 |
44 |
45 |
46 |
47 |
48 |
53 |
54 |
55 |
56 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/sass/bootstrap/forms/_floating-labels.scss:
--------------------------------------------------------------------------------
1 | .form-floating {
2 | position: relative;
3 |
4 | > .form-control,
5 | > .form-control-plaintext,
6 | > .form-select {
7 | height: $form-floating-height;
8 | line-height: $form-floating-line-height;
9 | }
10 |
11 | > label {
12 | position: absolute;
13 | top: 0;
14 | left: 0;
15 | width: 100%;
16 | height: 100%; // allow textareas
17 | padding: $form-floating-padding-y $form-floating-padding-x;
18 | overflow: hidden;
19 | text-overflow: ellipsis;
20 | white-space: nowrap;
21 | pointer-events: none;
22 | border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model
23 | transform-origin: 0 0;
24 | @include transition($form-floating-transition);
25 | }
26 |
27 | > .form-control,
28 | > .form-control-plaintext {
29 | padding: $form-floating-padding-y $form-floating-padding-x;
30 |
31 | &::placeholder {
32 | color: transparent;
33 | }
34 |
35 | &:focus,
36 | &:not(:placeholder-shown) {
37 | padding-top: $form-floating-input-padding-t;
38 | padding-bottom: $form-floating-input-padding-b;
39 | }
40 | // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped
41 | &:-webkit-autofill {
42 | padding-top: $form-floating-input-padding-t;
43 | padding-bottom: $form-floating-input-padding-b;
44 | }
45 | }
46 |
47 | > .form-select {
48 | padding-top: $form-floating-input-padding-t;
49 | padding-bottom: $form-floating-input-padding-b;
50 | }
51 |
52 | > .form-control:focus,
53 | > .form-control:not(:placeholder-shown),
54 | > .form-control-plaintext,
55 | > .form-select {
56 | ~ label {
57 | opacity: $form-floating-label-opacity;
58 | transform: $form-floating-label-transform;
59 | }
60 | }
61 | // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped
62 | > .form-control:-webkit-autofill {
63 | ~ label {
64 | opacity: $form-floating-label-opacity;
65 | transform: $form-floating-label-transform;
66 | }
67 | }
68 |
69 | > .form-control-plaintext {
70 | ~ label {
71 | border-width: $input-border-width 0; // Required to properly position label text - as explained above
72 | }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_border-radius.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable property-disallowed-list
2 | // Single side border-radius
3 |
4 | // Helper function to replace negative values with 0
5 | @function valid-radius($radius) {
6 | $return: ();
7 | @each $value in $radius {
8 | @if type-of($value) == number {
9 | $return: append($return, max($value, 0));
10 | } @else {
11 | $return: append($return, $value);
12 | }
13 | }
14 | @return $return;
15 | }
16 |
17 | // scss-docs-start border-radius-mixins
18 | @mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {
19 | @if $enable-rounded {
20 | border-radius: valid-radius($radius);
21 | }
22 | @else if $fallback-border-radius != false {
23 | border-radius: $fallback-border-radius;
24 | }
25 | }
26 |
27 | @mixin border-top-radius($radius: $border-radius) {
28 | @if $enable-rounded {
29 | border-top-left-radius: valid-radius($radius);
30 | border-top-right-radius: valid-radius($radius);
31 | }
32 | }
33 |
34 | @mixin border-end-radius($radius: $border-radius) {
35 | @if $enable-rounded {
36 | border-top-right-radius: valid-radius($radius);
37 | border-bottom-right-radius: valid-radius($radius);
38 | }
39 | }
40 |
41 | @mixin border-bottom-radius($radius: $border-radius) {
42 | @if $enable-rounded {
43 | border-bottom-right-radius: valid-radius($radius);
44 | border-bottom-left-radius: valid-radius($radius);
45 | }
46 | }
47 |
48 | @mixin border-start-radius($radius: $border-radius) {
49 | @if $enable-rounded {
50 | border-top-left-radius: valid-radius($radius);
51 | border-bottom-left-radius: valid-radius($radius);
52 | }
53 | }
54 |
55 | @mixin border-top-start-radius($radius: $border-radius) {
56 | @if $enable-rounded {
57 | border-top-left-radius: valid-radius($radius);
58 | }
59 | }
60 |
61 | @mixin border-top-end-radius($radius: $border-radius) {
62 | @if $enable-rounded {
63 | border-top-right-radius: valid-radius($radius);
64 | }
65 | }
66 |
67 | @mixin border-bottom-end-radius($radius: $border-radius) {
68 | @if $enable-rounded {
69 | border-bottom-right-radius: valid-radius($radius);
70 | }
71 | }
72 |
73 | @mixin border-bottom-start-radius($radius: $border-radius) {
74 | @if $enable-rounded {
75 | border-bottom-left-radius: valid-radius($radius);
76 | }
77 | }
78 | // scss-docs-end border-radius-mixins
79 |
--------------------------------------------------------------------------------
/sass/bootstrap/_alert.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Base styles
3 | //
4 |
5 | .alert {
6 | // scss-docs-start alert-css-vars
7 | --#{$prefix}alert-bg: transparent;
8 | --#{$prefix}alert-padding-x: #{$alert-padding-x};
9 | --#{$prefix}alert-padding-y: #{$alert-padding-y};
10 | --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom};
11 | --#{$prefix}alert-color: inherit;
12 | --#{$prefix}alert-border-color: transparent;
13 | --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color);
14 | --#{$prefix}alert-border-radius: #{$alert-border-radius};
15 | // scss-docs-end alert-css-vars
16 |
17 | position: relative;
18 | padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x);
19 | margin-bottom: var(--#{$prefix}alert-margin-bottom);
20 | color: var(--#{$prefix}alert-color);
21 | background-color: var(--#{$prefix}alert-bg);
22 | border: var(--#{$prefix}alert-border);
23 | @include border-radius(var(--#{$prefix}alert-border-radius));
24 | }
25 |
26 | // Headings for larger alerts
27 | .alert-heading {
28 | // Specified to prevent conflicts of changing $headings-color
29 | color: inherit;
30 | }
31 |
32 | // Provide class for links that match alerts
33 | .alert-link {
34 | font-weight: $alert-link-font-weight;
35 | }
36 |
37 |
38 | // Dismissible alerts
39 | //
40 | // Expand the right padding and account for the close button's positioning.
41 |
42 | .alert-dismissible {
43 | padding-right: $alert-dismissible-padding-r;
44 |
45 | // Adjust close link position
46 | .btn-close {
47 | position: absolute;
48 | top: 0;
49 | right: 0;
50 | z-index: $stretched-link-z-index + 1;
51 | padding: $alert-padding-y * 1.25 $alert-padding-x;
52 | }
53 | }
54 |
55 |
56 | // scss-docs-start alert-modifiers
57 | // Generate contextual modifier classes for colorizing the alert.
58 |
59 | @each $state, $value in $theme-colors {
60 | $alert-background: shift-color($value, $alert-bg-scale);
61 | $alert-border: shift-color($value, $alert-border-scale);
62 | $alert-color: shift-color($value, $alert-color-scale);
63 |
64 | @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) {
65 | $alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale));
66 | }
67 | .alert-#{$state} {
68 | @include alert-variant($alert-background, $alert-border, $alert-color);
69 | }
70 | }
71 | // scss-docs-end alert-modifiers
72 |
--------------------------------------------------------------------------------
/sass/media/plg_installer_webinstaller/client.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "../../bootstrap/functions";
3 | @import "../../bootstrap/variables";
4 | @import "../../bootstrap/mixins";
5 |
6 | // Bettum Variables and mixins
7 | @import "../../mixins";
8 | @import "../../variables";
9 |
10 |
11 | // Extension variables
12 | $extension-types: (
13 | "jcommercial": #f6c801,
14 | "jcomponent": #1e9e33,
15 | "jlanguage": $dark,
16 | "jmodule": #e20a0a,
17 | "jplugin": #57278e,
18 | "jspecific": #d69b34,
19 | "jtool": #333
20 | );
21 |
22 | .com-apps-container {
23 | // Extension type badges
24 | .badge {
25 | margin: 1px;
26 | }
27 |
28 | .fader {
29 | position: absolute;
30 | top: 0;
31 | left: 0;
32 | width: 100%;
33 | height: 100%;
34 | margin-top: 5px;
35 | text-align: center;
36 | @include gradient-y(rgba($white,0), rgba($white,1), 70%, 95%);
37 | }
38 |
39 | .com-apps-sidebar {
40 | // Bootstrap 4 does not indent second level navigation
41 | .nav {
42 | .nav {
43 | padding-left: 15px;
44 | }
45 | }
46 |
47 | a {
48 | &:hover,
49 | &.active {
50 | color: $white;
51 | text-decoration: none;
52 | background-color: #33608f;
53 | }
54 | }
55 | }
56 |
57 | .grid-container {
58 | .card {
59 | height: 95%;
60 | margin-bottom: 1rem;
61 | background-color: var(--primary);
62 |
63 | &:hover {
64 | background-color: var(--tertiary);
65 | }
66 | }
67 |
68 | .card-header {
69 | padding: .5rem 0;
70 | background-color: transparent;
71 | }
72 |
73 | .card-title {
74 | font-size: 1.3rem;
75 | }
76 |
77 | .card-text p {
78 | display: none;
79 | }
80 |
81 | .card-body {
82 | padding-top: .7rem;
83 | cursor: pointer;
84 | }
85 | }
86 |
87 | .list-container {
88 | box-sizing: border-box;
89 |
90 | // Override fader gradient
91 | .fader {
92 | @include gradient-y(rgba(255,255,255,0), rgba(255,255,255,1), 0%, 25%);
93 | }
94 |
95 | .list-group-item {
96 | margin-bottom: 10px;
97 |
98 | &:hover {
99 | background-color: var(--secondary);
100 | }
101 |
102 | .row {
103 | cursor: pointer;
104 | }
105 | }
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/html/mod_multilangstatus/default.php:
--------------------------------------------------------------------------------
1 | 'auto', 'relative' => true], ['type' => 'module']);
16 |
17 | ?>
18 |
19 |
23 |
24 | Text::_('MOD_MULTILANGSTATUS'),
29 | 'url' => Route::_('index.php?option=com_languages&view=multilangstatus&tmpl=component'),
30 | 'height' => '400px',
31 | 'width' => '800px',
32 | 'bodyHeight' => 70,
33 | 'modalWidth' => 80,
34 | 'footer' => '
',
35 | )
36 | ); ?>
37 |
38 |
--------------------------------------------------------------------------------
/sass/blocks/_treeselect.scss:
--------------------------------------------------------------------------------
1 | // Tree select
2 |
3 | .treeselect {
4 | display: block;
5 | padding-inline-start: 0;
6 | list-style: none;
7 |
8 | .nav-header {
9 | font-weight: $font-weight-bold;
10 | color: var(--body-color);
11 | }
12 |
13 | li {
14 | position: relative;
15 | display: block;
16 | line-height: $treeselect-line-height;
17 | list-style: none;
18 |
19 | &::before,
20 | &::after {
21 | position: absolute;
22 | left: ($treeselect-indent - 15px);
23 | content: "";
24 | background-color: var(--body-color);
25 |
26 | [dir=rtl] & {
27 | right: ($treeselect-indent - 15px);
28 | left: auto;
29 | }
30 | }
31 |
32 | &::before {
33 | top: 18px;
34 | width: 10px;
35 | height: 1px;
36 | margin: auto;
37 | }
38 |
39 | &::after {
40 | top: 0;
41 | bottom: 0;
42 | width: 1px;
43 | height: 100%;
44 | }
45 |
46 | &:last-child::after {
47 | height: 18px;
48 | }
49 |
50 | li {
51 | padding-inline-start: $treeselect-indent;
52 | }
53 | }
54 |
55 | > li::before,
56 | > li::after {
57 | display: none;
58 | }
59 |
60 | .icon- {
61 | display: none;
62 | }
63 |
64 | .treeselect-toggle {
65 | display: inline-block;
66 | padding: 0;
67 | margin-inline-end: .1rem;
68 | text-align: center;
69 | cursor: pointer;
70 | }
71 |
72 | .treeselect-menu {
73 | display: inline-block;
74 | }
75 |
76 | .treeselect-item {
77 | display: inline-block;
78 |
79 | input {
80 | position: relative;
81 | top: 1px;
82 | margin-inline-end: .2rem;
83 | }
84 |
85 | label {
86 | margin-bottom: 0;
87 | }
88 | }
89 |
90 | .dropdown-toggle {
91 | margin-inline-start: .5rem;
92 |
93 | &::after {
94 | margin: 0;
95 | font-size: 1rem;
96 | color: var(--body-color);
97 | }
98 | }
99 | }
100 |
101 | .treeselect-sub {
102 | padding-inline-start: 0;
103 | }
104 |
105 | .tree-holder {
106 |
107 | ul ul {
108 |
109 | li::before,
110 | li::after {
111 | left: 8px;
112 | display: block;
113 | }
114 |
115 | li::before {
116 | top: 12px;
117 | }
118 |
119 | li:last-child::after {
120 | height: 12px;
121 | }
122 | }
123 |
124 | li {
125 | line-height: 1.8rem;
126 |
127 | li {
128 | padding-inline-start: 20px;
129 | }
130 | }
131 | }
132 |
--------------------------------------------------------------------------------
/login.php:
--------------------------------------------------------------------------------
1 | getLanguage();
19 |
20 | // Detecting Active Variables
21 | $logo = $this->params->get('loginLogo')
22 | ? Uri::root() . htmlspecialchars($this->params->get('loginLogo'), ENT_QUOTES, 'UTF-8')
23 | : $this->baseurl . '/templates/' . $this->template . '/images/logo.svg';
24 |
25 | // Set some meta data
26 | $this->setMetaData('viewport', 'width=device-width, initial-scale=1');
27 | $this->setMetaData('theme-color', '#38383d');
28 |
29 | HTMLHelper::_('stylesheet', 'custom.css', ['version' => 'auto', 'relative' => true]);
30 | HTMLHelper::_('stylesheet', 'administrator/language/' . $lang->getTag() . '/' . $lang->getTag() . '.css', ['version' => 'auto']);
31 |
32 | $cachesStyleSheets = json_encode(array_keys($this->_styleSheets));
33 |
34 | foreach (array_keys($this->_styleSheets) as $style)
35 | {
36 | unset($this->_styleSheets[$style]);
37 | }
38 |
39 | $css = file_get_contents(__DIR__ . '/css/login.css');
40 | ?>
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |

53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/sass/bootstrap/forms/_form-select.scss:
--------------------------------------------------------------------------------
1 | // Select
2 | //
3 | // Replaces the browser default select with a custom one, mostly pulled from
4 | // https://primer.github.io/.
5 |
6 | .form-select {
7 | display: block;
8 | width: 100%;
9 | padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;
10 | -moz-padding-start: subtract($form-select-padding-x, 3px); // See https://github.com/twbs/bootstrap/issues/32636
11 | font-family: $form-select-font-family;
12 | @include font-size($form-select-font-size);
13 | font-weight: $form-select-font-weight;
14 | line-height: $form-select-line-height;
15 | color: $form-select-color;
16 | background-color: $form-select-bg;
17 | background-image: escape-svg($form-select-indicator);
18 | background-repeat: no-repeat;
19 | background-position: $form-select-bg-position;
20 | background-size: $form-select-bg-size;
21 | border: $form-select-border-width solid $form-select-border-color;
22 | @include border-radius($form-select-border-radius, 0);
23 | @include box-shadow($form-select-box-shadow);
24 | @include transition($form-select-transition);
25 | appearance: none;
26 |
27 | &:focus {
28 | border-color: $form-select-focus-border-color;
29 | outline: 0;
30 | @if $enable-shadows {
31 | @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);
32 | } @else {
33 | // Avoid using mixin so we can pass custom focus shadow properly
34 | box-shadow: $form-select-focus-box-shadow;
35 | }
36 | }
37 |
38 | &[multiple],
39 | &[size]:not([size="1"]) {
40 | padding-right: $form-select-padding-x;
41 | background-image: none;
42 | }
43 |
44 | &:disabled {
45 | color: $form-select-disabled-color;
46 | background-color: $form-select-disabled-bg;
47 | border-color: $form-select-disabled-border-color;
48 | }
49 |
50 | // Remove outline from select box in FF
51 | &:-moz-focusring {
52 | color: transparent;
53 | text-shadow: 0 0 0 $form-select-color;
54 | }
55 | }
56 |
57 | .form-select-sm {
58 | padding-top: $form-select-padding-y-sm;
59 | padding-bottom: $form-select-padding-y-sm;
60 | padding-left: $form-select-padding-x-sm;
61 | @include font-size($form-select-font-size-sm);
62 | @include border-radius($form-select-border-radius-sm);
63 | }
64 |
65 | .form-select-lg {
66 | padding-top: $form-select-padding-y-lg;
67 | padding-bottom: $form-select-padding-y-lg;
68 | padding-left: $form-select-padding-x-lg;
69 | @include font-size($form-select-font-size-lg);
70 | @include border-radius($form-select-border-radius-lg);
71 | }
72 |
--------------------------------------------------------------------------------
/sass/bootstrap/_toasts.scss:
--------------------------------------------------------------------------------
1 | .toast {
2 | // scss-docs-start toast-css-vars
3 | --#{$prefix}toast-padding-x: #{$toast-padding-x};
4 | --#{$prefix}toast-padding-y: #{$toast-padding-y};
5 | --#{$prefix}toast-spacing: #{$toast-spacing};
6 | --#{$prefix}toast-max-width: #{$toast-max-width};
7 | @include rfs($toast-font-size, --#{$prefix}toast-font-size);
8 | --#{$prefix}toast-color: #{$toast-color};
9 | --#{$prefix}toast-bg: #{$toast-background-color};
10 | --#{$prefix}toast-border-width: #{$toast-border-width};
11 | --#{$prefix}toast-border-color: #{$toast-border-color};
12 | --#{$prefix}toast-border-radius: #{$toast-border-radius};
13 | --#{$prefix}toast-box-shadow: #{$toast-box-shadow};
14 | --#{$prefix}toast-header-color: #{$toast-header-color};
15 | --#{$prefix}toast-header-bg: #{$toast-header-background-color};
16 | --#{$prefix}toast-header-border-color: #{$toast-header-border-color};
17 | // scss-docs-end toast-css-vars
18 |
19 | width: var(--#{$prefix}toast-max-width);
20 | max-width: 100%;
21 | @include font-size(var(--#{$prefix}toast-font-size));
22 | color: var(--#{$prefix}toast-color);
23 | pointer-events: auto;
24 | background-color: var(--#{$prefix}toast-bg);
25 | background-clip: padding-box;
26 | border: var(--#{$prefix}toast-border-width) solid var(--#{$prefix}toast-border-color);
27 | box-shadow: var(--#{$prefix}toast-box-shadow);
28 | @include border-radius(var(--#{$prefix}toast-border-radius));
29 |
30 | &.showing {
31 | opacity: 0;
32 | }
33 |
34 | &:not(.show) {
35 | display: none;
36 | }
37 | }
38 |
39 | .toast-container {
40 | position: absolute;
41 | z-index: $zindex-toast;
42 | width: max-content;
43 | max-width: 100%;
44 | pointer-events: none;
45 |
46 | > :not(:last-child) {
47 | margin-bottom: var(--#{$prefix}toast-spacing);
48 | }
49 | }
50 |
51 | .toast-header {
52 | display: flex;
53 | align-items: center;
54 | padding: var(--#{$prefix}toast-padding-y) var(--#{$prefix}toast-padding-x);
55 | color: var(--#{$prefix}toast-header-color);
56 | background-color: var(--#{$prefix}toast-header-bg);
57 | background-clip: padding-box;
58 | border-bottom: var(--#{$prefix}toast-border-width) solid var(--#{$prefix}toast-header-border-color);
59 | @include border-top-radius(calc(var(--#{$prefix}toast-border-radius) - var(--#{$prefix}toast-border-width)));
60 |
61 | .btn-close {
62 | margin-right: calc(var(--#{$prefix}toast-padding-x) * -.5); // stylelint-disable-line function-disallowed-list
63 | margin-left: var(--#{$prefix}toast-padding-x);
64 | }
65 | }
66 |
67 | .toast-body {
68 | padding: var(--#{$prefix}toast-padding-x);
69 | word-wrap: break-word;
70 | }
71 |
--------------------------------------------------------------------------------
/sass/bootstrap/_root.scss:
--------------------------------------------------------------------------------
1 | :root {
2 | // Note: Custom variable values only support SassScript inside `#{}`.
3 |
4 | // Colors
5 | //
6 | // Generate palettes for full colors, grays, and theme colors.
7 |
8 | @each $color, $value in $colors {
9 | --#{$prefix}#{$color}: #{$value};
10 | }
11 |
12 | @each $color, $value in $grays {
13 | --#{$prefix}gray-#{$color}: #{$value};
14 | }
15 |
16 | @each $color, $value in $theme-colors {
17 | --#{$prefix}#{$color}: #{$value};
18 | }
19 |
20 | @each $color, $value in $theme-colors-rgb {
21 | --#{$prefix}#{$color}-rgb: #{$value};
22 | }
23 |
24 | --#{$prefix}white-rgb: #{to-rgb($white)};
25 | --#{$prefix}black-rgb: #{to-rgb($black)};
26 | --#{$prefix}body-color-rgb: #{to-rgb($body-color)};
27 | --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};
28 |
29 | // Fonts
30 |
31 | // Note: Use `inspect` for lists so that quoted items keep the quotes.
32 | // See https://github.com/sass/sass/issues/2383#issuecomment-336349172
33 | --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};
34 | --#{$prefix}font-monospace: #{inspect($font-family-monospace)};
35 | --#{$prefix}gradient: #{$gradient};
36 |
37 | // Root and body
38 | // scss-docs-start root-body-variables
39 | @if $font-size-root != null {
40 | --#{$prefix}root-font-size: #{$font-size-root};
41 | }
42 | --#{$prefix}body-font-family: #{$font-family-base};
43 | @include rfs($font-size-base, --#{$prefix}body-font-size);
44 | --#{$prefix}body-font-weight: #{$font-weight-base};
45 | --#{$prefix}body-line-height: #{$line-height-base};
46 | --#{$prefix}body-color: #{$body-color};
47 | @if $body-text-align != null {
48 | --#{$prefix}body-text-align: #{$body-text-align};
49 | }
50 | --#{$prefix}body-bg: #{$body-bg};
51 | // scss-docs-end root-body-variables
52 |
53 | // scss-docs-start root-border-var
54 | --#{$prefix}border-width: #{$border-width};
55 | --#{$prefix}border-style: #{$border-style};
56 | --#{$prefix}border-color: #{$border-color};
57 | --#{$prefix}border-color-translucent: #{$border-color-translucent};
58 |
59 | --#{$prefix}border-radius: #{$border-radius};
60 | --#{$prefix}border-radius-sm: #{$border-radius-sm};
61 | --#{$prefix}border-radius-lg: #{$border-radius-lg};
62 | --#{$prefix}border-radius-xl: #{$border-radius-xl};
63 | --#{$prefix}border-radius-2xl: #{$border-radius-2xl};
64 | --#{$prefix}border-radius-pill: #{$border-radius-pill};
65 | // scss-docs-end root-border-var
66 |
67 | --#{$prefix}link-color: #{$link-color};
68 | --#{$prefix}link-hover-color: #{$link-hover-color};
69 |
70 | --#{$prefix}code-color: #{$code-color};
71 |
72 | --#{$prefix}highlight-bg: #{$mark-bg};
73 | }
74 |
--------------------------------------------------------------------------------
/sass/bootstrap/_spinners.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Rotating border
3 | //
4 |
5 | .spinner-grow,
6 | .spinner-border {
7 | display: inline-block;
8 | width: var(--#{$prefix}spinner-width);
9 | height: var(--#{$prefix}spinner-height);
10 | vertical-align: var(--#{$prefix}spinner-vertical-align);
11 | // stylelint-disable-next-line property-disallowed-list
12 | border-radius: 50%;
13 | animation: var(--#{$prefix}spinner-animation-speed) linear infinite var(--#{$prefix}spinner-animation-name);
14 | }
15 |
16 | // scss-docs-start spinner-border-keyframes
17 | @keyframes spinner-border {
18 | to { transform: rotate(360deg) #{"/* rtl:ignore */"}; }
19 | }
20 | // scss-docs-end spinner-border-keyframes
21 |
22 | .spinner-border {
23 | // scss-docs-start spinner-border-css-vars
24 | --#{$prefix}spinner-width: #{$spinner-width};
25 | --#{$prefix}spinner-height: #{$spinner-height};
26 | --#{$prefix}spinner-vertical-align: #{$spinner-vertical-align};
27 | --#{$prefix}spinner-border-width: #{$spinner-border-width};
28 | --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed};
29 | --#{$prefix}spinner-animation-name: spinner-border;
30 | // scss-docs-end spinner-border-css-vars
31 |
32 | border: var(--#{$prefix}spinner-border-width) solid currentcolor;
33 | border-right-color: transparent;
34 | }
35 |
36 | .spinner-border-sm {
37 | // scss-docs-start spinner-border-sm-css-vars
38 | --#{$prefix}spinner-width: #{$spinner-width-sm};
39 | --#{$prefix}spinner-height: #{$spinner-height-sm};
40 | --#{$prefix}spinner-border-width: #{$spinner-border-width-sm};
41 | // scss-docs-end spinner-border-sm-css-vars
42 | }
43 |
44 | //
45 | // Growing circle
46 | //
47 |
48 | // scss-docs-start spinner-grow-keyframes
49 | @keyframes spinner-grow {
50 | 0% {
51 | transform: scale(0);
52 | }
53 | 50% {
54 | opacity: 1;
55 | transform: none;
56 | }
57 | }
58 | // scss-docs-end spinner-grow-keyframes
59 |
60 | .spinner-grow {
61 | // scss-docs-start spinner-grow-css-vars
62 | --#{$prefix}spinner-width: #{$spinner-width};
63 | --#{$prefix}spinner-height: #{$spinner-height};
64 | --#{$prefix}spinner-vertical-align: #{$spinner-vertical-align};
65 | --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed};
66 | --#{$prefix}spinner-animation-name: spinner-grow;
67 | // scss-docs-end spinner-grow-css-vars
68 |
69 | background-color: currentcolor;
70 | opacity: 0;
71 | }
72 |
73 | .spinner-grow-sm {
74 | --#{$prefix}spinner-width: #{$spinner-width-sm};
75 | --#{$prefix}spinner-height: #{$spinner-height-sm};
76 | }
77 |
78 | @if $enable-reduced-motion {
79 | @media (prefers-reduced-motion: reduce) {
80 | .spinner-border,
81 | .spinner-grow {
82 | --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed * 2};
83 | }
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/html/layouts/joomla/quickicons/icon.php:
--------------------------------------------------------------------------------
1 | escape($displayData['title']) . '"');
18 |
19 | // The information
20 | $text = empty($displayData['text']) ? '' : ('' . $displayData['text'] . '');
21 |
22 | $tmp = [];
23 |
24 | // Set id and class pulse for update icons
25 | if ($id && ($displayData['id'] === 'plg_quickicon_joomlaupdate'
26 | || $displayData['id'] === 'plg_quickicon_extensionupdate'
27 | || $displayData['id'] === 'plg_quickicon_privacycheck'
28 | || $displayData['id'] === 'plg_quickicon_overridecheck'
29 | || !empty($displayData['class'])))
30 | {
31 | $tmp[] = 'pulse';
32 | }
33 |
34 | // Add the button class
35 | if (!empty($displayData['class']))
36 | {
37 | $tmp[] = $this->escape($displayData['class']);
38 | }
39 |
40 | // Make the class string
41 | $class = !empty($tmp) ? ' class="nav-link ' . implode(' ', array_unique($tmp)) . '"' : 'class="nav-link"';
42 | ?>
43 |
44 | -
45 | href="">
46 |
47 |
50 |
51 |
52 |
aria-hidden="true">
53 |
54 |
55 |
56 |
57 |
59 | >
60 |
61 |
62 |
63 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/sass/media/vendor/custom-elements/joomla-alert.scss:
--------------------------------------------------------------------------------
1 | // Bootstrap core
2 | @import "../../../bootstrap/functions";
3 | @import "../../../bootstrap/variables";
4 | @import "../../../bootstrap/mixins";
5 |
6 | // Bettum Variables and mixins
7 | @import "../../../mixins";
8 | @import "../../../variables";
9 |
10 |
11 | $alert-colors: (
12 | primary: $blue-bg,
13 | success: $green-bg,
14 | info: $blue-bg,
15 | warning: $orange-bg,
16 | danger: $red-bg,
17 | );
18 |
19 |
20 | // Alert variants
21 | @mixin alert-variant($color) {
22 | color: #fff;
23 | background-color: $color;
24 | border-color: lighten($color, 15%);
25 |
26 | hr {
27 | border-top-color: darken($color, 15%);
28 | }
29 | }
30 |
31 | joomla-alert {
32 | display: block;
33 | min-width: 250px;
34 | max-width: 90vw;
35 | padding: $alert-padding-y $alert-padding-x;
36 | margin-bottom: $alert-margin-bottom;
37 | border: $alert-border-width solid transparent;
38 | animation-duration: .5s;
39 | animation-timing-function: ease-in-out;
40 |
41 | .joomla-alert--close, .joomla-alert-button--close {
42 | position: relative;
43 | top: -$alert-padding-y;
44 | right: -$alert-padding-x;
45 | padding: .2rem 1rem;
46 | color: #fff;
47 | float: right;
48 | background: transparent;
49 | border: 0;
50 |
51 | &:hover,
52 | &:focus {
53 | text-decoration: none;
54 | cursor: pointer;
55 | }
56 | }
57 |
58 | .joomla-alert--close {
59 | font-size: $close-font-size;
60 | font-weight: $close-font-weight;
61 | line-height: 1;
62 | }
63 |
64 | // Additional properties for button version
65 | // iOS requires the button element instead of an anchor tag.
66 | // If you want the anchor version, it requires `href="#"`.
67 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
68 |
69 | // scss-lint:disable QualifyingElement
70 | button.joomla-alert-button--close {
71 | padding-top: .75rem;
72 | font-size: 100%;
73 | line-height: 1.15;
74 | cursor: pointer;
75 | background: transparent;
76 | border: 0;
77 | -webkit-appearance: none;
78 | }
79 |
80 | .alert-link, a {
81 | color: inherit;
82 | text-decoration: underline;
83 | }
84 | }
85 |
86 | // Alternate styles
87 | @each $color, $value in $alert-colors {
88 | joomla-alert[type="#{$color}"] {
89 | @include alert-variant($value);
90 | }
91 | }
92 |
93 | @keyframes joomla-alert-fade-in {
94 | 0% { opacity: 0; }
95 | }
96 |
97 | @keyframes joomla-alert-fade-out {
98 | 0% { opacity: 1; }
99 | 100% { opacity: 0; }
100 | }
101 |
102 | // RTL overrides
103 | html[dir=rtl] joomla-alert {
104 | .joomla-alert--close,
105 | .joomla-alert-button--close {
106 | right: auto;
107 | left: -1.25rem;
108 | float: left;
109 | }
110 | }
--------------------------------------------------------------------------------
/sass/media/com_media/components/_media-tree.scss:
--------------------------------------------------------------------------------
1 | /* Media Tree */
2 |
3 | ul.media-tree {
4 | padding: 0 0 5px;
5 | margin: 0;
6 | overflow-x: visible;
7 | list-style: none;
8 | ul {
9 | margin-inline-start: 2px;
10 | }
11 | &:empty {
12 | display: none;
13 | }
14 | }
15 |
16 | .media-disk {
17 | margin-bottom: 10px;
18 | }
19 |
20 | .media-drive {
21 | overflow-x: auto;
22 | background-color: $sidebar-drive-bg;
23 | border: 1px solid var(--border-color);
24 | + .media-drive {
25 | border-top: 0;
26 | }
27 | }
28 |
29 | .media-disk-name {
30 | padding: 4px 1px;
31 | font-size: .8em;
32 | color: #767676;
33 | text-transform: uppercase;
34 | letter-spacing: 1px;
35 | &:empty {
36 | display: none;
37 | }
38 | }
39 |
40 | .media-tree-item {
41 | position: relative;
42 | display: block;
43 | &::before {
44 | position: absolute;
45 | top: ($sidebar-tree-line-height * .5);
46 | left: 0;
47 | width: 10px;
48 | height: 1px;
49 | margin: auto;
50 | content: "";
51 | background-color: $sidebar-tree-line-color;
52 | }
53 | &::after {
54 | position: absolute;
55 | top: 0;
56 | bottom: 0;
57 | left: 0;
58 | width: 1px;
59 | height: 100%;
60 | content: "";
61 | background-color: $sidebar-tree-line-color;
62 | }
63 | &:last-child {
64 | &::after {
65 | height: ($sidebar-tree-line-height * .5);
66 | }
67 | }
68 | li {
69 | padding-inline-start: 10px;
70 | &::before, &::after {
71 | left: 5px;
72 | }
73 | }
74 | }
75 |
76 | .media-drive-name {
77 | padding: 4px 10px;
78 | &::before {
79 | content: none;
80 | }
81 | &::after {
82 | content: none;
83 | }
84 | &:hover {
85 | cursor: pointer;
86 | }
87 | }
88 |
89 | .media-tree-item a {
90 | display: block;
91 | padding: 0 7px;
92 | line-height: $sidebar-tree-line-height;
93 | text-decoration: none;
94 | white-space: nowrap;
95 | cursor: pointer;
96 | }
97 |
98 | .media-tree-item.active > a {
99 | &:hover {
100 | text-decoration: none;
101 | color: $link-hover-color;
102 | }
103 | }
104 |
105 | .media-tree-item .item-icon {
106 | display: inline-block;
107 | padding-inline-end: 2px;
108 | font-size: 15px;
109 | line-height: normal;
110 | color: $sidebar-tree-icon-color;
111 | vertical-align: middle;
112 | }
113 |
114 | .media-tree-item.active > a .item-icon {
115 | color: $sidebar-active-icon-color;
116 | }
117 |
118 | .item-name {
119 | display: inline-block;
120 | overflow: hidden;
121 | font-size: .9em;
122 | text-overflow: ellipsis;
123 | white-space: nowrap;
124 | vertical-align: middle;
125 | }
126 |
127 | .media-tree-item.active > a .item-name {
128 | font-weight: bold;
129 | }
130 |
131 | /* RTL override */
132 | html[dir=rtl] {
133 | .media-tree-item li::before, .media-tree-item li::after {
134 | left: 0;
135 | right: 5px;
136 | margin: 0;
137 | }
138 | }
139 |
--------------------------------------------------------------------------------
/html/layouts/joomla/searchtools/default/bar.php:
--------------------------------------------------------------------------------
1 | get('filterButton', true);
25 | $searchButton = $data['options']->get('searchButton', true);
26 |
27 | $filters = $data['view']->filterForm->getGroup('filter');
28 | ?>
29 |
30 |
31 |
51 |
52 |
53 |
57 |
58 |
61 |
62 |
63 | input->getBool('hidemainmenu');
17 | ?>
18 |
19 |
24 |
35 |
36 |
--------------------------------------------------------------------------------
/sass/bootstrap/mixins/_buttons.scss:
--------------------------------------------------------------------------------
1 | // Button variants
2 | //
3 | // Easily pump out default styles, as well as :hover, :focus, :active,
4 | // and disabled options for all buttons
5 |
6 | // scss-docs-start btn-variant-mixin
7 | @mixin button-variant(
8 | $background,
9 | $border,
10 | $color: color-contrast($background),
11 | $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),
12 | $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),
13 | $hover-color: color-contrast($hover-background),
14 | $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
15 | $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
16 | $active-color: color-contrast($active-background),
17 | $disabled-background: $background,
18 | $disabled-border: $border,
19 | $disabled-color: color-contrast($disabled-background)
20 | ) {
21 | --#{$prefix}btn-color: #{$color};
22 | --#{$prefix}btn-bg: #{$background};
23 | --#{$prefix}btn-border-color: #{$border};
24 | --#{$prefix}btn-hover-color: #{$hover-color};
25 | --#{$prefix}btn-hover-bg: #{$hover-background};
26 | --#{$prefix}btn-hover-border-color: #{$hover-border};
27 | --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};
28 | --#{$prefix}btn-active-color: #{$active-color};
29 | --#{$prefix}btn-active-bg: #{$active-background};
30 | --#{$prefix}btn-active-border-color: #{$active-border};
31 | --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};
32 | --#{$prefix}btn-disabled-color: #{$disabled-color};
33 | --#{$prefix}btn-disabled-bg: #{$disabled-background};
34 | --#{$prefix}btn-disabled-border-color: #{$disabled-border};
35 | }
36 | // scss-docs-end btn-variant-mixin
37 |
38 | // scss-docs-start btn-outline-variant-mixin
39 | @mixin button-outline-variant(
40 | $color,
41 | $color-hover: color-contrast($color),
42 | $active-background: $color,
43 | $active-border: $color,
44 | $active-color: color-contrast($active-background)
45 | ) {
46 | --#{$prefix}btn-color: #{$color};
47 | --#{$prefix}btn-border-color: #{$color};
48 | --#{$prefix}btn-hover-color: #{$color-hover};
49 | --#{$prefix}btn-hover-bg: #{$active-background};
50 | --#{$prefix}btn-hover-border-color: #{$active-border};
51 | --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};
52 | --#{$prefix}btn-active-color: #{$active-color};
53 | --#{$prefix}btn-active-bg: #{$active-background};
54 | --#{$prefix}btn-active-border-color: #{$active-border};
55 | --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};
56 | --#{$prefix}btn-disabled-color: #{$color};
57 | --#{$prefix}btn-disabled-bg: transparent;
58 | --#{$prefix}btn-disabled-border-color: #{$color};
59 | --#{$prefix}gradient: none;
60 | }
61 | // scss-docs-end btn-outline-variant-mixin
62 |
63 | // scss-docs-start btn-size-mixin
64 | @mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {
65 | --#{$prefix}btn-padding-y: #{$padding-y};
66 | --#{$prefix}btn-padding-x: #{$padding-x};
67 | @include rfs($font-size, --#{$prefix}btn-font-size);
68 | --#{$prefix}btn-border-radius: #{$border-radius};
69 | }
70 | // scss-docs-end btn-size-mixin
71 |
--------------------------------------------------------------------------------
/html/layouts/chromes/body.php:
--------------------------------------------------------------------------------
1 | content) :
19 | $id = $module->id;
20 |
21 | // Permission checks
22 | $user = Factory::getUser();
23 | $canEdit = $user->authorise('core.edit', 'com_modules.module.' . $id) && $user->authorise('core.manage', 'com_modules');
24 | $canChange = $user->authorise('core.edit.state', 'com_modules.module.' . $id) && $user->authorise('core.manage', 'com_modules');
25 |
26 | $moduleTag = $params->get('module_tag', 'div');
27 | $bootstrapSize = (int) $params->get('bootstrap_size', 6);
28 | $moduleClass = ($bootstrapSize) ? 'col-md-' . $bootstrapSize : 'col-md-12';
29 | $headerTag = htmlspecialchars($params->get('header_tag', 'h2'));
30 | $moduleClassSfx = $params->get('moduleclass_sfx', '');
31 |
32 | // Temporarily store header class in variable
33 | $headerClass = $params->get('header_class');
34 | $headerClass = ($headerClass) ? ' ' . htmlspecialchars($headerClass) : '';
35 | ?>
36 |
37 | < class="card mb-3">
38 |
39 | isRTL() ? 'left' : 'right'; ?>
40 |
60 |
61 | showtitle) : ?>
62 | < class="card-header">title; ?>>
63 |
64 |
65 | content; ?>
66 |
67 | >
68 |
69 |
70 |
--------------------------------------------------------------------------------