diff --git a/calendar-bundle/contao/dca/tl_calendar_events.php b/calendar-bundle/contao/dca/tl_calendar_events.php index 51d5f909d0d..190ed1e54b3 100644 --- a/calendar-bundle/contao/dca/tl_calendar_events.php +++ b/calendar-bundle/contao/dca/tl_calendar_events.php @@ -78,7 +78,7 @@ 'sorting' => array ( 'mode' => DataContainer::MODE_PARENT, - 'fields' => array('startTime'), + 'fields' => array('startTime DESC'), 'headerFields' => array('title', 'jumpTo', 'tstamp', 'protected', 'allowComments'), 'panelLayout' => 'filter;sort,search,limit', 'defaultSearchField' => 'title', @@ -185,8 +185,6 @@ 'default' => static fn () => BackendUser::getInstance()->id, 'search' => true, 'filter' => true, - 'sorting' => true, - 'flag' => DataContainer::SORT_ASC, 'inputType' => 'select', 'foreignKey' => 'tl_user.name', 'eval' => array('doNotCopy'=>true, 'chosen'=>true, 'mandatory'=>true, 'includeBlankOption'=>true, 'tl_class'=>'w50'), @@ -204,7 +202,7 @@ 'default' => time(), 'filter' => true, 'sorting' => true, - 'flag' => DataContainer::SORT_MONTH_DESC, + 'flag' => DataContainer::SORT_MONTH_BOTH, 'inputType' => 'text', 'eval' => array('rgxp'=>'time', 'mandatory'=>true, 'doNotCopy'=>true, 'tl_class'=>'w50'), 'load_callback' => array @@ -845,7 +843,7 @@ public function getArticleAlias(DataContainer $dc) while ($objAlias->next()) { - $arrAlias[$objAlias->parent][$objAlias->id] = $objAlias->title . ' (' . ($GLOBALS['TL_LANG']['COLS'][$objAlias->inColumn] ?: $objAlias->inColumn) . ', ID ' . $objAlias->id . ')'; + $arrAlias[$objAlias->parent][$objAlias->id] = $objAlias->title . ' (' . ($GLOBALS['TL_LANG']['COLS'][$objAlias->inColumn] ?? $objAlias->inColumn) . ', ID ' . $objAlias->id . ')'; } } diff --git a/calendar-bundle/contao/modules/ModuleEventReader.php b/calendar-bundle/contao/modules/ModuleEventReader.php index fb00a2fddd2..5307c289d52 100644 --- a/calendar-bundle/contao/modules/ModuleEventReader.php +++ b/calendar-bundle/contao/modules/ModuleEventReader.php @@ -316,10 +316,7 @@ protected function compile() ->enableLightbox($objEvent->fullsize) ->buildIfResourceExists(); - if (null !== $figure) - { - $figure->applyLegacyTemplateData($objTemplate, null, $objEvent->floating); - } + $figure?->applyLegacyTemplateData($objTemplate, null, $objEvent->floating); } $objTemplate->enclosure = array(); diff --git a/calendar-bundle/public/calendar.svg b/calendar-bundle/public/calendar.svg index 0ab0cdc5778..80e9f6270bc 100644 --- a/calendar-bundle/public/calendar.svg +++ b/calendar-bundle/public/calendar.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/comments-bundle/contao/dca/tl_comments.php b/comments-bundle/contao/dca/tl_comments.php index a5799717957..1c5b7f249f5 100644 --- a/comments-bundle/contao/dca/tl_comments.php +++ b/comments-bundle/contao/dca/tl_comments.php @@ -140,14 +140,12 @@ 'source' => array ( 'filter' => true, - 'sorting' => true, 'reference' => &$GLOBALS['TL_LANG']['tl_comments'], 'sql' => "varchar(32) NOT NULL default ''" ), 'parent' => array ( 'filter' => true, - 'sorting' => true, 'sql' => "int(10) unsigned NOT NULL default 0" ), 'date' => array @@ -221,6 +219,7 @@ ( 'toggle' => true, 'filter' => true, + 'sorting' => true, 'inputType' => 'checkbox', 'eval' => array('doNotCopy'=>true), 'save_callback' => array @@ -567,11 +566,9 @@ public function listComments($arrRow) $key = ($arrRow['published'] ? 'published' : 'unpublished') . ($arrRow['addReply'] ? ' replied' : ''); return ' -
' . $arrRow['name'] . '' . ($arrRow['website'] ? ' (' . $GLOBALS['TL_LANG']['MSC']['com_website'] . ')' : '') . ' – ' . Date::parse(Config::get('datimFormat'), $arrRow['date']) . ' – IP ' . StringUtil::specialchars($arrRow['ip']) . '
' . $title . '
-
+
' . $arrRow['comment'] . ' -
' . "\n "; } @@ -641,7 +638,7 @@ public function toggleIcon($row, $href, $label, $title, $icon, $attributes) return Image::getHtml($icon) . ' '; } - return '' . Image::getHtml($icon, $label, 'data-icon="' . Image::getPath('visible.svg') . '" data-icon-disabled="' . Image::getPath('invisible.svg') . '"data-state="' . ($row['published'] ? 1 : 0) . '"') . ' '; + return '' . Image::getHtml($icon, $label, 'data-icon="visible.svg" data-icon-disabled="invisible.svg" data-state="' . ($row['published'] ? 1 : 0) . '"') . ' '; } /** diff --git a/comments-bundle/contao/languages/en/tl_comments.xlf b/comments-bundle/contao/languages/en/tl_comments.xlf index da86653ef9a..49df2652367 100644 --- a/comments-bundle/contao/languages/en/tl_comments.xlf +++ b/comments-bundle/contao/languages/en/tl_comments.xlf @@ -69,7 +69,7 @@ Here you can enter the reply. - Publish comment + Published Make the comment publicly visible on the website. diff --git a/comments-bundle/public/approved.svg b/comments-bundle/public/approved.svg index 6657b29caf0..7e1808e9f74 100644 --- a/comments-bundle/public/approved.svg +++ b/comments-bundle/public/approved.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/comments-bundle/public/comments.min.css b/comments-bundle/public/comments.min.css index dd1551e1867..3572788046b 100644 --- a/comments-bundle/public/comments.min.css +++ b/comments-bundle/public/comments.min.css @@ -1 +1 @@ -.cte_type{background-position:left 6px;background-repeat:no-repeat;padding-left:22px;line-height:14px}.tl_file_list{position:relative}.comment_wrap a:not(:hover){color:inherit}.mark_links a{text-decoration:underline}.cte_type.published{background-image:url(approved.svg)}.cte_type.published.replied{background-image:url(replied.svg)}.cte_type.unpublished{background-image:url(pending.svg)} \ No newline at end of file +.tl_file_list:not(.tl_right_nowrap){padding:0}.cte_type{padding:6px;margin:0;line-height:14px}.cte_preview{padding:0 6px 4px}.cte_type{background-position:6px center;background-repeat:no-repeat;padding-left:30px}.cte_type.published{background-image:url(approved.svg)}.cte_type.published.replied{background-image:url(replied.svg)}.cte_type.unpublished{background-image:url(pending.svg)}.cte_preview a{text-decoration:underline}.cte_preview a:not(:hover){color:inherit} \ No newline at end of file diff --git a/comments-bundle/public/pending.svg b/comments-bundle/public/pending.svg index 43c6ea5ae4e..52a79933e3a 100644 --- a/comments-bundle/public/pending.svg +++ b/comments-bundle/public/pending.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/comments-bundle/public/replied.svg b/comments-bundle/public/replied.svg index 4aa468908ea..2fe57843c86 100644 --- a/comments-bundle/public/replied.svg +++ b/comments-bundle/public/replied.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/composer.json b/composer.json index 5ca76c22b32..57b4964afb1 100644 --- a/composer.json +++ b/composer.json @@ -42,17 +42,17 @@ "ausi/slug-generator": "^1.1", "bacon/bacon-qr-code": "^2.0", "contao-components/ace": "^1.8", - "contao-components/chosen": "^1.2", + "contao-components/chosen": "^2.0", "contao-components/colorbox": "^1.6", "contao-components/colorpicker": "^1.5", "contao-components/contao": "^9.1", - "contao-components/datepicker": "^2.3", + "contao-components/datepicker": "^3.0", "contao-components/dropzone": "^5.0.1", "contao-components/jquery": "^3.5", "contao-components/jquery-ui": "^1.11.4", "contao-components/mediabox": "^1.5", "contao-components/mootools": "^1.6.0.1", - "contao-components/simplemodal": "^2.1", + "contao-components/simplemodal": "^3.0", "contao-components/swipe": "^2.0.3", "contao-components/tablesort": "^4.0", "contao-components/tablesorter": "^2.1", @@ -110,6 +110,7 @@ "symfony/dependency-injection": "^5.4 || ^6.0", "symfony/deprecation-contracts": "^2.1 || ^3.0", "symfony/doctrine-bridge": "^5.4 || ^6.0", + "symfony/doctrine-messenger": "^5.4 || ^6.0", "symfony/dom-crawler": "^5.4 || ^6.0", "symfony/dotenv": "^5.4 || ^6.0", "symfony/error-handler": "^5.4 || ^6.0", @@ -127,6 +128,7 @@ "symfony/lock": "^5.4 || ^6.0", "symfony/mailer": "^5.4 || ^6.0", "symfony/maker-bundle": "^1.1", + "symfony/messenger": "^5.4 || ^6.0", "symfony/mime": "^5.4 || ^6.0", "symfony/monolog-bridge": "^5.4 || ^6.0", "symfony/monolog-bundle": "^3.1", @@ -137,6 +139,7 @@ "symfony/process": "^5.4 || ^6.0", "symfony/property-access": "^5.4 || ^6.0", "symfony/proxy-manager-bridge": "^5.4 || ^6.0", + "symfony/rate-limiter": "^5.4 || ^6.0", "symfony/routing": "^5.4 || ^6.0", "symfony/security-bundle": "^6.0.2", "symfony/security-core": "^6.1", @@ -300,11 +303,11 @@ }, "scripts": { "all": [ - "@unit-tests", - "@functional-tests", "@rector", "@cs-fixer", "@service-linter", + "@unit-tests", + "@functional-tests", "@phpstan", "@require-checker", "@monorepo-tools" diff --git a/core-bundle/README.md b/core-bundle/README.md index 1037398a29a..9a8ba96b765 100644 --- a/core-bundle/README.md +++ b/core-bundle/README.md @@ -80,6 +80,7 @@ security: provider: contao.security.backend_user_provider user_checker: contao.security.user_checker switch_user: true + login_throttling: ~ contao_login: remember_me: false @@ -92,6 +93,7 @@ security: provider: contao.security.frontend_user_provider user_checker: contao.security.user_checker switch_user: false + login_throttling: ~ contao_login: remember_me: true diff --git a/core-bundle/assets/ajax-form.js b/core-bundle/assets/ajax-form.js new file mode 100644 index 00000000000..328ca2b6e59 --- /dev/null +++ b/core-bundle/assets/ajax-form.js @@ -0,0 +1,61 @@ +window.addEventListener('DOMContentLoaded', () => { + document.querySelectorAll('[data-ajax-form]').forEach(el => { + function request(form, body, callback) { + const xhr = new XMLHttpRequest(); + + xhr.open('POST', form.action, true); + xhr.setRequestHeader('Accept', 'text/html'); + xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); + xhr.setRequestHeader('X-Contao-Ajax-Form', form.querySelector('[name="FORM_SUBMIT"]').value); + + form.ariaBusy = 'true'; + form.dataset.ajaxForm = 'loading'; + + xhr.onload = () => { + form.dispatchEvent(new CustomEvent('ajax-form-onload', { + bubbles: true, + detail: { body, form, xhr }, + })); + + form.ariaBusy = 'false'; + form.dataset.ajaxForm = ''; + + callback(xhr); + }; + + xhr.send(body || null) + } + + function initForm(form) { + form.addEventListener('submit', e => { + e.preventDefault(); + + const formData = new FormData(form); + + // Send the triggered button data as well + if (e.submitter) { + formData.append(e.submitter.name, e.submitter.value); + } + + request(form, formData, xhr => { + const location = xhr.getResponseHeader('X-Ajax-Location'); + + // Handle the redirect header + if (location) { + window.location.href = location; + return; + } + + const template = document.createElement('template'); + template.innerHTML = xhr.responseText.trim(); + + const newForm = template.content.firstElementChild; + form.replaceWith(newForm); + initForm(newForm); + }); + }); + } + + initForm(el); + }); +}); diff --git a/core-bundle/assets/backend.js b/core-bundle/assets/backend.js index 6c187f8fd57..371a5d52ad2 100644 --- a/core-bundle/assets/backend.js +++ b/core-bundle/assets/backend.js @@ -1,12 +1,14 @@ import { Application } from '@hotwired/stimulus' import { definitionForModuleAndIdentifier, identifierForContextKey } from '@hotwired/stimulus-webpack-helpers' -import './scripts/autofocus' -import './scripts/limit-height' -import './scripts/modulewizard' -import './scripts/sectionwizard' -import './scripts/tips' -import './scripts/toggle-fieldset' +import './scripts/mootao.js' +import './scripts/core.js' +import './scripts/autofocus.js' +import './scripts/limit-height.js' +import './scripts/modulewizard.js' +import './scripts/sectionwizard.js' +import './scripts/tips.js' +import './scripts/toggle-fieldset.js' // Start Stimulus application and register all controllers with `contao--` prefix. const application = Application.start() diff --git a/core-bundle/assets/controllers/color-scheme-controller.js b/core-bundle/assets/controllers/color-scheme-controller.js new file mode 100644 index 00000000000..b4b7cc47709 --- /dev/null +++ b/core-bundle/assets/controllers/color-scheme-controller.js @@ -0,0 +1,68 @@ +import { Controller } from '@hotwired/stimulus'; + +const prefersDark = () => { + const prefersDark = localStorage.getItem('contao--prefers-dark'); + + if (null === prefersDark) { + return !!window.matchMedia('(prefers-color-scheme: dark)').matches; + } + + return prefersDark === 'true'; +} + +const setColorScheme = () => { + document.documentElement.dataset.colorScheme = prefersDark() ? 'dark' : 'light'; +}; + +window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', setColorScheme); +setColorScheme(); + +export default class extends Controller { + static targets = ['label']; + + static values = { + i18n: { + type: Object, + default: { light: 'Disable dark mode', dark: 'Enable dark mode' } + } + }; + + initialize () { + this.toggle = this.toggle.bind(this); + this.setLabel = this.setLabel.bind(this); + } + + connect () { + this.element.addEventListener('click', this.toggle); + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', this.setLabel); + this.setLabel(); + } + + disconnect () { + this.element.removeEventListener('click', this.toggle); + } + + toggle (e) { + e.preventDefault(); + + const isDark = !prefersDark(); + + if (isDark === window.matchMedia('(prefers-color-scheme: dark)').matches) { + localStorage.removeItem('contao--prefers-dark'); + } else { + localStorage.setItem('contao--prefers-dark', String(isDark)); + } + + setColorScheme(); + + // Change the label after the dropdown is hidden + setTimeout(this.setLabel, 300); + } + + setLabel () { + if (this.hasLabelTarget) { + this.labelTarget.innerText = this.i18nValue[prefersDark() ? 'light' : 'dark']; + } + } +} diff --git a/core-bundle/public/core.js b/core-bundle/assets/scripts/core.js similarity index 97% rename from core-bundle/public/core.js rename to core-bundle/assets/scripts/core.js index 55165ae4871..6bab59bb792 100644 --- a/core-bundle/public/core.js +++ b/core-bundle/assets/scripts/core.js @@ -1,17 +1,9 @@ -/*! - * This file is part of Contao. - * - * (c) Leo Feyer - * - * @license LGPL-3.0-or-later - */ - /** * Provide methods to handle Ajax requests. * * @author Leo Feyer */ -var AjaxRequest = +window.AjaxRequest = { /** * The theme path @@ -66,7 +58,7 @@ var AjaxRequest = el.blur(); var item = $(id), - image = $(el).getFirst('img'); + image = $(el).getElement('img'); if (item) { if (item.getStyle('display') == 'none') { @@ -86,7 +78,9 @@ var AjaxRequest = new Request.Contao({ field: el, evalScripts: true, - onRequest: AjaxRequest.displayBox(Contao.lang.loading + ' …'), + onRequest: function() { + AjaxRequest.displayBox(Contao.lang.loading + ' …') + }, onSuccess: function(txt) { var li = new Element('li', { 'id': id, @@ -155,7 +149,7 @@ var AjaxRequest = el.blur(); var item = $(id), - image = $(el).getFirst('img'); + image = $(el).getElement('img'); if (item) { if (item.getStyle('display') == 'none') { @@ -175,7 +169,9 @@ var AjaxRequest = new Request.Contao({ field: el, evalScripts: true, - onRequest: AjaxRequest.displayBox(Contao.lang.loading + ' …'), + onRequest: function() { + AjaxRequest.displayBox(Contao.lang.loading + ' …') + }, onSuccess: function(txt) { var li = new Element('li', { 'id': id, @@ -244,7 +240,9 @@ var AjaxRequest = new Request.Contao({ field: el, evalScripts: false, - onRequest: AjaxRequest.displayBox(Contao.lang.loading + ' …'), + onRequest: function() { + AjaxRequest.displayBox(Contao.lang.loading + ' …') + }, onSuccess: function(txt, json) { var div = new Element('div', { 'id': id, @@ -313,15 +311,15 @@ var AjaxRequest = el.blur(); var img = null, - image = $(el).getFirst('img'), - published = (image.get('data-state') == 1), + images = $(el).getElements('img'), + published = (images[0].get('data-state') == 1), div = el.getParent('div'), next, pa; if (rowIcon) { // Find the icon depending on the view (tree view, list view, parent view) if (div.hasClass('tl_right')) { - img = div.getPrevious('div').getElement('img'); + img = div.getPrevious('div').getElements('img'); } else if (div.hasClass('tl_listing_container')) { img = el.getParent('td').getPrevious('td').getFirst('div.list_icon'); if (img === null) { // comments @@ -342,22 +340,25 @@ var AjaxRequest = // Change the row icon if (img !== null) { // Tree view - if (img.nodeName.toLowerCase() == 'img') { - if (img.getParent('ul.tl_listing').hasClass('tl_tree_xtnd')) { - img.src = !published ? img.get('data-icon') : img.get('data-icon-disabled'); - } else { - pa = img.getParent('a'); - - if (pa && pa.href.indexOf('contao/preview') == -1) { - if (next = pa.getNext('a')) { - img = next.getFirst('img'); - } else { - img = new Element('img'); // no icons used (see #2286) + if (!(img instanceof HTMLElement) && img.forEach) { + img.forEach((img) => { + if (img.nodeName.toLowerCase() == 'img') { + if (!img.getParent('ul.tl_listing').hasClass('tl_tree_xtnd')) { + pa = img.getParent('a'); + + if (pa && pa.href.indexOf('contao/preview') == -1) { + if (next = pa.getNext('a')) { + img = next.getElement('img'); + } else { + img = new Element('img'); // no icons used (see #2286) + } + } } - } - img.src = !published ? img.get('data-icon') : img.get('data-icon-disabled'); - } + const newSrc = !published ? img.get('data-icon') : img.get('data-icon-disabled'); + img.src = (img.src.includes('/') && !newSrc.includes('/')) ? img.src.slice(0, img.src.lastIndexOf('/') + 1) + newSrc : newSrc; + } + }) } // Parent view else if (img.hasClass('cte_type')) { @@ -377,8 +378,11 @@ var AjaxRequest = } // Send request - image.src = !published ? image.get('data-icon') : image.get('data-icon-disabled'); - image.set('data-state', !published ? 1 : 0); + images.forEach(function (image) { + const newSrc = !published ? image.get('data-icon') : image.get('data-icon-disabled'); + image.src = (image.src.includes('/') && !newSrc.includes('/')) ? image.src.slice(0, image.src.lastIndexOf('/') + 1) + newSrc : newSrc; + image.set('data-state', !published ? 1 : 0); + }); new Request.Contao({'url':el.href, 'followRedirects':false}).get(); @@ -398,7 +402,7 @@ var AjaxRequest = el.blur(); var item = $(id), - image = $(el).getFirst('img'); + image = $(el).getElement('img'); if (item) { if (item.getStyle('display') == 'none') { @@ -476,7 +480,7 @@ var AjaxRequest = * * @author Leo Feyer */ -var Backend = +window.Backend = { /** * The current ID @@ -596,7 +600,7 @@ var Backend = return; } var frm = window.frames['simple-modal-iframe'], - val = [], ul, inp, field, act, it, i, pickerValue, sIndex; + val = [], ul, inp, i, pickerValue, sIndex; if (frm === undefined) { alert('Could not find the SimpleModal frame'); return; @@ -2038,9 +2042,7 @@ var Backend = } } - function execRequest(onlyStatusUpdate) { - var onlyStatusUpdate = onlyStatusUpdate || false; - + function execRequest(onlyStatusUpdate = false) { new Request({ url: window.location.href, headers: { diff --git a/core-bundle/assets/scripts/limit-height.js b/core-bundle/assets/scripts/limit-height.js index b035cff3298..38784edd07e 100644 --- a/core-bundle/assets/scripts/limit-height.js +++ b/core-bundle/assets/scripts/limit-height.js @@ -10,21 +10,23 @@ window.addEventListener('DOMContentLoaded', function () { // Return if there is no height value if (!hgt) return; - const height = div.offsetHeight; - - // Resize the element - div.style.height = hgt+'px'; + const style = window.getComputedStyle(div, null); + const padding = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom); + const height = div.clientHeight - padding; // Do not add the toggle if the preview height is below the max-height if (height <= hgt) return; + // Resize the element if it is higher than the maximum height + div.style.height = hgt+'px'; + const button = document.createElement('button'); button.setAttribute('type', 'button'); button.innerHTML = '...'; button.classList.add('unselectable'); button.addEventListener('click', function () { - if (div.offsetHeight > hgt) { + if (div.style.height == 'auto') { div.style.height = hgt+'px'; } else { div.style.height = 'auto'; diff --git a/core-bundle/public/mootao.js b/core-bundle/assets/scripts/mootao.js similarity index 99% rename from core-bundle/public/mootao.js rename to core-bundle/assets/scripts/mootao.js index 02a85e86768..68cdf8acae9 100644 --- a/core-bundle/public/mootao.js +++ b/core-bundle/assets/scripts/mootao.js @@ -1,11 +1,3 @@ -/*! - * This file is part of Contao. - * - * (c) Leo Feyer - * - * @license LGPL-3.0-or-later - */ - /* --- diff --git a/core-bundle/composer.json b/core-bundle/composer.json index 12d2ef8de47..05631c25af2 100644 --- a/core-bundle/composer.json +++ b/core-bundle/composer.json @@ -42,17 +42,17 @@ "ausi/slug-generator": "^1.1", "bacon/bacon-qr-code": "^2.0", "contao-components/ace": "^1.8", - "contao-components/chosen": "^1.2", + "contao-components/chosen": "^2.0", "contao-components/colorbox": "^1.6", "contao-components/colorpicker": "^1.5", "contao-components/contao": "^9.1", - "contao-components/datepicker": "^2.3", + "contao-components/datepicker": "^3.0", "contao-components/dropzone": "^5.0.1", "contao-components/jquery": "^3.5", "contao-components/jquery-ui": "^1.11.4", "contao-components/mediabox": "^1.5", "contao-components/mootools": "^1.6.0.1", - "contao-components/simplemodal": "^2.1", + "contao-components/simplemodal": "^3.0", "contao-components/swipe": "^2.0.3", "contao-components/tablesort": "^4.0", "contao-components/tablesorter": "^2.1", @@ -106,6 +106,7 @@ "symfony/dependency-injection": "^5.4 || ^6.0", "symfony/deprecation-contracts": "^2.1 || ^3.0", "symfony/doctrine-bridge": "^5.4 || ^6.0", + "symfony/doctrine-messenger": "^5.4 || ^6.0", "symfony/dom-crawler": "^5.4 || ^6.0", "symfony/event-dispatcher": "^5.4 || ^6.0", "symfony/event-dispatcher-contracts": "^2.0 || ^3.0", @@ -120,6 +121,7 @@ "symfony/intl": "^5.4 || ^6.0", "symfony/lock": "^5.4 || ^6.0", "symfony/mailer": "^5.4 || ^6.0", + "symfony/messenger": "^5.4 || ^6.0", "symfony/mime": "^5.4 || ^6.0", "symfony/monolog-bridge": "^5.4 || ^6.0", "symfony/password-hasher": "^5.4 || ^6.0", @@ -127,6 +129,7 @@ "symfony/polyfill-mbstring": "^1.0", "symfony/process": "^5.4 || ^6.0", "symfony/property-access": "^5.4 || ^6.0", + "symfony/rate-limiter": "^5.4 || ^6.0", "symfony/routing": "^5.4 || ^6.0", "symfony/security-bundle": "^6.0.2", "symfony/security-core": "^6.1", diff --git a/core-bundle/config/listener.yaml b/core-bundle/config/listener.yaml index 2df1f0867e5..7b6a8ba7c72 100644 --- a/core-bundle/config/listener.yaml +++ b/core-bundle/config/listener.yaml @@ -2,6 +2,17 @@ services: _defaults: autoconfigure: true + contao.listener.administrator_email: + class: Contao\CoreBundle\EventListener\AdministratorEmailListener + arguments: + - '@contao.framework' + - '@translator' + - '@router' + - '@request_stack' + - '@security.helper' + tags: + - { name: contao.hook, hook: getSystemMessages } + contao.listener.data_container.backend_favorites: class: Contao\CoreBundle\EventListener\DataContainer\BackendFavoritesListener arguments: @@ -43,9 +54,9 @@ services: class: Contao\CoreBundle\EventListener\CommandSchedulerListener arguments: - '@contao.cron' - - '@contao.framework' - '@database_connection' - '%fragment.path%' + - ~ tags: - kernel.event_listener @@ -211,6 +222,7 @@ services: class: Contao\CoreBundle\EventListener\DoctrineSchemaListener arguments: - '@contao.doctrine.dca_schema_provider' + - '@messenger.receiver_locator' tags: - { name: doctrine.event_listener, event: postGenerateSchema } @@ -328,6 +340,15 @@ services: # Make sure this listener comes before the other ones adding to its tree - { name: kernel.event_listener, priority: 10 } + contao.listener.menu.backend_color_scheme: + class: Contao\CoreBundle\EventListener\Menu\BackendColorSchemeListener + arguments: + - '@security.helper' + - '@translator' + tags: + # Make sure this listener comes last + - { name: kernel.event_listener, priority: -96 } + contao.listener.menu.backend_favorites: class: Contao\CoreBundle\EventListener\Menu\BackendFavoritesListener arguments: @@ -361,6 +382,11 @@ services: tags: - kernel.event_listener + contao.listener.messenger.worker: + class: Contao\CoreBundle\Messenger\EventListener\WorkerListener + arguments: + - '@contao.messenger.auto_fallback_notifier' + contao.listener.merge_http_headers: class: Contao\CoreBundle\EventListener\MergeHttpHeadersListener arguments: @@ -490,7 +516,7 @@ services: contao.listener.search_index: class: Contao\CoreBundle\EventListener\SearchIndexListener arguments: - - '@contao.search.indexer' + - '@messenger.bus.default' - '%fragment.path%' tags: - kernel.event_listener diff --git a/core-bundle/config/migrations.yaml b/core-bundle/config/migrations.yaml index aa160776f49..17ab9fa8fe4 100644 --- a/core-bundle/config/migrations.yaml +++ b/core-bundle/config/migrations.yaml @@ -31,6 +31,11 @@ services: arguments: - '@database_connection' + contao.migration.version_500.accesskey: + class: Contao\CoreBundle\Migration\Version500\AccesskeyMigration + arguments: + - '@database_connection' + contao.migration.version_500.guests: class: Contao\CoreBundle\Migration\Version500\GuestsMigration arguments: diff --git a/core-bundle/config/services.yaml b/core-bundle/config/services.yaml index 8b899d755d6..187beb490c7 100644 --- a/core-bundle/config/services.yaml +++ b/core-bundle/config/services.yaml @@ -95,8 +95,15 @@ services: arguments: - !service_closure '@contao.repository.cron_job' - !service_closure '@doctrine.orm.entity_manager' + - '@cache.app' - '@?logger' + contao.cron.messenger: + class: Contao\CoreBundle\Cron\MessengerCron + arguments: + - '@messenger.receiver_locator' + - '@contao.util.process_util' + contao.cron.purge_expired_data: class: Contao\CoreBundle\Cron\PurgeExpiredDataCron arguments: @@ -453,6 +460,23 @@ services: arguments: - '@contao.menu.matcher' + contao.messenger.auto_fallback_notifier: + class: Contao\CoreBundle\Messenger\AutoFallbackNotifier + arguments: + - '@cache.app' + - '@messenger.receiver_locator' + + contao.messenger.message_handler.search_index: + class: Contao\CoreBundle\Messenger\MessageHandler\SearchIndexMessageHandler + arguments: + - '@?contao.search.indexer' + + contao.messenger.transport.auto_fallback_transport_factory: + class: Contao\CoreBundle\Messenger\Transport\AutoFallbackTransportFactory + arguments: + - '@contao.messenger.auto_fallback_notifier' + - '@messenger.receiver_locator' + contao.model_argument_resolver: class: Contao\CoreBundle\HttpKernel\ModelArgumentResolver arguments: @@ -1049,6 +1073,9 @@ services: arguments: - '@request_stack' + contao.util.process_util: + class: Contao\CoreBundle\Util\ProcessUtil + # Autowiring aliases Contao\CoreBundle\Cache\EntityCacheTags: '@contao.cache.entity_tags' Contao\CoreBundle\Config\ResourceFinderInterface: '@contao.resource_finder' diff --git a/core-bundle/contao/classes/Backend.php b/core-bundle/contao/classes/Backend.php index db8c6c7de36..2a2ae25634a 100644 --- a/core-bundle/contao/classes/Backend.php +++ b/core-bundle/contao/classes/Backend.php @@ -682,7 +682,7 @@ public static function addPageIcon($row, $label, DataContainer $dc=null, $imageA } $image = Controller::getPageStatusIcon((object) $row); - $imageAttribute = trim($imageAttribute . ' data-icon="' . Image::getUrl(Controller::getPageStatusIcon((object) array_merge($row, array('published'=>1)))) . '" data-icon-disabled="' . Image::getUrl(Controller::getPageStatusIcon((object) array_merge($row, array('published'=>0)))) . '"'); + $imageAttribute = trim($imageAttribute . ' data-icon="' . Controller::getPageStatusIcon((object) array_merge($row, array('published'=>1))) . '" data-icon-disabled="' . Controller::getPageStatusIcon((object) array_merge($row, array('published'=>0))) . '"'); // Return the image only if ($blnReturnImage) diff --git a/core-bundle/contao/classes/DataContainer.php b/core-bundle/contao/classes/DataContainer.php index 5a4815fe5b7..a4929c939ea 100644 --- a/core-bundle/contao/classes/DataContainer.php +++ b/core-bundle/contao/classes/DataContainer.php @@ -131,6 +131,36 @@ abstract class DataContainer extends Backend */ public const SORT_DESC = 12; + /** + * Sort by initial letter ascending and descending + */ + public const SORT_INITIAL_LETTER_BOTH = 13; + + /** + * Sort by initial two letters ascending and descending + */ + public const SORT_INITIAL_LETTERS_BOTH = 14; + + /** + * Sort by day ascending and descending + */ + public const SORT_DAY_BOTH = 15; + + /** + * Sort by month ascending and descending + */ + public const SORT_MONTH_BOTH = 16; + + /** + * Sort by year ascending and descending + */ + public const SORT_YEAR_BOTH = 17; + + /** + * Sort ascending and descending + */ + public const SORT_BOTH = 18; + /** * Current ID * @var integer|string @@ -368,7 +398,7 @@ protected function row($strPalette=null) // Add the help wizard if ($arrData['eval']['helpwizard'] ?? null) { - $xlabel .= ' ' . Image::getHtml('about.svg', $GLOBALS['TL_LANG']['MSC']['helpWizard']) . ''; + $xlabel .= ' ' . Image::getHtml('help.svg', $GLOBALS['TL_LANG']['MSC']['helpWizard']) . ''; } // Add a custom xlabel @@ -963,7 +993,7 @@ protected function generateButtons($arrRow, $strTable, $arrRootIds=array(), $bln } else { - $return .= '' . Image::getHtml($state ? $icon : $_icon, $config['label'], 'data-icon="' . Image::getUrl($icon) . '" data-icon-disabled="' . Image::getUrl($_icon) . '" data-state="' . $state . '"') . ' '; + $return .= '' . Image::getHtml($state ? $icon : $_icon, $config['label'], 'data-icon="' . $icon . '" data-icon-disabled="' . $_icon . '" data-state="' . $state . '"') . ' '; } } elseif ($href === null) @@ -1189,7 +1219,7 @@ protected function generateHeaderButtons($arrRow, $strPtable) $state = $arrRow[$params['field']] ? 0 : 1; } - $return .= '' . Image::getHtml($state ? $icon : $_icon, $label, 'data-icon="' . Image::getUrl($icon) . '" data-icon-disabled="' . Image::getUrl($_icon) . '" data-state="' . $state . '"') . ' '; + $return .= '' . Image::getHtml($state ? $icon : $_icon, $label, 'data-icon="' . $icon . '" data-icon-disabled="' . $_icon . '" data-state="' . $state . '"') . ' '; } else { @@ -1587,7 +1617,7 @@ public function generateRecordLabel(array $row, string $table = null, bool $prot $args[$k] = $objRef->numRows ? $objRef->$strField : ''; } - elseif (\in_array($GLOBALS['TL_DCA'][$table]['fields'][$v]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_YEAR_ASC, self::SORT_YEAR_DESC))) + elseif (\in_array($GLOBALS['TL_DCA'][$table]['fields'][$v]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_DAY_BOTH, self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_MONTH_BOTH, self::SORT_YEAR_ASC, self::SORT_YEAR_DESC, self::SORT_YEAR_BOTH))) { if (($GLOBALS['TL_DCA'][$table]['fields'][$v]['eval']['rgxp'] ?? null) == 'date') { diff --git a/core-bundle/contao/classes/FrontendTemplate.php b/core-bundle/contao/classes/FrontendTemplate.php index a8c809bfc29..72310267e86 100644 --- a/core-bundle/contao/classes/FrontendTemplate.php +++ b/core-bundle/contao/classes/FrontendTemplate.php @@ -10,6 +10,7 @@ namespace Contao; +use Contao\CoreBundle\EventListener\MakeResponsePrivateListener; use Symfony\Component\HttpFoundation\Response; /** @@ -168,18 +169,22 @@ private function setCacheHeaders(Response $response) { $response->setSharedMaxAge($objPage->cache); // Automatically sets the response to public - // We vary on cookies if a response is cacheable by the shared - // cache, so a reverse proxy does not load a response from cache if - // the _request_ contains a cookie. - // - // This DOES NOT mean that we generate a cache entry for every - // response containing a cookie! Responses with cookies will always - // be private (@see Contao\CoreBundle\EventListener\MakeResponsePrivateListener). - // - // However, we want to be able to force the reverse proxy to load a - // response from cache, even if the request contains a cookie – in - // case the admin has configured to do so. A typical use case would - // be serving public pages from cache to logged in members. + /** + * We vary on cookies if a response is cacheable by the shared + * cache, so a reverse proxy does not load a response from cache if + * the _request_ contains a cookie. + * + * This DOES NOT mean that we generate a cache entry for every + * response containing a cookie! Responses with cookies will always + * be private. + * + * @see MakeResponsePrivateListener + * + * However, we want to be able to force the reverse proxy to load a + * response from cache, even if the request contains a cookie – in + * case the admin has configured to do so. A typical use case would + * be serving public pages from cache to logged in members. + */ if (!$objPage->alwaysLoadFromCache) { $response->setVary(array('Cookie')); diff --git a/core-bundle/contao/classes/Versions.php b/core-bundle/contao/classes/Versions.php index 90c8860d9dd..48201fbd969 100644 --- a/core-bundle/contao/classes/Versions.php +++ b/core-bundle/contao/classes/Versions.php @@ -651,17 +651,17 @@ public static function addToTemplate(BackendTemplate $objTemplate) $objTotal = $objDatabase->prepare("SELECT COUNT(*) AS count FROM tl_version WHERE editUrl IS NOT NULL" . (!$objUser->isAdmin ? " AND userid=?" : "")) ->execute(...$params); - $intLast = ceil($objTotal->count / 30); + $intLast = ceil($objTotal->count / 15); $intPage = max(1, min(Input::get('vp') ?? 1, $intLast)); - $intOffset = ($intPage - 1) * 30; + $intOffset = ($intPage - 1) * 15; // Create the pagination menu - $objPagination = new Pagination($objTotal->count, 30, 7, 'vp', new BackendTemplate('be_pagination')); + $objPagination = new Pagination($objTotal->count, 15, 7, 'vp', new BackendTemplate('be_pagination')); $objTemplate->pagination = $objPagination->generate(); // Get the versions $objVersions = $objDatabase->prepare("SELECT pid, tstamp, version, fromTable, username, userid, description, editUrl, active FROM tl_version WHERE editUrl IS NOT NULL" . (!$objUser->isAdmin ? " AND userid=?" : "") . " ORDER BY tstamp DESC, pid, version DESC") - ->limit(30, $intOffset) + ->limit(15, $intOffset) ->execute(...$params); $security = System::getContainer()->get('security.helper'); diff --git a/core-bundle/contao/config/default.php b/core-bundle/contao/config/default.php index e0fc0e6ca99..6ed40227fc8 100644 --- a/core-bundle/contao/config/default.php +++ b/core-bundle/contao/config/default.php @@ -100,7 +100,6 @@ $GLOBALS['TL_CONFIG']['backendTheme'] = 'flexible'; $GLOBALS['TL_CONFIG']['doNotCollapse'] = false; $GLOBALS['TL_CONFIG']['minPasswordLength'] = 8; -$GLOBALS['TL_CONFIG']['disableCron'] = false; $GLOBALS['TL_CONFIG']['defaultFileChmod'] = 0644; $GLOBALS['TL_CONFIG']['defaultFolderChmod'] = 0755; $GLOBALS['TL_CONFIG']['maxPaginationLinks'] = 7; diff --git a/core-bundle/contao/controllers/BackendIndex.php b/core-bundle/contao/controllers/BackendIndex.php index 5848559aa1b..d08767260e3 100644 --- a/core-bundle/contao/controllers/BackendIndex.php +++ b/core-bundle/contao/controllers/BackendIndex.php @@ -10,7 +10,6 @@ namespace Contao; -use Contao\CoreBundle\Security\Exception\LockedException; use Scheb\TwoFactorBundle\Security\Authentication\Exception\InvalidTwoFactorCodeException; use Scheb\TwoFactorBundle\Security\Authentication\Token\TwoFactorToken; use Scheb\TwoFactorBundle\Security\TwoFactor\Event\TwoFactorAuthenticationEvent; @@ -20,6 +19,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Exception\AuthenticationException; +use Symfony\Component\Security\Core\Exception\TooManyLoginAttemptsAuthenticationException; /** * Handle back end logins and logouts. @@ -54,9 +54,9 @@ public function run() $container = System::getContainer(); $exception = $container->get('security.authentication_utils')->getLastAuthenticationError(); - if ($exception instanceof LockedException) + if ($exception instanceof TooManyLoginAttemptsAuthenticationException) { - Message::addError(sprintf($GLOBALS['TL_LANG']['ERR']['accountLocked'], $exception->getLockedMinutes())); + Message::addError($GLOBALS['TL_LANG']['ERR']['tooManyLoginAttempts']); } elseif ($exception instanceof InvalidTwoFactorCodeException) { diff --git a/core-bundle/contao/dca/tl_article.php b/core-bundle/contao/dca/tl_article.php index c4edc5ab8e5..2ec858248c5 100644 --- a/core-bundle/contao/dca/tl_article.php +++ b/core-bundle/contao/dca/tl_article.php @@ -535,8 +535,8 @@ public function addIcon($row, $label) $attributes = sprintf( 'data-icon="%s" data-icon-disabled="%s"', - Image::getUrl($row['protected'] ? 'articles_2.svg' : 'articles.svg'), - Image::getUrl($row['protected'] ? 'articles_3.svg' : 'articles_1.svg'), + $row['protected'] ? 'articles_2.svg' : 'articles.svg', + $row['protected'] ? 'articles_3.svg' : 'articles_1.svg', ); $href = System::getContainer()->get('router')->generate('contao_backend_preview', array('page'=>$row['pid'], 'article'=>($row['alias'] ?: $row['id']))); @@ -861,6 +861,6 @@ public function toggleIcon($row, $href, $label, $title, $icon, $attributes) return Image::getHtml($icon) . ' '; } - return '' . Image::getHtml($icon, $label, 'data-icon="' . Image::getUrl('visible.svg') . '" data-icon-disabled="' . Image::getUrl('invisible.svg') . '" data-state="' . ($row['published'] ? 1 : 0) . '"') . ' '; + return '' . Image::getHtml($icon, $label, 'data-icon="visible.svg" data-icon-disabled="invisible.svg" data-state="' . ($row['published'] ? 1 : 0) . '"') . ' '; } } diff --git a/core-bundle/contao/dca/tl_content.php b/core-bundle/contao/dca/tl_content.php index 0062980bd2f..8ff770ced1f 100644 --- a/core-bundle/contao/dca/tl_content.php +++ b/core-bundle/contao/dca/tl_content.php @@ -64,7 +64,8 @@ 'panelLayout' => 'filter;search,limit', 'defaultSearchField' => 'text', 'headerFields' => array('title', 'headline', 'author', 'tstamp', 'start', 'stop'), - 'child_record_callback' => array('tl_content', 'addCteType') + 'child_record_callback' => array('tl_content', 'addCteType'), + 'renderAsGrid' => true ), 'global_operations' => array ( @@ -1174,13 +1175,10 @@ public function addCteType($arrRow) { $key = $arrRow['invisible'] ? 'unpublished' : 'published'; $type = $GLOBALS['TL_LANG']['CTE'][$arrRow['type']][0] ?? $arrRow['type']; - $class = 'limit_height'; // Remove the class if it is a wrapper element if (in_array($arrRow['type'], $GLOBALS['TL_WRAPPERS']['start']) || in_array($arrRow['type'], $GLOBALS['TL_WRAPPERS']['separator']) || in_array($arrRow['type'], $GLOBALS['TL_WRAPPERS']['stop'])) { - $class = ''; - if (($group = $this->getContentElementGroup($arrRow['type'])) !== null) { $type = ($GLOBALS['TL_LANG']['CTE'][$group] ?? $group) . ' (' . $type . ')'; @@ -1221,6 +1219,7 @@ public function addCteType($arrRow) } } + $key .= ' icon-protected'; $type .= ' (' . $GLOBALS['TL_LANG']['MSC']['protected'] . ($groupNames ? ': ' . implode(', ', $groupNames) : '') . ')'; } @@ -1230,12 +1229,6 @@ public function addCteType($arrRow) $type .= ' (' . $headline['unit'] . ')'; } - // Limit the element's height - if (!Config::get('doNotCollapse')) - { - $class .= ' h40'; - } - if ($arrRow['start'] && $arrRow['stop']) { $type .= ' (' . sprintf($GLOBALS['TL_LANG']['MSC']['showFromTo'], Date::parse(Config::get('datimFormat'), $arrRow['start']), Date::parse(Config::get('datimFormat'), $arrRow['stop'])) . ')'; @@ -1252,11 +1245,18 @@ public function addCteType($arrRow) $objModel = new ContentModel(); $objModel->setRow($arrRow); + $class = 'cte_preview'; + $preview = StringUtil::insertTagToSrc($this->getContentElement($objModel)); + + // Strip HTML comments to check if the preview is empty + if (trim(preg_replace('//', '', $preview)) == '') + { + $class .= ' empty'; + } + return '
' . $type . '
-
-' . StringUtil::insertTagToSrc($this->getContentElement($objModel)) . ' -
' . "\n"; +
' . $preview . '
'; } /** @@ -1648,6 +1648,6 @@ public function toggleIcon($row, $href, $label, $title, $icon, $attributes) $icon = 'invisible.svg'; } - return '' . Image::getHtml($icon, $label, 'data-icon="' . Image::getUrl('visible.svg') . '" data-icon-disabled="' . Image::getUrl('invisible.svg') . '" data-state="' . ($row['invisible'] ? 0 : 1) . '"') . ' '; + return '' . Image::getHtml($icon, $label, 'data-icon="visible.svg" data-icon-disabled="invisible.svg" data-state="' . ($row['invisible'] ? 0 : 1) . '"') . ' '; } } diff --git a/core-bundle/contao/dca/tl_form.php b/core-bundle/contao/dca/tl_form.php index abd84f4c7ac..d75fb38ac25 100644 --- a/core-bundle/contao/dca/tl_form.php +++ b/core-bundle/contao/dca/tl_form.php @@ -108,7 +108,7 @@ 'palettes' => array ( '__selector__' => array('sendViaEmail', 'storeValues'), - 'default' => '{title_legend},title,alias,jumpTo;{config_legend},allowTags;{email_legend},sendViaEmail;{store_legend:hide},storeValues;{template_legend:hide},customTpl;{expert_legend:hide},method,novalidate,attributes,formID' + 'default' => '{title_legend},title,alias,jumpTo;{config_legend},ajax,allowTags;{confirm_legend},confirmation;{email_legend},sendViaEmail;{store_legend:hide},storeValues;{template_legend:hide},customTpl;{expert_legend:hide},method,novalidate,attributes,formID' ), // Subpalettes @@ -154,6 +154,14 @@ 'sql' => "int(10) unsigned NOT NULL default 0", 'relation' => array('type'=>'hasOne', 'load'=>'lazy') ), + 'confirmation' => array + ( + 'search' => true, + 'inputType' => 'textarea', + 'eval' => array('rte'=>'tinyMCE', 'helpwizard'=>true), + 'explanation' => 'insertTags', + 'sql' => "text NULL" + ), 'sendViaEmail' => array ( 'filter' => true, @@ -248,6 +256,13 @@ 'eval' => array('nospace'=>true, 'doNotCopy'=>true, 'maxlength'=>64, 'tl_class'=>'w50'), 'sql' => "varchar(64) NOT NULL default ''" ), + 'ajax' => array + ( + 'filter' => true, + 'inputType' => 'checkbox', + 'eval' => array('tl_class'=>'w50'), + 'sql' => array('type' => 'boolean', 'default' => false) + ), 'allowTags' => array ( 'filter' => true, diff --git a/core-bundle/contao/dca/tl_form_field.php b/core-bundle/contao/dca/tl_form_field.php index 0292cb9abe1..7530f09e427 100644 --- a/core-bundle/contao/dca/tl_form_field.php +++ b/core-bundle/contao/dca/tl_form_field.php @@ -58,7 +58,8 @@ 'panelLayout' => 'filter;search,limit', 'defaultSearchField' => 'label', 'headerFields' => array('title', 'tstamp', 'formID', 'storeValues', 'sendViaEmail', 'recipient', 'subject'), - 'child_record_callback' => array('tl_form_field', 'listFormFields') + 'child_record_callback' => array('tl_form_field', 'listFormFields'), + 'renderAsGrid' => true ), 'global_operations' => array ( @@ -354,7 +355,7 @@ 'search' => true, 'inputType' => 'text', 'eval' => array('rgxp'=>'alnum', 'maxlength'=>1, 'tl_class'=>'w50'), - 'sql' => array('type' => 'boolean', 'default' => false) + 'sql' => "char(1) NOT NULL default ''" ), 'fSize' => array ( @@ -638,7 +639,7 @@ public function listFormFields($arrRow) $strType = '
' . $GLOBALS['TL_LANG']['FFL'][$arrRow['type']][0] . ($objWidget->submitInput() && $arrRow['name'] ? ' (' . $arrRow['name'] . ')' : '') . '
-
'; +
'; $strWidget = $objWidget->parse(); $strWidget = preg_replace('/ name="[^"]+"/i', '', $strWidget); @@ -760,6 +761,6 @@ public function toggleIcon($row, $href, $label, $title, $icon, $attributes) $icon = 'invisible.svg'; } - return '' . Image::getHtml($icon, $label, 'data-icon="' . Image::getUrl('visible.svg') . '" data-icon-disabled="' . Image::getUrl('invisible.svg') . '" data-state="' . ($row['invisible'] ? 0 : 1) . '"') . ' '; + return '' . Image::getHtml($icon, $label, 'data-icon="visible.svg" data-icon-disabled="invisible.svg" data-state="' . ($row['invisible'] ? 0 : 1) . '"') . ' '; } } diff --git a/core-bundle/contao/dca/tl_member.php b/core-bundle/contao/dca/tl_member.php index 1389046b34e..05e6b7dc664 100644 --- a/core-bundle/contao/dca/tl_member.php +++ b/core-bundle/contao/dca/tl_member.php @@ -116,7 +116,7 @@ ( 'search' => true, 'sorting' => true, - 'flag' => DataContainer::SORT_INITIAL_LETTER_ASC, + 'flag' => DataContainer::SORT_INITIAL_LETTER_BOTH, 'inputType' => 'text', 'eval' => array('mandatory'=>true, 'maxlength'=>255, 'feEditable'=>true, 'feViewable'=>true, 'feGroup'=>'personal', 'tl_class'=>'w50'), 'sql' => "varchar(255) NOT NULL default ''" @@ -125,7 +125,7 @@ ( 'search' => true, 'sorting' => true, - 'flag' => DataContainer::SORT_INITIAL_LETTER_ASC, + 'flag' => DataContainer::SORT_INITIAL_LETTER_BOTH, 'inputType' => 'text', 'eval' => array('mandatory'=>true, 'maxlength'=>255, 'feEditable'=>true, 'feViewable'=>true, 'feGroup'=>'personal', 'tl_class'=>'w50'), 'sql' => "varchar(255) NOT NULL default ''" @@ -328,16 +328,6 @@ 'eval' => array('rgxp'=>'datim', 'doNotCopy'=>true), 'sql' => "int(10) unsigned NOT NULL default 0" ), - 'loginAttempts' => array - ( - 'eval' => array('doNotCopy'=>true), - 'sql' => "smallint(5) unsigned NOT NULL default 0" - ), - 'locked' => array - ( - 'eval' => array('rgxp'=>'datim', 'doNotCopy'=>true), - 'sql' => "int(10) unsigned NOT NULL default 0" - ), 'session' => array ( 'eval' => array('doNotShow'=>true, 'doNotCopy'=>true), diff --git a/core-bundle/contao/dca/tl_page.php b/core-bundle/contao/dca/tl_page.php index b5840476260..113471f5f3b 100644 --- a/core-bundle/contao/dca/tl_page.php +++ b/core-bundle/contao/dca/tl_page.php @@ -653,7 +653,7 @@ static function ($value) 'search' => true, 'inputType' => 'text', 'eval' => array('rgxp'=>'alnum', 'maxlength'=>1, 'tl_class'=>'w50'), - 'sql' => array('type' => 'boolean', 'default' => false) + 'sql' => "char(1) NOT NULL default ''" ), 'published' => array ( @@ -1036,13 +1036,11 @@ static function ($strVal) */ public function showFallbackWarning() { - if (Input::get('act')) + if (in_array(Input::get('act'), array('paste', 'select', null))) { - return; + $messages = new Messages(); + Message::addRaw($messages->languageFallback()); } - - $messages = new Messages(); - Message::addRaw($messages->languageFallback()); } /** @@ -1549,7 +1547,7 @@ public function toggleIcon($row, $href, $label, $title, $icon, $attributes) return Image::getHtml($icon) . ' '; } - return '' . Image::getHtml($icon, $label, 'data-icon="' . Image::getUrl('visible.svg') . '" data-icon-disabled="' . Image::getUrl('invisible.svg') . '" data-state="' . ($row['published'] ? 1 : 0) . '"') . ' '; + return '' . Image::getHtml($icon, $label, 'data-icon="visible.svg" data-icon-disabled="invisible.svg" data-state="' . ($row['published'] ? 1 : 0) . '"') . ' '; } /** diff --git a/core-bundle/contao/dca/tl_settings.php b/core-bundle/contao/dca/tl_settings.php index 8abea4722e8..d88abe6d807 100644 --- a/core-bundle/contao/dca/tl_settings.php +++ b/core-bundle/contao/dca/tl_settings.php @@ -23,7 +23,7 @@ // Palettes 'palettes' => array ( - 'default' => '{global_legend},adminEmail;{date_legend},dateFormat,timeFormat,datimFormat,timeZone;{backend_legend:hide},doNotCollapse,resultsPerPage,maxResultsPerPage;{security_legend:hide},allowedTags,allowedAttributes;{files_legend:hide},allowedDownload;{uploads_legend:hide},uploadTypes,maxFileSize,imageWidth,imageHeight;{cron_legend:hide},disableCron;{chmod_legend},defaultUser,defaultGroup,defaultChmod' + 'default' => '{global_legend},adminEmail;{date_legend},dateFormat,timeFormat,datimFormat,timeZone;{backend_legend:hide},doNotCollapse,resultsPerPage,maxResultsPerPage;{security_legend:hide},allowedTags,allowedAttributes;{files_legend:hide},allowedDownload;{uploads_legend:hide},uploadTypes,maxFileSize,imageWidth,imageHeight;{chmod_legend},defaultUser,defaultGroup,defaultChmod' ), // Fields @@ -59,11 +59,6 @@ 'inputType' => 'text', 'eval' => array('mandatory'=>true, 'rgxp'=>'friendly', 'decodeEntities'=>true, 'tl_class'=>'w50') ), - 'disableCron' => array - ( - 'inputType' => 'checkbox', - 'eval' => array('tl_class'=>'w50') - ), 'resultsPerPage' => array ( 'inputType' => 'text', diff --git a/core-bundle/contao/dca/tl_undo.php b/core-bundle/contao/dca/tl_undo.php index 6b49cbe979a..0b8e962497f 100644 --- a/core-bundle/contao/dca/tl_undo.php +++ b/core-bundle/contao/dca/tl_undo.php @@ -110,6 +110,7 @@ 'data' => array ( 'search' => true, + 'eval' => array('doNotShow'=>true), 'sql' => "mediumblob NULL" ), 'preview' => array diff --git a/core-bundle/contao/dca/tl_user.php b/core-bundle/contao/dca/tl_user.php index c1ee83c5de4..e058d3fbf9b 100644 --- a/core-bundle/contao/dca/tl_user.php +++ b/core-bundle/contao/dca/tl_user.php @@ -61,7 +61,6 @@ ( 'mode' => DataContainer::MODE_SORTABLE, 'fields' => array('dateAdded'), - 'flag' => DataContainer::SORT_INITIAL_LETTER_ASC, 'panelLayout' => 'filter;sort,search,limit', 'defaultSearchField' => 'name' ), @@ -426,16 +425,6 @@ 'eval' => array('rgxp'=>'datim', 'doNotCopy'=>true), 'sql' => "int(10) unsigned NOT NULL default 0" ), - 'loginAttempts' => array - ( - 'eval' => array('doNotCopy'=>true), - 'sql' => "smallint(5) unsigned NOT NULL default 0" - ), - 'locked' => array - ( - 'eval' => array('rgxp'=>'datim', 'doNotCopy'=>true), - 'sql' => "int(10) unsigned NOT NULL default 0" - ), 'backupCodes' => array ( 'eval' => array('doNotCopy'=>true, 'doNotShow'=>true), @@ -962,6 +951,6 @@ public function toggleIcon($row, $href, $label, $title, $icon, $attributes) return Image::getHtml($icon) . ' '; } - return '' . Image::getHtml($icon, $label, 'data-icon="' . Image::getUrl('visible.svg') . '" data-icon-disabled="' . Image::getUrl('invisible.svg') . '"data-state="' . ($row['disable'] ? 0 : 1) . '"') . ' '; + return '' . Image::getHtml($icon, $label, 'data-icon="visible.svg" data-icon-disabled="invisible.svg" data-state="' . ($row['disable'] ? 0 : 1) . '"') . ' '; } } diff --git a/core-bundle/contao/drivers/DC_Folder.php b/core-bundle/contao/drivers/DC_Folder.php index c4e6b5e0797..a572219610e 100644 --- a/core-bundle/contao/drivers/DC_Folder.php +++ b/core-bundle/contao/drivers/DC_Folder.php @@ -488,7 +488,7 @@ public function showAll() // Build the tree $return = $this->panel() . Message::generate() . ($buttons ? '
' . $buttons . '
' : '') . ((Input::get('act') == 'select') ? ' -
+
' : '') . ($blnClipboard ? ' diff --git a/core-bundle/contao/drivers/DC_Table.php b/core-bundle/contao/drivers/DC_Table.php index b4a02fcc00f..704055ef33f 100644 --- a/core-bundle/contao/drivers/DC_Table.php +++ b/core-bundle/contao/drivers/DC_Table.php @@ -164,20 +164,21 @@ public function __construct($strTable, $arrModule=array()) { $this->redirect(str_replace('act=select', 'act=overrideAll', Environment::get('requestUri'))); } - elseif (Input::post('cut') !== null || Input::post('copy') !== null) + elseif (Input::post('cut') !== null || Input::post('copy') !== null || Input::post('copyMultiple') !== null) { $arrClipboard = $objSession->get('CLIPBOARD'); $arrClipboard[$strTable] = array ( 'id' => $ids, - 'mode' => (Input::post('cut') !== null ? 'cutAll' : 'copyAll') + 'mode' => (Input::post('cut') !== null ? 'cutAll' : 'copyAll'), + 'keep' => Input::post('copyMultiple') !== null ); $objSession->set('CLIPBOARD', $arrClipboard); // Support copyAll in the list view (see #7499) - if (Input::post('copy') !== null && ($GLOBALS['TL_DCA'][$strTable]['list']['sorting']['mode'] ?? 0) < self::MODE_PARENT) + if ((Input::post('copy') !== null || Input::post('copyMultiple') !== null) && ($GLOBALS['TL_DCA'][$strTable]['list']['sorting']['mode'] ?? 0) < self::MODE_PARENT) { $this->redirect(str_replace('act=select', 'act=copyAll', Environment::get('requestUri'))); } @@ -411,12 +412,6 @@ public function show() continue; } - // Special treatment for table tl_undo - if ($this->strTable == 'tl_undo' && $i == 'data') - { - continue; - } - $value = StringUtil::deserialize($row[$i]); // Get the field value @@ -502,7 +497,7 @@ public function show() { $row[$i] = $value ? Date::parse(Config::get('timeFormat'), $value) : '-'; } - elseif ($i == 'tstamp' || ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$i]['eval']['rgxp'] ?? null) == 'datim' || \in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$i]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_YEAR_ASC, self::SORT_YEAR_DESC))) + elseif ($i == 'tstamp' || ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$i]['eval']['rgxp'] ?? null) == 'datim' || \in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$i]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_DAY_BOTH, self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_MONTH_BOTH, self::SORT_YEAR_ASC, self::SORT_YEAR_DESC, self::SORT_YEAR_BOTH))) { $row[$i] = $value ? Date::parse(Config::get('datimFormat'), $value) : '-'; } @@ -571,7 +566,7 @@ public function show() } $separate = false; - $return = ''; + $return = '
'; // Generate table foreach ($data as $table=>$rows) @@ -592,8 +587,8 @@ public function show() // Add the table name $return .= ' - - + + '; @@ -946,8 +941,12 @@ public function copy($blnDoNotRedirect=false) // Empty clipboard $arrClipboard = $objSession->get('CLIPBOARD'); - $arrClipboard[$this->strTable] = array(); - $objSession->set('CLIPBOARD', $arrClipboard); + + if (!($arrClipboard[$this->strTable]['keep'] ?? false)) + { + $arrClipboard[$this->strTable] = array(); + $objSession->set('CLIPBOARD', $arrClipboard); + } // Insert the record if the table is not closed and switch to edit mode if (!($GLOBALS['TL_DCA'][$this->strTable]['config']['closed'] ?? null)) @@ -1273,7 +1272,7 @@ protected function getNewPosition($mode, $pid=null, $insertInto=false) if ($limit > 0) { - $objInsertAfter = $this->Database->prepare("SELECT id FROM " . $this->strTable . " WHERE pid=? ORDER BY sorting, id") + $objInsertAfter = $this->Database->prepare("SELECT id FROM " . $this->strTable . " WHERE " . ($pid ? 'pid=?' : '(pid=? OR pid IS NULL)') . " ORDER BY sorting, id") ->limit(1, $limit - 1) ->execute($pid); @@ -1290,7 +1289,7 @@ protected function getNewPosition($mode, $pid=null, $insertInto=false) { $newPID = $pid; - $objSorting = $this->Database->prepare("SELECT MIN(sorting) AS sorting FROM " . $this->strTable . " WHERE pid=?") + $objSorting = $this->Database->prepare("SELECT MIN(sorting) AS sorting FROM " . $this->strTable . " WHERE " . ($pid ? 'pid=?' : '(pid=? OR pid IS NULL)')) ->execute($pid); // Select sorting value of the first record @@ -1301,7 +1300,7 @@ protected function getNewPosition($mode, $pid=null, $insertInto=false) // Resort if the new sorting value is not an integer or smaller than 1 if (($curSorting % 2) != 0 || $curSorting < 1) { - $objNewSorting = $this->Database->prepare("SELECT id FROM " . $this->strTable . " WHERE pid=? ORDER BY sorting, id") + $objNewSorting = $this->Database->prepare("SELECT id FROM " . $this->strTable . " WHERE " . ($pid ? 'pid=?' : '(pid=? OR pid IS NULL)') . " ORDER BY sorting, id") ->execute($pid); $count = 2; @@ -1343,9 +1342,9 @@ protected function getNewPosition($mode, $pid=null, $insertInto=false) $curSorting = $objSorting->sorting; // Do not proceed without a parent ID - if (is_numeric($newPID)) + if (is_numeric($newPID) || $newPID === null) { - $objNextSorting = $this->Database->prepare("SELECT MIN(sorting) AS sorting FROM " . $this->strTable . " WHERE pid=? AND sorting>?") + $objNextSorting = $this->Database->prepare("SELECT MIN(sorting) AS sorting FROM " . $this->strTable . " WHERE " . ($newPID ? 'pid=?' : '(pid=? OR pid IS NULL)') . " AND sorting>?") ->execute($newPID, $curSorting); // Select sorting value of the next record @@ -1396,8 +1395,13 @@ protected function getNewPosition($mode, $pid=null, $insertInto=false) } } + if (!$newPID) + { + $newPID = Widget::getEmptyValueByFieldType($GLOBALS['TL_DCA'][$this->strTable]['fields']['pid']['sql'] ?? array()) === null ? null : 0; + } + // Set new sorting and new parent ID - $this->set['pid'] = (int) $newPID; + $this->set['pid'] = $newPID; $this->set['sorting'] = (int) $newSorting; } } @@ -3735,7 +3739,7 @@ protected function treeView() $label = $GLOBALS['TL_LANG']['MOD']['page'][0]; } - $icon = !empty($GLOBALS['TL_DCA'][$table]['list']['sorting']['icon']) ? $GLOBALS['TL_DCA'][$table]['list']['sorting']['icon'] : 'pagemounts.svg'; + $icon = !empty($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['icon']) ? $GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['icon'] : 'pagemounts.svg'; $label = Image::getHtml($icon) . ' '; // Check the default labels (see #509) @@ -3777,7 +3781,7 @@ protected function treeView() if ($objRoot->numRows < 1) { - $this->root = array(); + $this->updateRoot(array()); } // Respect existing limitations (root IDs) elseif (!empty($this->root)) @@ -3793,12 +3797,12 @@ protected function treeView() } $arrFound = $arrRoot; - $this->root = $this->eliminateNestedPages($arrFound, $table, $blnHasSorting); + $this->updateRoot($this->eliminateNestedPages($arrFound, $table, $blnHasSorting)); } else { $arrFound = $objRoot->fetchEach($fld); - $this->root = $this->eliminateNestedPages($arrFound, $table, $blnHasSorting); + $this->updateRoot($this->eliminateNestedPages($arrFound, $table, $blnHasSorting)); } } @@ -3909,6 +3913,7 @@ protected function treeView() if (!($GLOBALS['TL_DCA'][$this->strTable]['config']['notCopyable'] ?? null)) { $arrButtons['copy'] = ''; + $arrButtons['copyMultiple'] = ''; } if (!($GLOBALS['TL_DCA'][$this->strTable]['config']['notSortable'] ?? null)) @@ -4123,7 +4128,14 @@ protected function generateTree($table, $id, $arrPrevNext, $blnHasSorting, $intM { if ($this->strTable != $table || ($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['mode'] ?? null) == self::MODE_TREE) { - $objChilds = $this->Database->prepare("SELECT id FROM " . $table . " WHERE pid=?" . (!empty($arrFound) ? " AND id IN(" . implode(',', array_map('\intval', $arrFound)) . ")" : '') . ($blnHasSorting ? " ORDER BY sorting, id" : '')) + $allowedChildIds = array(); + + if (!empty($arrFound)) + { + $allowedChildIds = array_merge($arrFound, $this->visibleRootTrails); + } + + $objChilds = $this->Database->prepare("SELECT id FROM " . $table . " WHERE pid=?" . (!empty($allowedChildIds) ? " AND id IN(" . implode(',', array_map('\intval', $allowedChildIds)) . ")" : '') . ($blnHasSorting ? " ORDER BY sorting, id" : '')) ->execute($id); if ($objChilds->numRows) @@ -4158,7 +4170,7 @@ protected function generateTree($table, $id, $arrPrevNext, $blnHasSorting, $intM // Calculate label and add a toggle button $level = ($intMargin / $intSpacing + 1); - $blnIsOpen = (!empty($arrFound) || $session[$node][$id] == 1); + $blnIsOpen = isset($session[$node][$id]) && $session[$node][$id] == 1; // Always show selected nodes if (!$blnIsOpen && !empty($this->arrPickerValue) && (($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['mode'] ?? null) == self::MODE_TREE || $table !== $this->strTable)) @@ -4327,32 +4339,21 @@ protected function generateTree($table, $id, $arrPrevNext, $blnHasSorting, $intM } } - // Begin a new submenu - if (!$blnNoRecursion) + // Begin a new submenu if the node is open or $arrFound is not empty (which means that there + // is an active filter and all matching nodes have to be loaded to avoid Ajax requests). + if (!$blnNoRecursion && !empty($childs) && ($blnIsOpen || !empty($arrFound))) { - $blnAddParent = ($blnIsOpen || !empty($arrFound) || (!empty($childs) && $session[$node][$id] == 1)); + $return .= ''; } $objSessionBag->replace($session); @@ -4432,11 +4433,11 @@ protected function parentView()

' . $GLOBALS['TL_LANG']['MSC']['selectNewPosition'] . '

' : '') . ' -
getPickerValueAttribute() . '> +
getPickerValueAttribute() . '>
'; // List all records of the child table - if (!Input::get('act') || \in_array(Input::get('act'), array('paste', 'select'))) + if (\in_array(Input::get('act'), array('paste', 'select', null))) { $this->import(BackendUser::class, 'User'); @@ -4639,7 +4640,7 @@ protected function parentView() { foreach ($orderBy as $k=>$v) { - if (isset($GLOBALS['TL_DCA'][$this->strTable]['fields'][$v]['flag']) && ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$v]['flag'] % 2) == 0) + if (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$v]['flag'] ?? null, array(self::SORT_INITIAL_LETTER_DESC, self::SORT_INITIAL_LETTERS_DESC, self::SORT_DAY_DESC, self::SORT_MONTH_DESC, self::SORT_YEAR_DESC, self::SORT_DESC))) { $orderBy[$k] .= ' DESC'; } @@ -4725,7 +4726,8 @@ protected function parentView() } $return .= ' -
+
+
'; // Opening wrappers @@ -4805,11 +4807,12 @@ protected function parentView() $return .= '
' . $this->generateRecordLabel($row[$i]) . '
'; } + $return .= '
'; + // Make items sortable if ($blnHasSorting) { - $return .= ' -'; + $return .= ''; } } } @@ -4855,6 +4858,7 @@ protected function parentView() if (!($GLOBALS['TL_DCA'][$this->strTable]['config']['notCopyable'] ?? null)) { $arrButtons['copy'] = ''; + $arrButtons['copyMultiple'] = ''; } if (!($GLOBALS['TL_DCA'][$this->strTable]['config']['notSortable'] ?? null)) @@ -4956,11 +4960,11 @@ protected function listView() // If there is no direction, check the global flag in sorting mode 1 or the field flag in all other sorting modes if (!$direction) { - if (($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['mode'] ?? null) == self::MODE_SORTED && isset($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['flag']) && ($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['flag'] % 2) == 0) + if (($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['mode'] ?? null) == self::MODE_SORTED && \in_array($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['flag'] ?? null, array(self::SORT_INITIAL_LETTER_DESC, self::SORT_INITIAL_LETTERS_DESC, self::SORT_DAY_DESC, self::SORT_MONTH_DESC, self::SORT_YEAR_DESC, self::SORT_DESC))) { $direction = 'DESC'; } - elseif (isset($GLOBALS['TL_DCA'][$this->strTable]['fields'][$key]['flag']) && ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$key]['flag'] % 2) == 0) + elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$key]['flag'] ?? null, array(self::SORT_INITIAL_LETTER_DESC, self::SORT_INITIAL_LETTERS_DESC, self::SORT_DAY_DESC, self::SORT_MONTH_DESC, self::SORT_YEAR_DESC, self::SORT_DESC))) { $direction = 'DESC'; } @@ -4994,7 +4998,7 @@ protected function listView() $orderBy[$k] = $this->Database->findInSet($v, $keys); } - elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$key]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_YEAR_ASC, self::SORT_YEAR_DESC))) + elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$key]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_DAY_BOTH, self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_MONTH_BOTH, self::SORT_YEAR_ASC, self::SORT_YEAR_DESC, self::SORT_YEAR_BOTH))) { $orderBy[$k] = "CAST($key AS SIGNED)"; // see #5503 } @@ -5122,7 +5126,6 @@ protected function listView() // Process result and add label and buttons $remoteCur = false; $groupclass = 'tl_folder_tlist'; - $eoCount = -1; foreach ($result as $row) { @@ -5145,7 +5148,6 @@ protected function listView() // Add the group header if (($remoteNew != $remoteCur || $remoteCur === false) && !($GLOBALS['TL_DCA'][$this->strTable]['list']['label']['showColumns'] ?? null) && !($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['disableGrouping'] ?? null)) { - $eoCount = -1; $group = $this->formatGroupHeader($firstOrderBy, $remoteNew, $sortingMode, $row); $remoteCur = $remoteNew; @@ -5158,7 +5160,7 @@ protected function listView() } $return .= ' -
+ '; $colspan = 1; @@ -5183,6 +5185,21 @@ protected function listView() if (isset($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['foreignKey'])) { + if ($arg) + { + $key = explode('.', $GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['foreignKey'], 2); + + $reference = $this->Database + ->prepare("SELECT " . Database::quoteIdentifier($key[1]) . " AS value FROM " . $key[0] . " WHERE id=?") + ->limit(1) + ->execute($arg); + + if ($reference->numRows) + { + $arg = $reference->value; + } + } + $value = $arg ?: '-'; } else @@ -5464,7 +5481,15 @@ protected function sortMenu() { if ($v['sorting'] ?? null) { - $sortingFields[] = $k; + if (\in_array($v['flag'] ?? null, array(self::SORT_INITIAL_LETTER_BOTH, self::SORT_INITIAL_LETTERS_BOTH, self::SORT_DAY_BOTH, self::SORT_MONTH_BOTH, self::SORT_YEAR_BOTH, self::SORT_BOTH))) + { + $sortingFields[] = $k . ' DESC'; + $sortingFields[] = $k . ' ASC'; + } + else + { + $sortingFields[] = $k; + } } } @@ -5515,8 +5540,9 @@ protected function sortMenu() $options_sorter = array(); // Sorting fields - foreach ($sortingFields as $field) + foreach ($sortingFields as $value) { + $field = str_replace(array(' ASC', ' DESC'), '', $value); $options_label = ($lbl = \is_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'] ?? null) ? $GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'][0] : ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'] ?? null)) ? $lbl : $GLOBALS['TL_LANG']['MSC'][$field] ?? $field; if (\is_array($options_label)) @@ -5524,7 +5550,28 @@ protected function sortMenu() $options_label = $options_label[0]; } - $options_sorter[$options_label] = ' '; + if (str_ends_with($value, ' ASC')) + { + $sortKey = $options_label . '|ASC'; + $sessionValue = $session['sorting'][$this->strTable] ?? ''; + $aria_label = sprintf($GLOBALS['TL_LANG']['MSC']['list_orderBy'], $options_label . ' ' . $GLOBALS['TL_LANG']['MSC']['ascending']); + $options_label .= ' ↑'; + } + elseif (str_ends_with($value, ' DESC')) + { + $sortKey = $options_label . '|DESC'; + $sessionValue = $session['sorting'][$this->strTable] ?? ''; + $aria_label = sprintf($GLOBALS['TL_LANG']['MSC']['list_orderBy'], $options_label . ' ' . $GLOBALS['TL_LANG']['MSC']['descending']); + $options_label .= ' ↓'; + } + else + { + $sortKey = $options_label; + $sessionValue = str_replace(' DESC', '', $session['sorting'][$this->strTable] ?? ''); + $aria_label = sprintf($GLOBALS['TL_LANG']['MSC']['list_orderBy'], $options_label); + } + + $options_sorter[$sortKey] = ' '; } // Sort by option values @@ -5747,7 +5794,7 @@ protected function filterMenu($intFilterPanel) if (isset($session['filter'][$filter][$field])) { // Sort by day - if (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC))) + if (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_DAY_BOTH))) { if (!$session['filter'][$filter][$field]) { @@ -5763,7 +5810,7 @@ protected function filterMenu($intFilterPanel) } // Sort by month - elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_MONTH_ASC, self::SORT_MONTH_DESC))) + elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_MONTH_BOTH))) { if (!$session['filter'][$filter][$field]) { @@ -5779,7 +5826,7 @@ protected function filterMenu($intFilterPanel) } // Sort by year - elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_YEAR_ASC, self::SORT_YEAR_DESC))) + elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_YEAR_ASC, self::SORT_YEAR_DESC, self::SORT_YEAR_BOTH))) { if (!$session['filter'][$filter][$field]) { @@ -5866,19 +5913,19 @@ protected function filterMenu($intFilterPanel) if (isset($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'])) { // Sort by day - if (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'], array(self::SORT_DAY_ASC, self::SORT_DAY_DESC))) + if (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'], array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_DAY_BOTH))) { $what = "IF($what!='', FLOOR(UNIX_TIMESTAMP(FROM_UNIXTIME($what , '%Y-%m-%d'))), '') AS $what"; } // Sort by month - elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'], array(self::SORT_MONTH_ASC, self::SORT_MONTH_DESC))) + elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'], array(self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_MONTH_BOTH))) { $what = "IF($what!='', FLOOR(UNIX_TIMESTAMP(FROM_UNIXTIME($what , '%Y-%m-01'))), '') AS $what"; } // Sort by year - elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'], array(self::SORT_YEAR_ASC, self::SORT_YEAR_DESC))) + elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'], array(self::SORT_YEAR_ASC, self::SORT_YEAR_DESC, self::SORT_YEAR_BOTH))) { $what = "IF($what!='', FLOOR(UNIX_TIMESTAMP(FROM_UNIXTIME($what , '%Y-01-01'))), '') AS $what"; } @@ -5921,7 +5968,7 @@ protected function filterMenu($intFilterPanel) $options = $objFields->fetchEach($field); // Sort by day - if (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC))) + if (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_DAY_BOTH))) { ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null) == self::SORT_DAY_DESC ? rsort($options) : sort($options); @@ -5941,7 +5988,7 @@ protected function filterMenu($intFilterPanel) } // Sort by month - elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_MONTH_ASC, self::SORT_MONTH_DESC))) + elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_MONTH_BOTH))) { ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null) == self::SORT_MONTH_DESC ? rsort($options) : sort($options); @@ -5967,7 +6014,7 @@ protected function filterMenu($intFilterPanel) } // Sort by year - elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_YEAR_ASC, self::SORT_YEAR_DESC))) + elseif (\in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_YEAR_ASC, self::SORT_YEAR_DESC, self::SORT_YEAR_BOTH))) { ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null) == self::SORT_YEAR_DESC ? rsort($options) : sort($options); @@ -6031,13 +6078,10 @@ protected function filterMenu($intFilterPanel) { $options_callback = $GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['options_callback']($this); } - - // Sort options according to the keys of the callback array - $options = array_intersect(array_keys($options_callback), $options); } $options_sorter = array(); - $blnDate = \in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_YEAR_ASC, self::SORT_YEAR_DESC)); + $blnDate = \in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['flag'] ?? null, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_DAY_BOTH, self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_MONTH_BOTH, self::SORT_YEAR_ASC, self::SORT_YEAR_DESC, self::SORT_YEAR_BOTH)); // Options foreach ($options as $kk=>$vv) @@ -6045,7 +6089,7 @@ protected function filterMenu($intFilterPanel) $value = $blnDate ? $kk : $vv; // Options callback - if (!empty($options_callback) && \is_array($options_callback)) + if (!empty($options_callback) && \is_array($options_callback) && isset($options_callback[$vv])) { $vv = $options_callback[$vv]; } @@ -6246,11 +6290,11 @@ protected function formatCurrentValue($field, $value, $mode) $remoteNew = $value ? (new UnicodeString($value))->slice(0, $GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['length'])->title()->toString() : '-'; } - elseif (\in_array($mode, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC))) + elseif (\in_array($mode, array(self::SORT_DAY_ASC, self::SORT_DAY_DESC, self::SORT_DAY_BOTH))) { $remoteNew = $value ? Date::parse(Config::get('dateFormat'), $value) : '-'; } - elseif (\in_array($mode, array(self::SORT_MONTH_ASC, self::SORT_MONTH_DESC))) + elseif (\in_array($mode, array(self::SORT_MONTH_ASC, self::SORT_MONTH_DESC, self::SORT_MONTH_BOTH))) { $remoteNew = $value ? date('Y-m', $value) : '-'; $intMonth = $value ? (date('m', $value) - 1) : '-'; @@ -6260,7 +6304,7 @@ protected function formatCurrentValue($field, $value, $mode) $remoteNew = $value ? $GLOBALS['TL_LANG']['MONTHS'][$intMonth] . ' ' . date('Y', $value) : '-'; } } - elseif (\in_array($mode, array(self::SORT_YEAR_ASC, self::SORT_YEAR_DESC))) + elseif (\in_array($mode, array(self::SORT_YEAR_ASC, self::SORT_YEAR_DESC, self::SORT_YEAR_BOTH))) { $remoteNew = $value ? date('Y', $value) : '-'; } @@ -6342,9 +6386,14 @@ protected function formatGroupHeader($field, $value, $mode, $row) { $group = $value; - if ($value != '-' && ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['eval']['isBoolean'] ?? null)) + if (($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['eval']['isBoolean'] ?? null) || (($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['inputType'] ?? null) == 'checkbox' && !($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['eval']['multiple'] ?? null))) { - $group = \is_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'] ?? null) ? $GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'][0] : ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'] ?? null); + $label = \is_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'] ?? null) ? $GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'][0] : ($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'] ?? null); + + if ($label) + { + $group = $value == ucfirst($GLOBALS['TL_LANG']['MSC']['yes']) ? $label : sprintf($GLOBALS['TL_LANG']['MSC']['booleanNot'], lcfirst($label)); + } } } @@ -6385,7 +6434,7 @@ protected function initRoots() if ($objIds->numRows > 0) { - $this->root = $objIds->fetchEach('id'); + $this->updateRoot($objIds->fetchEach('id')); } } @@ -6394,11 +6443,11 @@ protected function initRoots() { if ($GLOBALS['TL_DCA'][$table]['list']['sorting']['root'] == array(0)) { - $this->root = array(0); + $this->updateRoot(array(0)); } else { - $this->root = $this->eliminateNestedPages($GLOBALS['TL_DCA'][$table]['list']['sorting']['root'], $table); + $this->updateRoot($this->eliminateNestedPages($GLOBALS['TL_DCA'][$table]['list']['sorting']['root'], $table)); } } } @@ -6406,8 +6455,15 @@ protected function initRoots() // Get the IDs of all root records (list view or parent view) elseif (\is_array($GLOBALS['TL_DCA'][$table]['list']['sorting']['root'] ?? null)) { - $this->root = array_unique($GLOBALS['TL_DCA'][$table]['list']['sorting']['root']); + $this->updateRoot(array_unique($GLOBALS['TL_DCA'][$table]['list']['sorting']['root'])); } + } + + protected function updateRoot(array $root) + { + $this->root = $root; + + $table = ($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['mode'] ?? null) == self::MODE_TREE_EXTENDED ? $this->ptable : $this->strTable; // Fetch visible root trails if enabled if ($GLOBALS['TL_DCA'][$table]['list']['sorting']['showRootTrails'] ?? null) @@ -6456,7 +6512,7 @@ public function initPicker(PickerInterface $picker) ); } - $this->root = $arrRoot; + $this->updateRoot($arrRoot); } return $attributes; diff --git a/core-bundle/contao/elements/ContentAccordion.php b/core-bundle/contao/elements/ContentAccordion.php index 48a597e4717..6bfd8bc4568 100644 --- a/core-bundle/contao/elements/ContentAccordion.php +++ b/core-bundle/contao/elements/ContentAccordion.php @@ -42,10 +42,7 @@ protected function compile() ->enableLightbox($this->fullsize) ->buildIfResourceExists(); - if (null !== $figure) - { - $figure->applyLegacyTemplateData($this->Template, null, $this->floating); - } + $figure?->applyLegacyTemplateData($this->Template, null, $this->floating); } $classes = StringUtil::deserialize($this->mooClasses, true) + array(null, null); diff --git a/core-bundle/contao/elements/ContentArticle.php b/core-bundle/contao/elements/ContentArticle.php index e4273df7cbc..1c066c7fc18 100644 --- a/core-bundle/contao/elements/ContentArticle.php +++ b/core-bundle/contao/elements/ContentArticle.php @@ -22,6 +22,11 @@ class ContentArticle extends ContentElement */ public function generate() { + if ($this->isHidden()) + { + return ''; + } + return $this->getArticle($this->articleAlias, false, true, $this->strColumn); } diff --git a/core-bundle/contao/elements/ContentDownload.php b/core-bundle/contao/elements/ContentDownload.php index 8e6b84307cf..82857f80638 100644 --- a/core-bundle/contao/elements/ContentDownload.php +++ b/core-bundle/contao/elements/ContentDownload.php @@ -37,6 +37,11 @@ class ContentDownload extends ContentElement */ public function generate() { + if ($this->isHidden()) + { + return ''; + } + // Return if there is no file if (!$this->singleSRC) { diff --git a/core-bundle/contao/elements/ContentDownloads.php b/core-bundle/contao/elements/ContentDownloads.php index 99848a56561..c00c6c8d592 100644 --- a/core-bundle/contao/elements/ContentDownloads.php +++ b/core-bundle/contao/elements/ContentDownloads.php @@ -37,6 +37,11 @@ class ContentDownloads extends ContentDownload */ public function generate() { + if ($this->isHidden()) + { + return ''; + } + // Use the home directory of the current user as file source if ($this->useHomeDir && System::getContainer()->get('contao.security.token_checker')->hasFrontendUser()) { diff --git a/core-bundle/contao/elements/ContentImage.php b/core-bundle/contao/elements/ContentImage.php index 48d91b49034..d750c284e51 100644 --- a/core-bundle/contao/elements/ContentImage.php +++ b/core-bundle/contao/elements/ContentImage.php @@ -66,9 +66,6 @@ protected function compile() ->enableLightbox($this->fullsize) ->buildIfResourceExists(); - if (null !== $figure) - { - $figure->applyLegacyTemplateData($this->Template); - } + $figure?->applyLegacyTemplateData($this->Template); } } diff --git a/core-bundle/contao/elements/ContentProxy.php b/core-bundle/contao/elements/ContentProxy.php index 17b9007064c..0ff52333fbc 100644 --- a/core-bundle/contao/elements/ContentProxy.php +++ b/core-bundle/contao/elements/ContentProxy.php @@ -50,6 +50,11 @@ public function __construct($objElement, $strColumn = 'main') */ public function generate() { + if ($this->isHidden()) + { + return ''; + } + $request = System::getContainer()->get('request_stack')->getCurrentRequest(); if ($request && System::getContainer()->get('contao.routing.scope_matcher')->isBackendRequest($request)) diff --git a/core-bundle/contao/elements/ContentText.php b/core-bundle/contao/elements/ContentText.php index 326691eac1a..038da209041 100644 --- a/core-bundle/contao/elements/ContentText.php +++ b/core-bundle/contao/elements/ContentText.php @@ -49,10 +49,7 @@ protected function compile() ->enableLightbox($this->fullsize) ->buildIfResourceExists(); - if (null !== $figure) - { - $figure->applyLegacyTemplateData($this->Template, null, $this->floating); - } + $figure?->applyLegacyTemplateData($this->Template, null, $this->floating); } } } diff --git a/core-bundle/contao/forms/Form.php b/core-bundle/contao/forms/Form.php index ba3d38aeb68..8bffb70602f 100644 --- a/core-bundle/contao/forms/Form.php +++ b/core-bundle/contao/forms/Form.php @@ -10,8 +10,10 @@ namespace Contao; +use Contao\CoreBundle\Exception\ResponseException; use Contao\CoreBundle\Routing\ResponseContext\HtmlHeadBag\HtmlHeadBag; use Contao\CoreBundle\Session\Attribute\AutoExpiringAttribute; +use Symfony\Component\HttpFoundation\Response; /** * Provide methods to handle front end forms. @@ -36,6 +38,7 @@ class Form extends Hybrid { public const SESSION_KEY = 'contao.form.data'; + public const SESSION_CONFIRMATION_KEY = 'contao.form.confirmation'; /** * Model @@ -61,6 +64,11 @@ class Form extends Hybrid */ protected $strTemplate = 'form_wrapper'; + /** + * @var array + */ + private array $errors = array(); + /** * Remove name attributes in the back end so the form is not validated * @@ -81,20 +89,53 @@ public function generate() return $objTemplate->parse(); } - if ($this->customTpl) + // Use the custom template unless it is a back end request + if ($this->customTpl && (!$request || !System::getContainer()->get('contao.routing.scope_matcher')->isBackendRequest($request))) + { + $this->strTemplate = $this->customTpl; + } + + // Use the inline template in AJAX request + if ($this->isAjaxEnabled() && $request->isXmlHttpRequest() && $request->headers->get('X-Contao-Ajax-Form') === $this->getFormId()) { - $request = System::getContainer()->get('request_stack')->getCurrentRequest(); + $this->strTemplate = 'form_inline'; - // Use the custom template unless it is a back end request - if (!$request || !System::getContainer()->get('contao.routing.scope_matcher')->isBackendRequest($request)) - { - $this->strTemplate = $this->customTpl; - } + throw new ResponseException(new Response(parent::generate())); } return parent::generate(); } + /** + * @return array + */ + public function getErrors(): array + { + return $this->errors; + } + + public function hasErrors(): bool + { + return !empty($this->errors); + } + + /** + * @param array $errors + */ + public function setErrors(array $errors): self + { + $this->errors = $errors; + + return $this; + } + + public function addError(string $error): self + { + $this->errors[] = $error; + + return $this; + } + /** * Generate the form */ @@ -105,13 +146,26 @@ protected function compile() $arrSubmitted = array(); $this->loadDataContainer('tl_form_field'); - $formId = $this->formID ? 'auto_' . $this->formID : 'auto_form_' . $this->id; + $formId = $this->getFormId(); $this->Template->fields = ''; $this->Template->hidden = ''; $this->Template->formSubmit = $formId; $this->Template->method = ($this->method == 'GET') ? 'get' : 'post'; + $flashBag = System::getContainer()->get('request_stack')->getSession()->getFlashBag(); + + // Add a confirmation to the template and remove it afterwards + if ($flashBag->has(self::SESSION_CONFIRMATION_KEY)) + { + $confirmationData = $flashBag->peek(self::SESSION_CONFIRMATION_KEY); + + if (isset($confirmationData['id']) && $this->id === $confirmationData['id']) + { + $this->Template->message = $flashBag->get(self::SESSION_CONFIRMATION_KEY)['message']; + } + } + $arrLabels = array(); $arrFiles = array(); @@ -248,7 +302,7 @@ protected function compile() } // Remove any uploads, if form did not validate (#1185) - if ($doNotSubmit && $hasUpload) + if (($doNotSubmit || $this->hasErrors()) && $hasUpload) { foreach ($arrFiles as $upload) { @@ -266,7 +320,7 @@ protected function compile() // Add a warning to the page title if ( - $doNotSubmit + ($doNotSubmit || $this->hasErrors()) && !Environment::get('isAjaxRequest') && ($responseContext = System::getContainer()->get('contao.routing.response_context_accessor')->getResponseContext()) && $responseContext->has(HtmlHeadBag::class) @@ -289,11 +343,13 @@ protected function compile() $strAttributes .= ' class="' . $arrAttributes[1] . '"'; } - $this->Template->hasError = $doNotSubmit; + $this->Template->hasError = $doNotSubmit || $this->hasErrors(); + $this->Template->errors = $this->getErrors(); $this->Template->attributes = $strAttributes; $this->Template->enctype = $hasUpload ? 'multipart/form-data' : 'application/x-www-form-urlencoded'; $this->Template->maxFileSize = $hasUpload ? $this->objModel->getMaxUploadFileSize() : false; $this->Template->novalidate = $this->novalidate ? ' novalidate' : ''; + $this->Template->ajax = $this->isAjaxEnabled(); // Get the target URL if ($this->method == 'GET' && ($objTarget = $this->objModel->getRelated('jumpTo')) instanceof PageModel) @@ -303,6 +359,22 @@ protected function compile() } } + /** + * Get the form ID. + */ + protected function getFormId(): string + { + return $this->formID ? 'auto_' . $this->formID : 'auto_form_' . $this->id; + } + + /** + * Return true if the Ajax is enabled. + */ + protected function isAjaxEnabled(): bool + { + return $this->method === 'POST' && $this->ajax; + } + /** * Process form data, store it in the session and redirect to the jumpTo page * @@ -560,10 +632,46 @@ protected function processFormData($arrSubmitted, $arrLabels, $arrFields, $arrFi System::getContainer()->get('monolog.logger.contao.forms')->info('Form "' . $this->title . '" has been submitted by a guest.'); } + if ($this->hasErrors()) + { + return; + } + + $targetPageData = null; + // Check whether there is a jumpTo page if (($objJumpTo = $this->objModel->getRelated('jumpTo')) instanceof PageModel) { - $this->jumpToOrReload($objJumpTo->row()); + $targetPageData = $objJumpTo->row(); + } + + // Set the confirmation message if any + if ($this->objModel->confirmation) + { + $message = $this->objModel->confirmation; + $message = System::getContainer()->get('contao.string.simple_token_parser')->parse($message, array_map(StringUtil::specialchars(...), $arrSubmitted)); + $message = System::getContainer()->get('contao.insert_tag.parser')->replaceInline($message); + + $requestStack = System::getContainer()->get('request_stack'); + $request = $requestStack->getCurrentRequest(); + + // Throw the response exception if it's an AJAX request + if ($request && $targetPageData === null && $this->isAjaxEnabled() && $request->isXmlHttpRequest() && $request->headers->get('X-Contao-Ajax-Form') === $this->getFormId()) + { + $confirmationTemplate = new FrontendTemplate('form_message'); + $confirmationTemplate->setData($this->Template->getData()); + $confirmationTemplate->message = $message; + + throw new ResponseException($confirmationTemplate->getResponse()); + } + + $requestStack->getSession()->getFlashBag()->set(self::SESSION_CONFIRMATION_KEY, array('id' => $this->id, 'message' => $message)); + } + + // Redirect or reload if there is a target page + if ($targetPageData !== null) + { + $this->jumpToOrReload($targetPageData); } $this->reload(); diff --git a/core-bundle/contao/forms/FormPassword.php b/core-bundle/contao/forms/FormPassword.php index b9c2c88d83b..07cfd66eb60 100644 --- a/core-bundle/contao/forms/FormPassword.php +++ b/core-bundle/contao/forms/FormPassword.php @@ -106,7 +106,7 @@ public function __set($strKey, $varValue) * * @return mixed The validated user input */ - protected function validator($varInput) + protected function validator(#[\SensitiveParameter] $varInput) { $this->blnSubmitInput = false; diff --git a/core-bundle/contao/forms/FormText.php b/core-bundle/contao/forms/FormText.php index 9655309bd0d..7ddb0df78d3 100644 --- a/core-bundle/contao/forms/FormText.php +++ b/core-bundle/contao/forms/FormText.php @@ -27,6 +27,8 @@ */ class FormText extends Widget { + protected const HTML5_DATE_FORMAT = 'Y-m-d'; + /** * Submit user input * @@ -166,7 +168,7 @@ public function __get($strKey) return 'password'; } - // Use the HTML5 types (see #4138) but not the date, time and datetime types (see #5918) + // Use the HTML5 types (see #4138) but not the time and datetime types (see #5918) switch ($this->rgxp) { case 'digit': @@ -189,6 +191,9 @@ public function __get($strKey) case 'url': case HttpUrlListener::RGXP_NAME: return 'url'; + + case 'date': + return 'date'; } return 'text'; @@ -245,6 +250,18 @@ protected function validator($varInput) { $varInput = Idna::encodeEmail($varInput); } + elseif ($this->rgxp == 'date') + { + $targetFormat = Date::getNumericDateFormat(); + + // Check if date format matches the HTML5 standard + if (self::HTML5_DATE_FORMAT !== $targetFormat && preg_match('~^' . Date::getRegexp(self::HTML5_DATE_FORMAT) . '$~i', $varInput ?? '')) + { + // Transform to defined date format (see #5918) + $date = \DateTimeImmutable::createFromFormat(self::HTML5_DATE_FORMAT, $varInput); + $varInput = $date->format($targetFormat); + } + } return parent::validator($varInput); } diff --git a/core-bundle/contao/forms/FormTextarea.php b/core-bundle/contao/forms/FormTextarea.php index cab15ae28e7..2daf02bd000 100644 --- a/core-bundle/contao/forms/FormTextarea.php +++ b/core-bundle/contao/forms/FormTextarea.php @@ -100,8 +100,16 @@ public function __set($strKey, $varValue) case 'size': $arrSize = StringUtil::deserialize($varValue); - $this->intRows = $arrSize[0]; - $this->intCols = $arrSize[1]; + + if (isset($arrSize[0])) + { + $this->intRows = $arrSize[0]; + } + + if (isset($arrSize[1])) + { + $this->intCols = $arrSize[1]; + } break; case 'rows': diff --git a/core-bundle/contao/languages/en/default.xlf b/core-bundle/contao/languages/en/default.xlf index e87db0f7e02..a87982c87fd 100644 --- a/core-bundle/contao/languages/en/default.xlf +++ b/core-bundle/contao/languages/en/default.xlf @@ -122,8 +122,8 @@ Your username and password must not be the same! - - This account has been locked! You can log in again in %d minutes. + + Too many failed login attempts, please try again later. Login failed (note that usernames and passwords are case-sensitive)! @@ -275,6 +275,12 @@ The end time must be later than the start time. + + There is no administrator e-mail address set in the <a href="%s" target="_top">system settings</a>. + + + There is no administrator e-mail address set, please contact the site administrator. + Please add %d and %d. @@ -1178,12 +1184,6 @@ This seems to be your first login. Welcome to Contao! - - Login attempts - - - Locked - Move the item via drag and drop @@ -1529,6 +1529,9 @@ Copy + + Copy repeatedly + Generate aliases @@ -1593,7 +1596,7 @@ protected - Guests + Guests (not logged in) Update mode @@ -1878,7 +1881,7 @@ Remember me - Created on + Created at Activation token @@ -2108,6 +2111,15 @@ Edit image size + + Not %s + + + Dark mode + + + Light mode + Byte diff --git a/core-bundle/contao/languages/en/tl_form.xlf b/core-bundle/contao/languages/en/tl_form.xlf index 1279e36e32a..a993ae3da1a 100644 --- a/core-bundle/contao/languages/en/tl_form.xlf +++ b/core-bundle/contao/languages/en/tl_form.xlf @@ -20,6 +20,12 @@ Please choose the page to which visitors will be redirected after submitting the form. + + Confirmation message + + + Here you can enter the confirmation message that will be displayed after submitting the form. You can use the submitted form data as simple tokens, e.g. <code>##field_name##</code>. The confirmation message is also available as <code>{{form_confirmation}}</code> insert tag. + Send form data via e-mail @@ -140,6 +146,12 @@ Allow HTML tags in form fields. + + Submit via Ajax + + + Submit the form via Ajax instead of reloading the page. + Revision date @@ -161,6 +173,9 @@ Form configuration + + Confirmation + Template settings diff --git a/core-bundle/contao/languages/en/tl_opt_in.xlf b/core-bundle/contao/languages/en/tl_opt_in.xlf index 4676f446a1d..2041fa2a2b4 100644 --- a/core-bundle/contao/languages/en/tl_opt_in.xlf +++ b/core-bundle/contao/languages/en/tl_opt_in.xlf @@ -6,10 +6,10 @@ Token - Confirmed on + Confirmed at - Remove on + Remove at Invalidated through diff --git a/core-bundle/contao/languages/en/tl_settings.xlf b/core-bundle/contao/languages/en/tl_settings.xlf index 4cf8fe8a79b..cbba9745bd4 100644 --- a/core-bundle/contao/languages/en/tl_settings.xlf +++ b/core-bundle/contao/languages/en/tl_settings.xlf @@ -32,12 +32,6 @@ Please select the server time zone. - - Disable the command scheduler - - - Disable the periodic command scheduler and trigger the <em>_contao/cron</em> route by a real cron job (which you have to set up manually). - Items per page @@ -137,9 +131,6 @@ Upload settings - - Cron job settings - Default access rights diff --git a/core-bundle/contao/library/Contao/Config.php b/core-bundle/contao/library/Contao/Config.php index 0fb36d271c3..60ccfe70517 100644 --- a/core-bundle/contao/library/Contao/Config.php +++ b/core-bundle/contao/library/Contao/Config.php @@ -85,6 +85,7 @@ class Config private static $arrToBeRemoved = array ( + 'disableCron', ); /** diff --git a/core-bundle/contao/library/Contao/Controller.php b/core-bundle/contao/library/Contao/Controller.php index 7c6c0659d23..149c98c2ac2 100644 --- a/core-bundle/contao/library/Contao/Controller.php +++ b/core-bundle/contao/library/Contao/Controller.php @@ -660,7 +660,7 @@ public static function getForm($varId, $strColumn='main', $blnModule=false) public static function getPageStatusIcon($objPage) { $sub = 0; - $type = \in_array($objPage->type, array('regular', 'root', 'forward', 'redirect', 'error_401', 'error_403', 'error_404', 'error_503'), true) ? $objPage->type : 'regular'; + $type = \in_array($objPage->type, array('regular', 'root', 'forward', 'redirect', 'error_401', 'error_403', 'error_404', 'error_503', 'logout'), true) ? $objPage->type : 'regular'; $image = $type . '.svg'; // Page not published or not active @@ -1455,7 +1455,7 @@ public static function addStaticUrlTo($script, ContaoContext $context = null) if ($strStaticUrl = $context->getStaticUrl()) { - return $strStaticUrl . $script; + return $strStaticUrl . ltrim($script, '/'); } return $script; diff --git a/core-bundle/contao/library/Contao/Database/Result.php b/core-bundle/contao/library/Contao/Database/Result.php index ed14e76ea7f..688477e7bf9 100644 --- a/core-bundle/contao/library/Contao/Database/Result.php +++ b/core-bundle/contao/library/Contao/Database/Result.php @@ -99,10 +99,7 @@ public function __construct($statement, $strQuery) */ public function __destruct() { - if ($this->resResult) - { - $this->resResult->free(); - } + $this->resResult?->free(); } /** diff --git a/core-bundle/contao/library/Contao/Dbafs.php b/core-bundle/contao/library/Contao/Dbafs.php index b4ba933c421..9e97f188b97 100644 --- a/core-bundle/contao/library/Contao/Dbafs.php +++ b/core-bundle/contao/library/Contao/Dbafs.php @@ -398,13 +398,8 @@ public static function deleteResource($strResource) { self::validateUtf8Path($strResource); - $objModel = FilesModel::findByPath($strResource); - // Remove the resource - if ($objModel !== null) - { - $objModel->delete(); - } + FilesModel::findByPath($strResource)?->delete(); // Look for subfolders and files $objFiles = FilesModel::findMultipleByBasepath($strResource . '/'); diff --git a/core-bundle/contao/library/Contao/Image.php b/core-bundle/contao/library/Contao/Image.php index 351f73cc927..6f58587dad9 100644 --- a/core-bundle/contao/library/Contao/Image.php +++ b/core-bundle/contao/library/Contao/Image.php @@ -11,6 +11,7 @@ namespace Contao; use Contao\Image\DeferredImageInterface; +use Symfony\Component\Filesystem\Path; class Image { @@ -56,12 +57,6 @@ public static function getPath($src) } $theme = Backend::getTheme(); - - if (pathinfo($src, PATHINFO_EXTENSION) == 'svg') - { - return 'system/themes/' . $theme . '/icons/' . $src; - } - $filename = pathinfo($src, PATHINFO_FILENAME); // Prefer SVG icons @@ -146,6 +141,17 @@ public static function getHtml($src, $alt='', $attributes='') $src = substr($src, \strlen($webDir) + 1); } + // Check for a dark theme icon and return a picture element if there is one + if ($objFile->mime == 'image/svg+xml' && str_contains($src, 'system/themes/')) + { + $darkSrc = 'system/themes/' . Backend::getTheme() . '/icons-dark/' . $objFile->filename . '.svg'; + + if (file_exists(Path::join($projectDir, $darkSrc))) + { + return '' . StringUtil::specialchars($alt) . '' . StringUtil::specialchars($alt) . ''; + } + } + return '' . StringUtil::specialchars($alt) . ''; } } diff --git a/core-bundle/contao/library/Contao/InsertTags.php b/core-bundle/contao/library/Contao/InsertTags.php index 8070745c8a0..be1a82cd1e1 100644 --- a/core-bundle/contao/library/Contao/InsertTags.php +++ b/core-bundle/contao/library/Contao/InsertTags.php @@ -181,7 +181,7 @@ static function ($allowedTag) // Skip certain elements if the output will be cached if ($blnCache) { - if ($elements[0] == 'date' || $elements[0] == 'form_session_data' || $elements[0] == 'fragment' || ($elements[1] ?? null) == 'referer' || strncmp($elements[0], 'cache_', 6) === 0) + if ($elements[0] == 'date' || $elements[0] == 'form_session_data' || $elements[0] === 'form_confirmation' || $elements[0] == 'fragment' || ($elements[1] ?? null) == 'referer' || strncmp($elements[0], 'cache_', 6) === 0) { /** @var FragmentHandler $fragmentHandler */ $fragmentHandler = $container->get('fragment.handler'); @@ -704,6 +704,18 @@ static function ($allowedTag) $arrCache[$strTag] = $attribute?->getValue()[$elements[1]] ?? null; break; + // Form confirmation message + case 'form_confirmation': + if ($request?->getSession()->getFlashBag()->has(Form::SESSION_CONFIRMATION_KEY)) + { + $arrCache[$strTag] = $request->getSession()->getFlashBag()->get(Form::SESSION_CONFIRMATION_KEY)['message'] ?? null; + } + else + { + $arrCache[$strTag] = null; + } + break; + // Conditional tags (if, if not) case 'iflng': case 'ifnlng': diff --git a/core-bundle/contao/library/Contao/Template.php b/core-bundle/contao/library/Contao/Template.php index 6d144f2ff42..5449025c92b 100644 --- a/core-bundle/contao/library/Contao/Template.php +++ b/core-bundle/contao/library/Contao/Template.php @@ -357,12 +357,13 @@ public function previewRoute($strName, $arrParams=array()) * @param string $strId * @param array $arrParams * @param string $strDomain + * @param string $locale * * @return string */ - public function trans($strId, array $arrParams=array(), $strDomain='contao_default') + public function trans($strId, array $arrParams=array(), $strDomain='contao_default', $locale=null) { - return System::getContainer()->get('translator')->trans($strId, $arrParams, $strDomain); + return System::getContainer()->get('translator')->trans($strId, $arrParams, $strDomain, $locale); } /** diff --git a/core-bundle/contao/library/Contao/User.php b/core-bundle/contao/library/Contao/User.php index f12b6ce970f..88a8d317950 100644 --- a/core-bundle/contao/library/Contao/User.php +++ b/core-bundle/contao/library/Contao/User.php @@ -70,8 +70,6 @@ * @property boolean $useTwoFactor * @property integer $lastLogin * @property integer $currentLogin - * @property integer $loginAttempts - * @property integer $locked * @property string|null $backupCodes * @property integer $trustedTokenVersion * @property string $firstname @@ -382,7 +380,7 @@ public function getPassword(): string|null return $this->password; } - public function setPassword(?string $password): self + public function setPassword(#[\SensitiveParameter] ?string $password): self { $this->password = $password; diff --git a/core-bundle/contao/models/MemberModel.php b/core-bundle/contao/models/MemberModel.php index 1b1508d2dce..edb740763d8 100644 --- a/core-bundle/contao/models/MemberModel.php +++ b/core-bundle/contao/models/MemberModel.php @@ -46,8 +46,6 @@ * @property integer $dateAdded * @property integer $lastLogin * @property integer $currentLogin - * @property integer $loginAttempts - * @property integer $locked * @property string|array|null $session * @property string|null $secret * @property boolean $useTwoFactor @@ -87,8 +85,6 @@ * @method static MemberModel|null findOneByDateAdded($val, array $opt=array()) * @method static MemberModel|null findOneByLastLogin($val, array $opt=array()) * @method static MemberModel|null findOneByCurrentLogin($val, array $opt=array()) - * @method static MemberModel|null findOneByLoginAttempts($val, array $opt=array()) - * @method static MemberModel|null findOneByLocked($val, array $opt=array()) * @method static MemberModel|null findOneBySession($val, array $opt=array()) * @method static MemberModel|null findOneBySecret($val, array $opt=array()) * @method static MemberModel|null findOneByUseTwoFactor($val, array $opt=array()) @@ -123,8 +119,6 @@ * @method static Collection|MemberModel[]|MemberModel|null findByDateAdded($val, array $opt=array()) * @method static Collection|MemberModel[]|MemberModel|null findByLastLogin($val, array $opt=array()) * @method static Collection|MemberModel[]|MemberModel|null findByCurrentLogin($val, array $opt=array()) - * @method static Collection|MemberModel[]|MemberModel|null findByLoginAttempts($val, array $opt=array()) - * @method static Collection|MemberModel[]|MemberModel|null findByLocked($val, array $opt=array()) * @method static Collection|MemberModel[]|MemberModel|null findBySession($val, array $opt=array()) * @method static Collection|MemberModel[]|MemberModel|null findBySecret($val, array $opt=array()) * @method static Collection|MemberModel[]|MemberModel|null findByUseTwoFactor($val, array $opt=array()) @@ -164,8 +158,6 @@ * @method static integer countByDateAdded($val, array $opt=array()) * @method static integer countByLastLogin($val, array $opt=array()) * @method static integer countByCurrentLogin($val, array $opt=array()) - * @method static integer countByLoginAttempts($val, array $opt=array()) - * @method static integer countByLocked($val, array $opt=array()) * @method static integer countBySession($val, array $opt=array()) * @method static integer countBySecret($val, array $opt=array()) * @method static integer countByUseTwoFactor($val, array $opt=array()) diff --git a/core-bundle/contao/models/PageModel.php b/core-bundle/contao/models/PageModel.php index aa4c20adf3d..b8b4ac324f5 100644 --- a/core-bundle/contao/models/PageModel.php +++ b/core-bundle/contao/models/PageModel.php @@ -820,14 +820,7 @@ public static function findFirstActiveByMemberGroups($arrIds) */ public static function findWithDetails($intId) { - $objPage = static::findByPk($intId); - - if ($objPage === null) - { - return null; - } - - return $objPage->loadDetails(); + return static::findByPk($intId)?->loadDetails(); } /** @@ -1171,7 +1164,7 @@ public function getPreviewUrl($strParams=null) $baseUrl = $context->getBaseUrl(); // Add the preview script - $context->setBaseUrl(rtrim(\dirname($baseUrl), '/') . $previewScript); + $context->setBaseUrl(preg_replace('(/[^/]*$)', '', $baseUrl) . $previewScript); $objRouter = System::getContainer()->get('router'); diff --git a/core-bundle/contao/models/UserModel.php b/core-bundle/contao/models/UserModel.php index 3c4905373f9..021fb7e1b9a 100644 --- a/core-bundle/contao/models/UserModel.php +++ b/core-bundle/contao/models/UserModel.php @@ -54,8 +54,6 @@ * @property boolean $useTwoFactor * @property integer $lastLogin * @property integer $currentLogin - * @property integer $loginAttempts - * @property integer $locked * @property string|null $backupCodes * @property integer $trustedTokenVersion * @@ -102,8 +100,6 @@ * @method static UserModel|null findOneByUseTwoFactor($val, array $opt=array()) * @method static UserModel|null findOneByLastLogin($val, array $opt=array()) * @method static UserModel|null findOneByCurrentLogin($val, array $opt=array()) - * @method static UserModel|null findOneByLoginAttempts($val, array $opt=array()) - * @method static UserModel|null findOneByLocked($val, array $opt=array()) * @method static UserModel|null findOneByBackupCodes($val, array $opt=array()) * @method static UserModel|null findOneByTrustedTokenVersion($val, array $opt=array()) * @@ -145,8 +141,6 @@ * @method static Collection|UserModel[]|UserModel|null findByUseTwoFactor($val, array $opt=array()) * @method static Collection|UserModel[]|UserModel|null findByLastLogin($val, array $opt=array()) * @method static Collection|UserModel[]|UserModel|null findByCurrentLogin($val, array $opt=array()) - * @method static Collection|UserModel[]|UserModel|null findByLoginAttempts($val, array $opt=array()) - * @method static Collection|UserModel[]|UserModel|null findByLocked($val, array $opt=array()) * @method static Collection|UserModel[]|UserModel|null findByBackupCodes($val, array $opt=array()) * @method static Collection|UserModel[]|UserModel|null findByTrustedTokenVersion($val, array $opt=array()) * @method static Collection|UserModel[]|UserModel|null findMultipleByIds($val, array $opt=array()) @@ -193,8 +187,6 @@ * @method static integer countByUseTwoFactor($val, array $opt=array()) * @method static integer countByLastLogin($val, array $opt=array()) * @method static integer countByCurrentLogin($val, array $opt=array()) - * @method static integer countByLoginAttempts($val, array $opt=array()) - * @method static integer countByLocked($val, array $opt=array()) * @method static integer countByBackupCodes($val, array $opt=array()) * @method static integer countByTrustedTokenVersion($val, array $opt=array()) */ diff --git a/core-bundle/contao/modules/ModuleLogin.php b/core-bundle/contao/modules/ModuleLogin.php index eb542e183c4..ac7414e3636 100644 --- a/core-bundle/contao/modules/ModuleLogin.php +++ b/core-bundle/contao/modules/ModuleLogin.php @@ -10,11 +10,11 @@ namespace Contao; -use Contao\CoreBundle\Security\Exception\LockedException; use Scheb\TwoFactorBundle\Security\Authentication\Exception\InvalidTwoFactorCodeException; use Scheb\TwoFactorBundle\Security\TwoFactor\Event\TwoFactorAuthenticationEvent; use Scheb\TwoFactorBundle\Security\TwoFactor\Event\TwoFactorAuthenticationEvents; use Symfony\Component\Security\Core\Exception\AuthenticationException; +use Symfony\Component\Security\Core\Exception\TooManyLoginAttemptsAuthenticationException; /** * Front end module "login". @@ -135,10 +135,10 @@ protected function compile() return; } - if ($exception instanceof LockedException) + if ($exception instanceof TooManyLoginAttemptsAuthenticationException) { $this->Template->hasError = true; - $this->Template->message = sprintf($GLOBALS['TL_LANG']['ERR']['accountLocked'], $exception->getLockedMinutes()); + $this->Template->message = $GLOBALS['TL_LANG']['ERR']['tooManyLoginAttempts']; } elseif ($exception instanceof InvalidTwoFactorCodeException) { diff --git a/core-bundle/contao/modules/ModuleLostPassword.php b/core-bundle/contao/modules/ModuleLostPassword.php index 02c40fe0c57..88bace77015 100644 --- a/core-bundle/contao/modules/ModuleLostPassword.php +++ b/core-bundle/contao/modules/ModuleLostPassword.php @@ -240,7 +240,6 @@ protected function setNewPassword() $objSession->set('setPasswordToken', ''); $objMember->tstamp = time(); - $objMember->locked = 0; // see #8545 $objMember->password = $objWidget->value; $objMember->save(); diff --git a/core-bundle/contao/modules/ModuleRegistration.php b/core-bundle/contao/modules/ModuleRegistration.php index 21affdbf0ba..53693b32a7d 100644 --- a/core-bundle/contao/modules/ModuleRegistration.php +++ b/core-bundle/contao/modules/ModuleRegistration.php @@ -10,6 +10,7 @@ namespace Contao; +use Contao\CoreBundle\Event\MemberActivationMailEvent; use Contao\CoreBundle\Exception\ResponseException; /** @@ -366,12 +367,6 @@ protected function createNewUser($arrData) // Disable account $arrData['disable'] = 1; - // Make sure newsletter is an array - if (isset($arrData['newsletter']) && !\is_array($arrData['newsletter'])) - { - $arrData['newsletter'] = array($arrData['newsletter']); - } - // Create the user $objNewUser = new MemberModel(); $objNewUser->setRow($arrData); @@ -453,7 +448,8 @@ protected function createNewUser($arrData) */ protected function sendActivationMail($arrData) { - $optIn = System::getContainer()->get('contao.opt_in'); + $container = System::getContainer(); + $optIn = $container->get('contao.opt_in'); $optInToken = $optIn->create('reg', $arrData['email'], array('tl_member'=>array($arrData['id']))); // Prepare the simple token data @@ -461,32 +457,23 @@ protected function sendActivationMail($arrData) $arrTokenData['activation'] = $optInToken->getIdentifier(); $arrTokenData['domain'] = Idna::decode(Environment::get('host')); $arrTokenData['link'] = Idna::decode(Environment::get('url')) . Environment::get('requestUri') . ((strpos(Environment::get('requestUri'), '?') !== false) ? '&' : '?') . 'token=' . $optInToken->getIdentifier(); - $arrTokenData['channels'] = ''; - - $bundles = System::getContainer()->getParameter('kernel.bundles'); - if (isset($bundles['ContaoNewsletterBundle'])) - { - // Make sure newsletter is an array - $arrData['newsletter'] = (array) ($arrData['newsletter'] ?? null); - - // Replace the wildcard - if (!empty($arrData['newsletter'])) - { - $objChannels = NewsletterChannelModel::findByIds($arrData['newsletter']); + $event = new MemberActivationMailEvent( + MemberModel::findByPk($arrData['id']), + $optInToken, + sprintf($GLOBALS['TL_LANG']['MSC']['emailSubject'], Idna::decode(Environment::get('host'))), + $this->reg_text, + $arrTokenData, + ); - if ($objChannels !== null) - { - $arrTokenData['channels'] = implode("\n", $objChannels->fetchEach('title')); - } - } - } + $container->get('event_dispatcher')->dispatch($event); // Send the token - $optInToken->send( - sprintf($GLOBALS['TL_LANG']['MSC']['emailSubject'], Idna::decode(Environment::get('host'))), - System::getContainer()->get('contao.string.simple_token_parser')->parse($this->reg_text, $arrTokenData) - ); + if ($event->shouldSendOptInToken()) + { + $text = $container->get('contao.string.simple_token_parser')->parse($event->getText(), $event->getSimpleTokens()); + $optInToken->send($event->getSubject(), $text); + } } /** diff --git a/core-bundle/contao/templates/backend/be_ace.html5 b/core-bundle/contao/templates/backend/be_ace.html5 index d6d88fa3620..c69bb1ae29e 100644 --- a/core-bundle/contao/templates/backend/be_ace.html5 +++ b/core-bundle/contao/templates/backend/be_ace.html5 @@ -25,7 +25,7 @@ window.ace && window.addEvent('domready', function() { // Instantiate the editor let editor = ace.edit('selector ?>_div'); editor.$blockScrolling = Infinity; - editor.setTheme("ace/theme/clouds"); + editor.setTheme((document.documentElement.dataset.colorScheme === 'dark' ? 'ace/theme/twilight' : 'ace/theme/clouds')); editor.renderer.setScrollMargin(3, 3, 0, 0); editor.renderer.scrollBy(0, -6); editor.container.style.lineHeight = 1.45; diff --git a/core-bundle/contao/templates/backend/be_alerts.html5 b/core-bundle/contao/templates/backend/be_alerts.html5 index 43fb7a932df..965c6e1bc59 100644 --- a/core-bundle/contao/templates/backend/be_alerts.html5 +++ b/core-bundle/contao/templates/backend/be_alerts.html5 @@ -18,13 +18,8 @@ stylesheets ?> - + + javascripts ?> diff --git a/core-bundle/contao/templates/backend/be_confirm.html5 b/core-bundle/contao/templates/backend/be_confirm.html5 index d41f67713ba..07a05d5581e 100644 --- a/core-bundle/contao/templates/backend/be_confirm.html5 +++ b/core-bundle/contao/templates/backend/be_confirm.html5 @@ -18,13 +18,8 @@ stylesheets ?> - + + javascripts ?> diff --git a/core-bundle/contao/templates/backend/be_conflict.html5 b/core-bundle/contao/templates/backend/be_conflict.html5 index 3844488ea2e..2e9dacab3f2 100644 --- a/core-bundle/contao/templates/backend/be_conflict.html5 +++ b/core-bundle/contao/templates/backend/be_conflict.html5 @@ -19,13 +19,8 @@ stylesheets ?> - + + javascripts ?> diff --git a/core-bundle/contao/templates/backend/be_diff.html5 b/core-bundle/contao/templates/backend/be_diff.html5 index 22916988ea3..132c2ae1041 100644 --- a/core-bundle/contao/templates/backend/be_diff.html5 +++ b/core-bundle/contao/templates/backend/be_diff.html5 @@ -19,6 +19,7 @@ + javascripts ?> diff --git a/core-bundle/contao/templates/backend/be_help.html5 b/core-bundle/contao/templates/backend/be_help.html5 index 345d265bd85..a25da0f0c1f 100644 --- a/core-bundle/contao/templates/backend/be_help.html5 +++ b/core-bundle/contao/templates/backend/be_help.html5 @@ -18,13 +18,8 @@ stylesheets ?> - + + javascripts ?> diff --git a/core-bundle/contao/templates/backend/be_login.html5 b/core-bundle/contao/templates/backend/be_login.html5 index 2333c7df84b..a0e85f873bd 100644 --- a/core-bundle/contao/templates/backend/be_login.html5 +++ b/core-bundle/contao/templates/backend/be_login.html5 @@ -23,13 +23,8 @@ stylesheets ?> - + + javascripts ?> endblock(); ?> diff --git a/core-bundle/contao/templates/backend/be_login_two_factor.html5 b/core-bundle/contao/templates/backend/be_login_two_factor.html5 index a1580025ed2..f2f07a8ad21 100644 --- a/core-bundle/contao/templates/backend/be_login_two_factor.html5 +++ b/core-bundle/contao/templates/backend/be_login_two_factor.html5 @@ -23,13 +23,8 @@ stylesheets ?> - + + javascripts ?> endblock(); ?> diff --git a/core-bundle/contao/templates/backend/be_main.html5 b/core-bundle/contao/templates/backend/be_main.html5 index a989bf74781..e804d9e070a 100644 --- a/core-bundle/contao/templates/backend/be_main.html5 +++ b/core-bundle/contao/templates/backend/be_main.html5 @@ -33,8 +33,6 @@ $objCombiner->add('assets/chosen/js/chosen.min.js'); $objCombiner->add('assets/simplemodal/js/simplemodal.min.js'); $objCombiner->add('assets/datepicker/js/datepicker.min.js'); - $objCombiner->add('bundles/contaocore/mootao.min.js'); - $objCombiner->add('bundles/contaocore/core.min.js'); $objCombiner->add('system/themes/'.$this->theme.'/hover.min.js'); echo $objCombiner->getCombinedFile(); ?>"> diff --git a/core-bundle/contao/templates/backend/be_password.html5 b/core-bundle/contao/templates/backend/be_password.html5 index 73b64c098c9..f5aa60e7c82 100644 --- a/core-bundle/contao/templates/backend/be_password.html5 +++ b/core-bundle/contao/templates/backend/be_password.html5 @@ -18,13 +18,8 @@ stylesheets ?> - + + javascripts ?> diff --git a/core-bundle/contao/templates/backend/be_popup.html5 b/core-bundle/contao/templates/backend/be_popup.html5 index 3aa3ad5f69e..5147bb8e044 100644 --- a/core-bundle/contao/templates/backend/be_popup.html5 +++ b/core-bundle/contao/templates/backend/be_popup.html5 @@ -18,13 +18,8 @@ stylesheets ?> - + + javascripts ?> @@ -33,7 +28,7 @@
-
' . $GLOBALS['TL_LANG']['MSC']['table'] . '' . $table . '' . $GLOBALS['TL_LANG']['MSC']['table'] . '' . $table . '
+
diff --git a/core-bundle/contao/templates/backend/be_purge_data.html5 b/core-bundle/contao/templates/backend/be_purge_data.html5 index 791cff3fe80..2ed07cbf59c 100644 --- a/core-bundle/contao/templates/backend/be_purge_data.html5 +++ b/core-bundle/contao/templates/backend/be_purge_data.html5 @@ -15,7 +15,7 @@
-
labels->fileCreated ?>: ctime ?>
+
diff --git a/core-bundle/contao/templates/backend/be_tinyMCE.html5 b/core-bundle/contao/templates/backend/be_tinyMCE.html5 index 26cbf77570f..9e4d4238e22 100644 --- a/core-bundle/contao/templates/backend/be_tinyMCE.html5 +++ b/core-bundle/contao/templates/backend/be_tinyMCE.html5 @@ -17,7 +17,7 @@ window.tinymce && tinymce.init({ entities: '160,nbsp,60,lt,62,gt,173,shy', branding: false, promotion: false, - skin: 'tinymce-5', + skin: (document.documentElement.dataset.colorScheme === 'dark' ? 'tinymce-5-dark' : 'tinymce-5'), setup: function(editor) { editor.getElement().removeAttribute('required'); document.querySelectorAll('[accesskey]').forEach(function(el) { @@ -44,7 +44,7 @@ window.tinymce && tinymce.init({ endblock(); ?> block('content_css'); ?> - content_css: 'system/themes//tinymce.min.css', + content_css: 'system/themes//' + (document.documentElement.dataset.colorScheme === 'dark' ? 'tinymce-dark.min.css' : 'tinymce.min.css'), endblock(); ?> block('plugins'); ?> diff --git a/core-bundle/contao/templates/backend/be_two_factor.html5 b/core-bundle/contao/templates/backend/be_two_factor.html5 index b85a2912535..f3fac150f8e 100644 --- a/core-bundle/contao/templates/backend/be_two_factor.html5 +++ b/core-bundle/contao/templates/backend/be_two_factor.html5 @@ -76,7 +76,7 @@

trans('MSC.noTrustedDevices') ?>

-
+
diff --git a/core-bundle/contao/templates/backend/be_welcome.html5 b/core-bundle/contao/templates/backend/be_welcome.html5 index cfd1167df58..360b9604b39 100644 --- a/core-bundle/contao/templates/backend/be_welcome.html5 +++ b/core-bundle/contao/templates/backend/be_welcome.html5 @@ -15,7 +15,7 @@

trans('MSC.latestChanges') ?>

versions)): ?> -
trans('MSC.device') ?> trans('MSC.browser') ?>
+
diff --git a/core-bundle/contao/templates/forms/form_inline.html5 b/core-bundle/contao/templates/forms/form_inline.html5 new file mode 100644 index 00000000000..37648df434d --- /dev/null +++ b/core-bundle/contao/templates/forms/form_inline.html5 @@ -0,0 +1,18 @@ +action): ?> action="action ?>" method="method ?>" enctype="enctype ?>"attributes ?>novalidate ?>ajax): ?> data-ajax-form> +
+ errors): ?> + errors as $error): ?> +

+ + + method): ?> + + + maxFileSize): ?> + + + + hidden ?> + fields ?> +
+ diff --git a/core-bundle/contao/templates/forms/form_message.html5 b/core-bundle/contao/templates/forms/form_message.html5 new file mode 100644 index 00000000000..8e0f876f1f9 --- /dev/null +++ b/core-bundle/contao/templates/forms/form_message.html5 @@ -0,0 +1,3 @@ +
+ message ?> +
diff --git a/core-bundle/contao/templates/forms/form_wrapper.html5 b/core-bundle/contao/templates/forms/form_wrapper.html5 index 25b9a927e12..f42d64764b0 100644 --- a/core-bundle/contao/templates/forms/form_wrapper.html5 +++ b/core-bundle/contao/templates/forms/form_wrapper.html5 @@ -6,19 +6,16 @@ <hl ?>>headline ?>hl ?>> - action): ?> action="action ?>" method="method ?>" enctype="enctype ?>"attributes ?>novalidate ?>> -
- method): ?> - - - maxFileSize): ?> - - - - hidden ?> - fields ?> -
- + message): ?> + insert('form_message', $this->arrData) ?> + + insert('form_inline', $this->arrData) ?> + + +ajax) { + $GLOBALS['TL_JAVASCRIPT'][] = $this->asset('ajax-form.js', 'contao_core'); +} diff --git a/core-bundle/contao/templates/modules/mod_navigation.html5 b/core-bundle/contao/templates/modules/mod_navigation.html5 index 937d3f8c851..3dfe1adc710 100644 --- a/core-bundle/contao/templates/modules/mod_navigation.html5 +++ b/core-bundle/contao/templates/modules/mod_navigation.html5 @@ -10,7 +10,7 @@ items ?> - + diff --git a/core-bundle/contao/templates/picture/picture_default.html5 b/core-bundle/contao/templates/picture/picture_default.html5 index 6755c87c5d1..ef8d5a98268 100644 --- a/core-bundle/contao/templates/picture/picture_default.html5 +++ b/core-bundle/contao/templates/picture/picture_default.html5 @@ -6,7 +6,7 @@ -img['srcset'] !== $this->img['src']): ?> srcset="img['srcset'] ?>"img['sizes'])): ?> sizes="img['sizes'] ?>"img['width']) && !empty($this->img['height'])): ?> width="img['width'] ?>" height="img['height'] ?>" alt="alt ?>"img['loading'])): ?> loading="img['loading'] ?>"title): ?> title="title ?>"class || !empty($this->img['class'])): ?> class="class.' '.$this->img['class']) ?>"attributes ?>> +img['srcset'] !== $this->img['src']): ?> srcset="img['srcset'] ?>"img['sizes'])): ?> sizes="img['sizes'] ?>"img['width']) && !empty($this->img['height'])): ?> width="img['width'] ?>" height="img['height'] ?>" alt="alt ?>"img['loading'])): ?> loading="img['loading'] ?>"title): ?> title="title ?>"class || !empty($this->img['class'])): ?> class="class.' '.($this->img['class'] ?? '')) ?>"attributes ?>> sources): ?> diff --git a/core-bundle/contao/themes/flexible/basic.css b/core-bundle/contao/themes/flexible/basic.css index 3d0d888a5c7..70961826851 100644 --- a/core-bundle/contao/themes/flexible/basic.css +++ b/core-bundle/contao/themes/flexible/basic.css @@ -6,18 +6,12 @@ * @license LGPL-3.0-or-later */ -/* HTML */ -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; -} - /* Appearance */ -body { +:root { --text: #222; - --body-bg: #eaecef; + --body-bg: #e2e5e9; --content-bg: #fff; - --content-border: #dadadc; + --content-border: #c5c8cc; --black: #000; --white: #fff; --gray: #999; @@ -26,59 +20,130 @@ body { --blue: #006494; --orange: #d68c23; --contao: #f47c00; - --border: #e6e6e8; - --nav: #d3d5d7; - --nav-hover: #eaecef; + --border: #e0e0e2; + --nav: #d3d6da; + --nav-hover: #eaedf1; --nav-bg: #0f1c26; + --nav-hover-bg: #eaedf1; --nav-current: #172b3b; --nav-group: #9fa4a8; --nav-separator: #3a454d; --hover-row: #fffce1; --header-bg: #f47c00; - --header-bg-hover: #e87600; + --header-bg-hover: #e67300; + --header-text: #fff; --invert-bg: #333; --invert-text: #fff; - --table-header: #f6f6f8; - --table-even: #f9f9fb; - --table-odd: #fafafc; - --panel-border: #ddd; - --panel-bg: #f3f3f5; - --tree-header: #f0f0f2; - --tree-header-border: #e3e3e3; + --table-header: #f6f6f7; + --table-odd: #fff; + --table-even: #fbfbfc; + --table-nb-header: #f2f2f3; + --table-nb-odd: #fff; + --table-nb-even: #f7f7f8; + --panel-bg: #f0f0f2; + --tree-header: #eaeaec; + --tree-header-border: #dddddf; --form-text-disabled: #bbb; --form-border: #aaa; --form-border-disabled: #c8c8c8; --form-bg: #fff; + --form-bg-hover: #f6f6f6; --form-bg-disabled: #f9f9f9; --form-button: #eee; --form-button-hover: #f6f6f6; --form-button-active: #aaa; --form-button-disabled: #e9e9e9; - --diff-ins: #060; - --diff-ins-bg: #bfb; - --diff-del: #a00; - --diff-del-bg: #fbb; - --diff-left-bg: #fdd; - --diff-right-bg: #dfd; + --diff-left: #ffebe9; + --diff-del: #ffc1bf; + --diff-right: #e6ffec; + --diff-ins: #abf2bc; --code-bg: #f0f0f0; --checkerbox-bg: #ddd; --info: #808080; --active-bg: #fffce1; - --active-border: #d68c23; + --active-border: #e7b36a; --pre-disabled: #a6a6a6; - --error-bg: #faebeb; - --confirm-bg: #eefcde; - --info-bg: #e9f0f7; - --new-bg: #fbf2e5; + --error-bg: rgba(204,51,51,.15); + --confirm-bg: rgba(88,155,14,.15); + --info-bg: rgba(0,100,148,.15); + --new-bg: rgba(224,149,21,.15); --progress-running: #f47c00; --progress-finished: #589b0e; - --note-bg: #ffc; - --note-border: #f90; - --drag-bg: #4078a5; + --drag-bg: #a3c2db; --legend: #6a6a6c; --paste-hint: #838990; --serp-preview: #3c4043; --serp-preview-title: #1a0dab; + --nested-bg: #fbfbfd; +} + +html[data-color-scheme="dark"] { + color-scheme: dark; + --text: #ddd; + --body-bg: #121416; + --content-bg: #1b1d21; + --content-border: #4e5156; + --black: #fff; + --white: #000; + --blue: #0073a8; + --contao: #f47c00; + --border: #3a3c40; + --nav-bg: #1b1d21; + --nav-hover-bg: #1b325f; + --nav-current: #292c32; + --nav-separator: #3f3f3f; + --hover-row: #1b325f; + --header-bg: #292c32; + --header-bg-hover: #202327; + --invert-bg: #7e8695; + --invert-text: #222; + --table-header: #232529; + --table-odd: #1b1d21; + --table-even: #1e2024; + --table-nb-header: #292c32; + --table-nb-odd: #1b1d21; + --table-nb-even: #23252a; + --panel-bg: #292c32; + --tree-header: #292c32; + --tree-header-border: #3f4146; + --form-text-disabled: #666; + --form-border: #44464b; + --form-border-disabled: #3a3c40; + --form-bg: #151619; + --form-bg-hover: #1e2024; + --form-bg-disabled: #1e2024; + --form-button: #31333a; + --form-button-hover: #383a42; + --form-button-active: #777; + --form-button-disabled: #26272c; + --diff-left: rgba(248,81,73,.15); + --diff-del: rgba(248,81,73,.4); + --diff-right: rgba(46,160,67,.15); + --diff-ins: rgba(46,160,67,.4); + --code-bg: #30343b; + --checkerbox-bg: #30343b; + --info: #9095a2; + --active-bg: #1b325f; + --active-border: #264787; + --drag-bg: #1b325f; + --legend: #747b8b; + --serp-preview: #bdc1c6; + --serp-preview-title: #8ab4f8; + --nested-bg: #1e2024; +} + +html[data-color-scheme="dark"] .color-scheme--light, .color-scheme--dark { + display: none !important; +} + +html[data-color-scheme="dark"] .color-scheme--dark, .color-scheme--light { + display: initial !important; +} + +/* HTML */ +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; } /* General */ @@ -208,8 +273,8 @@ hr { height: 1px; margin: 18px 0; border: 0; - background: var(--panel-border); - color: var(--panel-border); + background: var(--border); + color: var(--border); } p { @@ -229,6 +294,62 @@ p { -webkit-touch-callout: none; } +/* Tables */ +.zebra-table th, .zebra-table td { + padding: 4px 6px; + border: solid var(--border); + border-width: 1px 0; +} + +.zebra-table th { + padding: 6px; + background-color: var(--table-header); +} + +.zebra-table tr:nth-child(odd) td { + background-color: var(--table-odd); +} + +.zebra-table tr:nth-child(even) td { + background-color: var(--table-even); +} + +.zebra-table--with-header tr:nth-child(odd) td { + background-color: var(--table-even); +} + +.zebra-table--with-header tr:nth-child(even) td { + background-color: var(--table-odd); +} + +.zebra-table--no-border th { + border-top: 0; +} + +.zebra-table--no-border td { + border: 0; +} + +.zebra-table--no-border th { + background-color: var(--table-nb-header); +} + +.zebra-table--no-border tr:nth-child(odd) td { + background-color: var(--table-nb-odd); +} + +.zebra-table--no-border tr:nth-child(even) td { + background-color: var(--table-nb-even); +} + +.zebra-table--with-header.zebra-table--no-border tr:nth-child(odd) td { + background-color: var(--table-nb-even); +} + +.zebra-table--with-header.zebra-table--no-border tr:nth-child(even) td { + background-color: var(--table-nb-odd); +} + /* Invisible elements */ .clear { clear: both; @@ -288,12 +409,12 @@ p { min-height: 16px; } -.widget h3 label, .widget h3 img { +.widget h3 img { margin-right: 3px; } .widget legend img { - vertical-align: -3px; + vertical-align: -1px; } .widget-captcha { @@ -308,12 +429,16 @@ p { border-radius: 3px; } +.widget picture { + display: contents; +} + /* Forms */ optgroup { padding-top: 3px; padding-bottom: 3px; font-style: normal; - background: var(--white); + background: var(--form-bg); } fieldset.tl_checkbox_container, fieldset.tl_radio_container { @@ -623,10 +748,6 @@ select[multiple] { transition: background .2s ease; } -.tl_panel .tl_submit, .tl_version_panel .tl_submit, .tl_formbody_submit .tl_submit { - background: var(--form-bg); -} - .tl_submit:hover { color: inherit; background-color: var(--form-button-hover); @@ -638,10 +759,18 @@ select[multiple] { .tl_submit:disabled { color: var(--gray); - background: var(--form-button-disabled); + background: var(--form-button-disabled) !important; cursor: not-allowed; } +.tl_panel .tl_submit, .tl_version_panel .tl_submit, .tl_formbody_submit .tl_submit { + background: var(--form-bg); +} + +.tl_panel .tl_submit:hover, .tl_version_panel .tl_submit:hover, .tl_formbody_submit .tl_submit:hover { + background: var(--form-bg-hover); +} + a.tl_submit { display: inline-block; } @@ -651,6 +780,7 @@ a.tl_submit { display: inline-block; position: relative; z-index: 1; + vertical-align: middle; } .split-button ul, .split-button li { @@ -836,6 +966,10 @@ a.tl_submit { } @media (max-width: 1279px) { + .split-button { + display: inline-flex; + } + .split-button ul { position: absolute; right: 0; @@ -876,7 +1010,7 @@ a.tl_submit { bottom: -12px; z-index: 89; border: 6px inset transparent; - border-top: 6px solid var(--white); + border-top: 6px solid var(--form-bg); } .split-button ul:after { @@ -892,16 +1026,14 @@ a.tl_submit { border-top: 7px solid var(--form-border); } - .split-button button img { - vertical-align: 0; - } - .split-button > button[type="submit"] { position: relative; border-radius: 2px 0 0 2px; } .split-button > button[type="button"] { + height: 30px; + margin: 2px 0; padding: 7px 4px; background: var(--form-bg); border: 1px solid var(--form-border); diff --git a/core-bundle/contao/themes/flexible/basic.min.css b/core-bundle/contao/themes/flexible/basic.min.css index 21fd8606db9..6a6e22c1aba 100644 --- a/core-bundle/contao/themes/flexible/basic.min.css +++ b/core-bundle/contao/themes/flexible/basic.min.css @@ -1 +1 @@ -html{font-size:100%;-webkit-text-size-adjust:100%}body{--text:#222;--body-bg:#eaecef;--content-bg:#fff;--content-border:#dadadc;--black:#000;--white:#fff;--gray:#999;--green:#589b0e;--red:#c33;--blue:#006494;--orange:#d68c23;--contao:#f47c00;--border:#e6e6e8;--nav:#d3d5d7;--nav-hover:#eaecef;--nav-bg:#0f1c26;--nav-current:#172b3b;--nav-group:#9fa4a8;--nav-separator:#3a454d;--hover-row:#fffce1;--header-bg:#f47c00;--header-bg-hover:#e87600;--invert-bg:#333;--invert-text:#fff;--table-header:#f6f6f8;--table-even:#f9f9fb;--table-odd:#fafafc;--panel-border:#ddd;--panel-bg:#f3f3f5;--tree-header:#f0f0f2;--tree-header-border:#e3e3e3;--form-text-disabled:#bbb;--form-border:#aaa;--form-border-disabled:#c8c8c8;--form-bg:#fff;--form-bg-disabled:#f9f9f9;--form-button:#eee;--form-button-hover:#f6f6f6;--form-button-active:#aaa;--form-button-disabled:#e9e9e9;--diff-ins:#060;--diff-ins-bg:#bfb;--diff-del:#a00;--diff-del-bg:#fbb;--diff-left-bg:#fdd;--diff-right-bg:#dfd;--code-bg:#f0f0f0;--checkerbox-bg:#ddd;--info:#808080;--active-bg:#fffce1;--active-border:#d68c23;--pre-disabled:#a6a6a6;--error-bg:#faebeb;--confirm-bg:#eefcde;--info-bg:#e9f0f7;--new-bg:#fbf2e5;--progress-running:#f47c00;--progress-finished:#589b0e;--note-bg:#ffc;--note-border:#f90;--drag-bg:#4078a5;--legend:#6a6a6c;--paste-hint:#838990;--serp-preview:#3c4043;--serp-preview-title:#1a0dab}header,footer,nav,section,aside,main,article,figure,figcaption{display:block}body,h1,h2,h3,h4,p,figure,blockquote,dl{margin:0}img{border:0}table{border-spacing:0;border-collapse:collapse;empty-cells:show}th,td{text-align:left}input,select,button,label,img,a.tl_submit,.tl_select{vertical-align:middle}button{cursor:pointer}nav ul,nav li{margin:0;padding:0;list-style:none}body{font-family:-apple-system,system-ui,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:400;font-size:.875rem;line-height:1;color:var(--text)}h1,h2,h3,h4,h5,h6,strong,b,th{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body{font-weight:300}h1,h2,h3,h4,h5,h6,strong,b,th{font-weight:500}}pre,code,.tl_textarea.monospace{font:300 .75rem/1.25 SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}h1,h2,h3,h4,h5,h6{font-size:1rem}input,textarea,select,button{font:inherit;color:inherit;line-height:inherit}input,select{line-height:17px}@supports (display:-ms-grid){input,select{line-height:1.1}}.tl_gray{color:var(--gray)}.tl_green{color:var(--green)}.tl_red{color:var(--red)}.tl_blue{color:var(--blue)}.tl_orange{color:var(--orange)}span.mandatory{color:var(--red)}.upper{text-transform:uppercase}a{color:var(--text);text-decoration:none}a:hover,a:active{color:var(--contao)}hr{height:1px;margin:18px 0;border:0;background:var(--panel-border);color:var(--panel-border)}p{margin-bottom:1em;padding:0}.hidden{display:none}.unselectable{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none}.clear{clear:both;height:.1px;line-height:.1px;font-size:.1px}.cf:before,.cf:after{content:" ";display:table}.cf:after{clear:both}.invisible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.widget{margin-left:15px;margin-right:15px;position:relative}.widget{font-size:0}.widget *{font-size:.875rem}.widget>div{font-size:0}.widget>div>*{font-size:.875rem}.widget pre,.widget code{font-size:.7rem}.widget h3{min-height:16px}.widget h3 label,.widget h3 img{margin-right:3px}.widget legend img{vertical-align:-3px}.widget-captcha{display:initial!important}.widget p.info{margin:2px 0;padding:7px;background:var(--panel-bg);line-height:1.3;border-radius:3px}optgroup{padding-top:3px;padding-bottom:3px;font-style:normal;background:var(--white)}fieldset.tl_checkbox_container,fieldset.tl_radio_container{border:0;margin:15px 0 1px;padding:0}fieldset.tl_checkbox_container{line-height:15px}fieldset.tl_radio_container{line-height:16px}fieldset.tl_checkbox_container legend,fieldset.tl_radio_container legend{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){fieldset.tl_checkbox_container legend,fieldset.tl_radio_container legend{font-weight:500}}fieldset.tl_checkbox_container .check-all{color:var(--gray)}fieldset.checkbox_container,fieldset.radio_container{border:0;margin:0;padding:0}.tl_text{width:100%}.tl_text_2,.tl_text_interval{width:49%}.tl_text_3{width:32.333%}.tl_text_4{width:24%}.tl_textarea{width:100%}.tl_text_unit{width:79%}.tl_text_trbl{width:19%}.tl_text,.tl_text_2,.tl_text_3,.tl_text_4,.tl_textarea,.tl_text_unit,.tl_text_trbl,.tl_text_interval{height:30px;margin:3px 0;box-sizing:border-box;padding:5px 6px 6px;border:1px solid var(--form-border);border-radius:2px;background-color:var(--form-bg);-moz-appearance:none;-webkit-appearance:none}.tl_text[disabled],.tl_text_2[disabled],.tl_text_3[disabled],.tl_text_4[disabled],.tl_textarea[disabled],.tl_text_unit[disabled],.tl_text_trbl[disabled],.tl_text_interval[disabled]{color:var(--form-text-disabled);background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled);cursor:not-allowed}.tl_text[readonly],.tl_text_2[readonly],.tl_text_3[readonly],.tl_text_4[readonly],.tl_textarea[readonly],.tl_text_unit[readonly],.tl_text_trbl[readonly],.tl_text_interval[readonly]{background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled)}.tl_textarea{height:240px;padding:4px 6px;line-height:1.45}.tl_text_2,.tl_text_3,.tl_text_4,.tl_text_unit,.tl_text_trbl,.tl_text_interval{margin-right:1%}.tl_text_2:last-child,.tl_text_3:last-child,.tl_text_4:last-child,.tl_text_trbl:last-child{margin-right:0}.tl_text_field .tl_text_2{width:49.5%}.tl_imageSize_0{margin-left:1%}input[type=search]{height:27px;padding-top:0;padding-bottom:1px}input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;height:14px;width:14px;margin-right:0;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzc3NyI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiLz48L3N2Zz4=)}@-moz-document url-prefix(){.tl_text::placeholder,.tl_text_2::placeholder,.tl_text_3::placeholder,.tl_text_4::placeholder,.tl_textarea::placeholder,.tl_text_unit::placeholder,.tl_text_trbl::placeholder,.tl_text_interval::placeholder{line-height:18px}}@media not all and (min-resolution:.001dpcm){@supports (-webkit-appearance:none){.tl_text::placeholder,.tl_text_2::placeholder,.tl_text_3::placeholder,.tl_text_4::placeholder,.tl_textarea::placeholder,.tl_text_unit::placeholder,.tl_text_trbl::placeholder,.tl_text_interval::placeholder{line-height:16px}input[type=search]{padding-right:0}input[type=search]::-webkit-search-cancel-button{margin:7px 4px 0 0}}}@supports (display:-ms-grid){.tl_text,.tl_text_2,.tl_text_3,.tl_text_4,.tl_textarea,.tl_text_unit,.tl_text_trbl,.tl_text_interval{padding:4px 6px 5px}}select{text-transform:none;-moz-appearance:none;-webkit-appearance:none}select::-ms-expand{display:none}select[multiple]{height:auto}.tl_select,.tl_mselect,.tl_select_column{width:100%}.tl_select_unit{width:20%}.tl_select_interval{width:50%}.tl_select,.tl_mselect,.tl_select_column,.tl_select_unit,.tl_select_interval{height:30px;margin:3px 0;box-sizing:border-box;border:1px solid var(--form-border);padding:5px 22px 6px 6px;border-radius:2px;background:var(--form-bg) url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDUwMCA1MDAiPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMzEuNTIzIiB5MT0iNDIuNjMiIHgyPSIzNjguNDc4IiB5Mj0iMjc5LjU4NCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjYjNiM2IzIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOTk5Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBmaWxsPSJ1cmwoI2EpIiBkPSJNMjUwIDM5Ni42NjZjLTEuMTU1IDAtNC4xMS0xLjgzMi03LjExMy02Ljc1bC0xNjkuNi0yNzcuNDU1Yy0yLjUxNy00LjExNC0zLjE5LTYuOTgtMy4yOC04LjMxNC44MjctLjMzIDIuNTY1LS44MTIgNS42MjctLjgxMmgzNDguNzMzYzMuMDYzIDAgNC43OTguNDgyIDUuNjI3LjgxMi0uMDkgMS4zMzQtLjc2NiA0LjItMy4yOCA4LjMxNWwtMTY5LjYgMjc3LjQ1N2MtMy4wMDUgNC45MTctNS45NiA2Ljc1LTcuMTE0IDYuNzV6Ii8+PC9zdmc+) right -16px top 3px no-repeat;background-origin:content-box;cursor:pointer}.tl_select[disabled],.tl_mselect[disabled],.tl_select_column[disabled],.tl_select_unit[disabled],.tl_select_interval[disabled],.tl_select[readonly],.tl_mselect[readonly],.tl_select_column[readonly],.tl_select_unit[readonly],.tl_select_interval[readonly]{color:var(--form-text-disabled);background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled);cursor:not-allowed}.tl_select[multiple],.tl_mselect[multiple],.tl_select_column[multiple],.tl_select_unit[multiple],.tl_select_interval[multiple]{background-image:none}@supports (display:-ms-grid){.tl_select,.tl_mselect,.tl_select_column,.tl_select_unit,.tl_select_interval{padding:5px 18px 5px 2px}}.tl_checkbox{margin:0 1px 0 0}.tl_tree_checkbox{margin:1px 1px 1px 0}.tl_checkbox_single_container{height:16px;margin:14px 0 1px}.tl_checkbox_single_container label{margin-left:4px;margin-right:3px;font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_checkbox_single_container label{font-weight:500}}.checkbox_toggler{font-weight:600}.checkbox_toggler_first{margin-top:3px;font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.checkbox_toggler,.checkbox_toggler_first{font-weight:500}}.checkbox_toggler img,.checkbox_toggler_first img{position:relative;top:-1px;margin-right:2px}.checkbox_options{margin:0 0 6px 21px!important}.tl_checkbox_container .checkbox_options:last-of-type{margin-bottom:0!important}.tl_radio{margin:0 1px 0 0}.win .tl_radio{margin:1px 1px 3px 0}.tl_tree_radio{margin:1px 1px 1px 0}.tl_radio_table{margin-top:3px}.tl_radio_table td{padding:0 24px 0 0}.tl_upload_field{margin:1px 0}.tl_submit{height:30px;padding:7px 12px;border:1px solid var(--form-border);border-radius:2px;box-sizing:border-box;cursor:pointer;background:var(--form-button);transition:background .2s ease}.tl_panel .tl_submit,.tl_version_panel .tl_submit,.tl_formbody_submit .tl_submit{background:var(--form-bg)}.tl_submit:hover{color:inherit;background-color:var(--form-button-hover)}.tl_submit:active{color:var(--form-button-active)}.tl_submit:disabled{color:var(--gray);background:var(--form-button-disabled);cursor:not-allowed}a.tl_submit{display:inline-block}.split-button{display:inline-block;position:relative;z-index:1}.split-button ul,.split-button li{margin:0;padding:0;list-style:none}::-moz-placeholder{padding-top:1px}::-webkit-input-placeholder{padding-top:1px}.clr{clear:both;width:calc(100% - 30px)}.clr:not(.widget){width:100%}.clr:before{content:"";display:table}.w50{width:calc(50% - 30px);float:left;min-height:80px}.long{width:calc(100% - 30px)}.wizard>a{position:relative;top:-2px;vertical-align:middle}.wizard .tl_text,.wizard .tl_select{width:calc(100% - 24px)}.wizard .tl_text_2{width:45%}.wizard .tl_image_size{display:inline-block;width:calc(100% - 24px)}.wizard img{margin-left:4px}.long .tl_text,.long .tl_select{width:100%}.m12{margin:0 15px;padding:18px 0 16px}.cbx{min-height:46px}.cbx.m12{min-height:80px;box-sizing:border-box}.subpal{clear:both}.inline div{display:inline}.autoheight{height:auto}.dcapicker .tl_text{padding-right:26px}.tl_tip{height:15px;overflow:hidden;cursor:help}.tip{position:relative;max-width:320px;padding:6px 9px;border-radius:2px;background:var(--invert-bg);z-index:99}.tip div{line-height:1.3}.tip div,.tip a,.tip span{color:var(--invert-text)}.tip:before{content:"";height:6px;position:absolute;top:-13px;left:9px;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid var(--invert-bg)}.tip--rtl:before{left:auto;right:9px}.hover-div:hover,.hover-row:hover td,.hover-div:hover .limit_toggler,.hover-row:hover .limit_toggler{background-color:var(--hover-row)!important}.badge-title{float:right;margin-left:8px;margin-top:-8px;border-radius:8px;padding:2px 5px;background:var(--invert-bg);color:var(--invert-text);font-size:.75rem;font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.badge-title{font-weight:500}}@media (min-width:1280px){#sbtog{display:none}.split-button ul{display:inline-flex;clip:initial;height:auto;margin:0 0 0 -4px;overflow:initial;position:initial;width:auto}.split-button li{margin-left:4px}}@media (max-width:1279px){.split-button ul{position:absolute;right:0;bottom:20px;min-width:100%;background:var(--form-bg);border:1px solid var(--form-border);border-radius:2px;box-sizing:border-box;padding:3px 0;margin-bottom:1em}.split-button ul button{border:0;width:100%;text-align:left;white-space:nowrap}.split-button ul .tl_submit{margin-top:0;margin-bottom:0;background:var(--form-bg)}.split-button ul .tl_submit:hover{background:var(--form-button-hover)}.split-button ul:before{content:"";display:block;height:0;width:0;position:absolute;right:4px;bottom:-12px;z-index:89;border:6px inset transparent;border-top:6px solid var(--white)}.split-button ul:after{content:"";display:block;height:0;width:0;position:absolute;right:3px;bottom:-14px;z-index:88;border:7px inset transparent;border-top:7px solid var(--form-border)}.split-button button img{vertical-align:0}.split-button>button[type=submit]{position:relative;border-radius:2px 0 0 2px}.split-button>button[type=button]{padding:7px 4px;background:var(--form-bg);border:1px solid var(--form-border);border-left:0;border-radius:0 2px 2px 0;box-sizing:border-box;transition:background .2s ease}.split-button>button[type=button].active,.split-button>button[type=button]:hover{background:var(--form-button-hover)}.split-button>button[type=button]:focus{outline:0}}@media (max-width:767px){.w50{float:none;width:calc(100% - 30px)}.m12{padding-top:0;padding-bottom:0}.cbx,.cbx.m12{min-height:auto}.tip{max-width:80vw}.tl_checkbox_container .tl_checkbox{margin-top:1px;margin-bottom:1px}} \ No newline at end of file +:root{--text:#222;--body-bg:#e2e5e9;--content-bg:#fff;--content-border:#c5c8cc;--black:#000;--white:#fff;--gray:#999;--green:#589b0e;--red:#c33;--blue:#006494;--orange:#d68c23;--contao:#f47c00;--border:#e0e0e2;--nav:#d3d6da;--nav-hover:#eaedf1;--nav-bg:#0f1c26;--nav-hover-bg:#eaedf1;--nav-current:#172b3b;--nav-group:#9fa4a8;--nav-separator:#3a454d;--hover-row:#fffce1;--header-bg:#f47c00;--header-bg-hover:#e67300;--header-text:#fff;--invert-bg:#333;--invert-text:#fff;--table-header:#f6f6f7;--table-odd:#fff;--table-even:#fbfbfc;--table-nb-header:#f2f2f3;--table-nb-odd:#fff;--table-nb-even:#f7f7f8;--panel-bg:#f0f0f2;--tree-header:#eaeaec;--tree-header-border:#dddddf;--form-text-disabled:#bbb;--form-border:#aaa;--form-border-disabled:#c8c8c8;--form-bg:#fff;--form-bg-hover:#f6f6f6;--form-bg-disabled:#f9f9f9;--form-button:#eee;--form-button-hover:#f6f6f6;--form-button-active:#aaa;--form-button-disabled:#e9e9e9;--diff-left:#ffebe9;--diff-del:#ffc1bf;--diff-right:#e6ffec;--diff-ins:#abf2bc;--code-bg:#f0f0f0;--checkerbox-bg:#ddd;--info:#808080;--active-bg:#fffce1;--active-border:#e7b36a;--pre-disabled:#a6a6a6;--error-bg:rgba(204,51,51,.15);--confirm-bg:rgba(88,155,14,.15);--info-bg:rgba(0,100,148,.15);--new-bg:rgba(224,149,21,.15);--progress-running:#f47c00;--progress-finished:#589b0e;--drag-bg:#a3c2db;--legend:#6a6a6c;--paste-hint:#838990;--serp-preview:#3c4043;--serp-preview-title:#1a0dab;--nested-bg:#fbfbfd}html[data-color-scheme=dark]{color-scheme:dark;--text:#ddd;--body-bg:#121416;--content-bg:#1b1d21;--content-border:#4e5156;--black:#fff;--white:#000;--blue:#0073a8;--contao:#f47c00;--border:#3a3c40;--nav-bg:#1b1d21;--nav-hover-bg:#1b325f;--nav-current:#292c32;--nav-separator:#3f3f3f;--hover-row:#1b325f;--header-bg:#292c32;--header-bg-hover:#202327;--invert-bg:#7e8695;--invert-text:#222;--table-header:#232529;--table-odd:#1b1d21;--table-even:#1e2024;--table-nb-header:#292c32;--table-nb-odd:#1b1d21;--table-nb-even:#23252a;--panel-bg:#292c32;--tree-header:#292c32;--tree-header-border:#3f4146;--form-text-disabled:#666;--form-border:#44464b;--form-border-disabled:#3a3c40;--form-bg:#151619;--form-bg-hover:#1e2024;--form-bg-disabled:#1e2024;--form-button:#31333a;--form-button-hover:#383a42;--form-button-active:#777;--form-button-disabled:#26272c;--diff-left:rgba(248,81,73,.15);--diff-del:rgba(248,81,73,.4);--diff-right:rgba(46,160,67,.15);--diff-ins:rgba(46,160,67,.4);--code-bg:#30343b;--checkerbox-bg:#30343b;--info:#9095a2;--active-bg:#1b325f;--active-border:#264787;--drag-bg:#1b325f;--legend:#747b8b;--serp-preview:#bdc1c6;--serp-preview-title:#8ab4f8;--nested-bg:#1e2024}html[data-color-scheme=dark] .color-scheme--light,.color-scheme--dark{display:none!important}html[data-color-scheme=dark] .color-scheme--dark,.color-scheme--light{display:initial!important}html{font-size:100%;-webkit-text-size-adjust:100%}header,footer,nav,section,aside,main,article,figure,figcaption{display:block}body,h1,h2,h3,h4,p,figure,blockquote,dl{margin:0}img{border:0}table{border-spacing:0;border-collapse:collapse;empty-cells:show}th,td{text-align:left}input,select,button,label,img,a.tl_submit,.tl_select{vertical-align:middle}button{cursor:pointer}nav ul,nav li{margin:0;padding:0;list-style:none}body{font-family:-apple-system,system-ui,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:400;font-size:.875rem;line-height:1;color:var(--text)}h1,h2,h3,h4,h5,h6,strong,b,th{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body{font-weight:300}h1,h2,h3,h4,h5,h6,strong,b,th{font-weight:500}}pre,code,.tl_textarea.monospace{font:300 .75rem/1.25 SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}h1,h2,h3,h4,h5,h6{font-size:1rem}input,textarea,select,button{font:inherit;color:inherit;line-height:inherit}input,select{line-height:17px}@supports (display:-ms-grid){input,select{line-height:1.1}}.tl_gray{color:var(--gray)}.tl_green{color:var(--green)}.tl_red{color:var(--red)}.tl_blue{color:var(--blue)}.tl_orange{color:var(--orange)}span.mandatory{color:var(--red)}.upper{text-transform:uppercase}a{color:var(--text);text-decoration:none}a:hover,a:active{color:var(--contao)}hr{height:1px;margin:18px 0;border:0;background:var(--border);color:var(--border)}p{margin-bottom:1em;padding:0}.hidden{display:none}.unselectable{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none}.zebra-table th,.zebra-table td{padding:4px 6px;border:solid var(--border);border-width:1px 0}.zebra-table th{padding:6px;background-color:var(--table-header)}.zebra-table tr:nth-child(odd) td{background-color:var(--table-odd)}.zebra-table tr:nth-child(even) td{background-color:var(--table-even)}.zebra-table--with-header tr:nth-child(odd) td{background-color:var(--table-even)}.zebra-table--with-header tr:nth-child(even) td{background-color:var(--table-odd)}.zebra-table--no-border th{border-top:0}.zebra-table--no-border td{border:0}.zebra-table--no-border th{background-color:var(--table-nb-header)}.zebra-table--no-border tr:nth-child(odd) td{background-color:var(--table-nb-odd)}.zebra-table--no-border tr:nth-child(even) td{background-color:var(--table-nb-even)}.zebra-table--with-header.zebra-table--no-border tr:nth-child(odd) td{background-color:var(--table-nb-even)}.zebra-table--with-header.zebra-table--no-border tr:nth-child(even) td{background-color:var(--table-nb-odd)}.clear{clear:both;height:.1px;line-height:.1px;font-size:.1px}.cf:before,.cf:after{content:" ";display:table}.cf:after{clear:both}.invisible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.widget{margin-left:15px;margin-right:15px;position:relative}.widget{font-size:0}.widget *{font-size:.875rem}.widget>div{font-size:0}.widget>div>*{font-size:.875rem}.widget pre,.widget code{font-size:.7rem}.widget h3{min-height:16px}.widget h3 img{margin-right:3px}.widget legend img{vertical-align:-1px}.widget-captcha{display:initial!important}.widget p.info{margin:2px 0;padding:7px;background:var(--panel-bg);line-height:1.3;border-radius:3px}.widget picture{display:contents}optgroup{padding-top:3px;padding-bottom:3px;font-style:normal;background:var(--form-bg)}fieldset.tl_checkbox_container,fieldset.tl_radio_container{border:0;margin:15px 0 1px;padding:0}fieldset.tl_checkbox_container{line-height:15px}fieldset.tl_radio_container{line-height:16px}fieldset.tl_checkbox_container legend,fieldset.tl_radio_container legend{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){fieldset.tl_checkbox_container legend,fieldset.tl_radio_container legend{font-weight:500}}fieldset.tl_checkbox_container .check-all{color:var(--gray)}fieldset.checkbox_container,fieldset.radio_container{border:0;margin:0;padding:0}.tl_text{width:100%}.tl_text_2,.tl_text_interval{width:49%}.tl_text_3{width:32.333%}.tl_text_4{width:24%}.tl_textarea{width:100%}.tl_text_unit{width:79%}.tl_text_trbl{width:19%}.tl_text,.tl_text_2,.tl_text_3,.tl_text_4,.tl_textarea,.tl_text_unit,.tl_text_trbl,.tl_text_interval{height:30px;margin:3px 0;box-sizing:border-box;padding:5px 6px 6px;border:1px solid var(--form-border);border-radius:2px;background-color:var(--form-bg);-moz-appearance:none;-webkit-appearance:none}.tl_text[disabled],.tl_text_2[disabled],.tl_text_3[disabled],.tl_text_4[disabled],.tl_textarea[disabled],.tl_text_unit[disabled],.tl_text_trbl[disabled],.tl_text_interval[disabled]{color:var(--form-text-disabled);background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled);cursor:not-allowed}.tl_text[readonly],.tl_text_2[readonly],.tl_text_3[readonly],.tl_text_4[readonly],.tl_textarea[readonly],.tl_text_unit[readonly],.tl_text_trbl[readonly],.tl_text_interval[readonly]{background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled)}.tl_textarea{height:240px;padding:4px 6px;line-height:1.45}.tl_text_2,.tl_text_3,.tl_text_4,.tl_text_unit,.tl_text_trbl,.tl_text_interval{margin-right:1%}.tl_text_2:last-child,.tl_text_3:last-child,.tl_text_4:last-child,.tl_text_trbl:last-child{margin-right:0}.tl_text_field .tl_text_2{width:49.5%}.tl_imageSize_0{margin-left:1%}input[type=search]{height:27px;padding-top:0;padding-bottom:1px}input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;height:14px;width:14px;margin-right:0;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzc3NyI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiLz48L3N2Zz4=)}@-moz-document url-prefix(){.tl_text::placeholder,.tl_text_2::placeholder,.tl_text_3::placeholder,.tl_text_4::placeholder,.tl_textarea::placeholder,.tl_text_unit::placeholder,.tl_text_trbl::placeholder,.tl_text_interval::placeholder{line-height:18px}}@media not all and (min-resolution:.001dpcm){@supports (-webkit-appearance:none){.tl_text::placeholder,.tl_text_2::placeholder,.tl_text_3::placeholder,.tl_text_4::placeholder,.tl_textarea::placeholder,.tl_text_unit::placeholder,.tl_text_trbl::placeholder,.tl_text_interval::placeholder{line-height:16px}input[type=search]{padding-right:0}input[type=search]::-webkit-search-cancel-button{margin:7px 4px 0 0}}}@supports (display:-ms-grid){.tl_text,.tl_text_2,.tl_text_3,.tl_text_4,.tl_textarea,.tl_text_unit,.tl_text_trbl,.tl_text_interval{padding:4px 6px 5px}}select{text-transform:none;-moz-appearance:none;-webkit-appearance:none}select::-ms-expand{display:none}select[multiple]{height:auto}.tl_select,.tl_mselect,.tl_select_column{width:100%}.tl_select_unit{width:20%}.tl_select_interval{width:50%}.tl_select,.tl_mselect,.tl_select_column,.tl_select_unit,.tl_select_interval{height:30px;margin:3px 0;box-sizing:border-box;border:1px solid var(--form-border);padding:5px 22px 6px 6px;border-radius:2px;background:var(--form-bg) url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDUwMCA1MDAiPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMzEuNTIzIiB5MT0iNDIuNjMiIHgyPSIzNjguNDc4IiB5Mj0iMjc5LjU4NCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjYjNiM2IzIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOTk5Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBmaWxsPSJ1cmwoI2EpIiBkPSJNMjUwIDM5Ni42NjZjLTEuMTU1IDAtNC4xMS0xLjgzMi03LjExMy02Ljc1bC0xNjkuNi0yNzcuNDU1Yy0yLjUxNy00LjExNC0zLjE5LTYuOTgtMy4yOC04LjMxNC44MjctLjMzIDIuNTY1LS44MTIgNS42MjctLjgxMmgzNDguNzMzYzMuMDYzIDAgNC43OTguNDgyIDUuNjI3LjgxMi0uMDkgMS4zMzQtLjc2NiA0LjItMy4yOCA4LjMxNWwtMTY5LjYgMjc3LjQ1N2MtMy4wMDUgNC45MTctNS45NiA2Ljc1LTcuMTE0IDYuNzV6Ii8+PC9zdmc+) right -16px top 3px no-repeat;background-origin:content-box;cursor:pointer}.tl_select[disabled],.tl_mselect[disabled],.tl_select_column[disabled],.tl_select_unit[disabled],.tl_select_interval[disabled],.tl_select[readonly],.tl_mselect[readonly],.tl_select_column[readonly],.tl_select_unit[readonly],.tl_select_interval[readonly]{color:var(--form-text-disabled);background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled);cursor:not-allowed}.tl_select[multiple],.tl_mselect[multiple],.tl_select_column[multiple],.tl_select_unit[multiple],.tl_select_interval[multiple]{background-image:none}@supports (display:-ms-grid){.tl_select,.tl_mselect,.tl_select_column,.tl_select_unit,.tl_select_interval{padding:5px 18px 5px 2px}}.tl_checkbox{margin:0 1px 0 0}.tl_tree_checkbox{margin:1px 1px 1px 0}.tl_checkbox_single_container{height:16px;margin:14px 0 1px}.tl_checkbox_single_container label{margin-left:4px;margin-right:3px;font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_checkbox_single_container label{font-weight:500}}.checkbox_toggler{font-weight:600}.checkbox_toggler_first{margin-top:3px;font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.checkbox_toggler,.checkbox_toggler_first{font-weight:500}}.checkbox_toggler img,.checkbox_toggler_first img{position:relative;top:-1px;margin-right:2px}.checkbox_options{margin:0 0 6px 21px!important}.tl_checkbox_container .checkbox_options:last-of-type{margin-bottom:0!important}.tl_radio{margin:0 1px 0 0}.win .tl_radio{margin:1px 1px 3px 0}.tl_tree_radio{margin:1px 1px 1px 0}.tl_radio_table{margin-top:3px}.tl_radio_table td{padding:0 24px 0 0}.tl_upload_field{margin:1px 0}.tl_submit{height:30px;padding:7px 12px;border:1px solid var(--form-border);border-radius:2px;box-sizing:border-box;cursor:pointer;background:var(--form-button);transition:background .2s ease}.tl_submit:hover{color:inherit;background-color:var(--form-button-hover)}.tl_submit:active{color:var(--form-button-active)}.tl_submit:disabled{color:var(--gray);background:var(--form-button-disabled)!important;cursor:not-allowed}.tl_panel .tl_submit,.tl_version_panel .tl_submit,.tl_formbody_submit .tl_submit{background:var(--form-bg)}.tl_panel .tl_submit:hover,.tl_version_panel .tl_submit:hover,.tl_formbody_submit .tl_submit:hover{background:var(--form-bg-hover)}a.tl_submit{display:inline-block}.split-button{display:inline-block;position:relative;z-index:1;vertical-align:middle}.split-button ul,.split-button li{margin:0;padding:0;list-style:none}::-moz-placeholder{padding-top:1px}::-webkit-input-placeholder{padding-top:1px}.clr{clear:both;width:calc(100% - 30px)}.clr:not(.widget){width:100%}.clr:before{content:"";display:table}.w50{width:calc(50% - 30px);float:left;min-height:80px}.long{width:calc(100% - 30px)}.wizard>a{position:relative;top:-2px;vertical-align:middle}.wizard .tl_text,.wizard .tl_select{width:calc(100% - 24px)}.wizard .tl_text_2{width:45%}.wizard img{margin-left:4px}.long .tl_text,.long .tl_select{width:100%}.m12{margin:0 15px;padding:18px 0 16px}.cbx{min-height:46px}.cbx.m12{min-height:80px;box-sizing:border-box}.subpal{clear:both}.inline div{display:inline}.autoheight{height:auto}.dcapicker .tl_text{padding-right:26px}.tl_tip{height:15px;overflow:hidden;cursor:help}.tip{position:relative;max-width:320px;padding:6px 9px;border-radius:2px;background:var(--invert-bg);z-index:99}.tip div{line-height:1.3}.tip div,.tip a,.tip span{color:var(--invert-text)}.tip:before{content:"";height:6px;position:absolute;top:-13px;left:9px;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid var(--invert-bg)}.tip--rtl:before{left:auto;right:9px}.hover-div:hover,.hover-row:hover td,.hover-div:hover .limit_toggler,.hover-row:hover .limit_toggler{background-color:var(--hover-row)!important}.badge-title{float:right;margin-left:8px;margin-top:-8px;border-radius:8px;padding:2px 5px;background:var(--invert-bg);color:var(--invert-text);font-size:.75rem;font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.badge-title{font-weight:500}}@media (min-width:1280px){#sbtog{display:none}.split-button ul{display:inline-flex;clip:initial;height:auto;margin:0 0 0 -4px;overflow:initial;position:initial;width:auto}.split-button li{margin-left:4px}}@media (max-width:1279px){.split-button{display:inline-flex}.split-button ul{position:absolute;right:0;bottom:20px;min-width:100%;background:var(--form-bg);border:1px solid var(--form-border);border-radius:2px;box-sizing:border-box;padding:3px 0;margin-bottom:1em}.split-button ul button{border:0;width:100%;text-align:left;white-space:nowrap}.split-button ul .tl_submit{margin-top:0;margin-bottom:0;background:var(--form-bg)}.split-button ul .tl_submit:hover{background:var(--form-button-hover)}.split-button ul:before{content:"";display:block;height:0;width:0;position:absolute;right:4px;bottom:-12px;z-index:89;border:6px inset transparent;border-top:6px solid var(--form-bg)}.split-button ul:after{content:"";display:block;height:0;width:0;position:absolute;right:3px;bottom:-14px;z-index:88;border:7px inset transparent;border-top:7px solid var(--form-border)}.split-button>button[type=submit]{position:relative;border-radius:2px 0 0 2px}.split-button>button[type=button]{height:30px;margin:2px 0;padding:7px 4px;background:var(--form-bg);border:1px solid var(--form-border);border-left:0;border-radius:0 2px 2px 0;box-sizing:border-box;transition:background .2s ease}.split-button>button[type=button].active,.split-button>button[type=button]:hover{background:var(--form-button-hover)}.split-button>button[type=button]:focus{outline:0}}@media (max-width:767px){.w50{float:none;width:calc(100% - 30px)}.m12{padding-top:0;padding-bottom:0}.cbx,.cbx.m12{min-height:auto}.tip{max-width:80vw}.tl_checkbox_container .tl_checkbox{margin-top:1px;margin-bottom:1px}} \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/diff.css b/core-bundle/contao/themes/flexible/diff.css index eb3af539c87..6ebb487746f 100644 --- a/core-bundle/contao/themes/flexible/diff.css +++ b/core-bundle/contao/themes/flexible/diff.css @@ -17,7 +17,7 @@ h2 { margin: 0; padding: 4px 6px; background: var(--tree-header); - border-bottom: 1px solid var(--panel-border); + border-bottom: 1px solid var(--tree-header-border); font-size: .875rem; } @@ -56,27 +56,25 @@ h2 { /* Diff */ #diff .change { margin-bottom: 1em; - border: 1px solid var(--panel-border); + border: 1px solid var(--border); background: var(--table-odd); border-radius: 2px; } #diff .replace.left, #diff .delete.left { - background: var(--diff-left-bg); + background: var(--diff-left); } #diff .replace.right, #diff .insert.right { - background: var(--diff-right-bg); + background: var(--diff-right); } #diff .replace ins { - color: var(--diff-ins); - background: var(--diff-ins-bg); + background: var(--diff-ins); } #diff .replace del { - color: var(--diff-del); - background: var(--diff-del-bg); + background: var(--diff-del); } #diff ins, #diff del { @@ -92,6 +90,7 @@ h2 { #diff dt, #diff dd { margin: 0; padding: 0 6px; + word-break: break-word; line-height: 1.25; } diff --git a/core-bundle/contao/themes/flexible/diff.min.css b/core-bundle/contao/themes/flexible/diff.min.css index 4e47ead9e9b..c6058988c5a 100644 --- a/core-bundle/contao/themes/flexible/diff.min.css +++ b/core-bundle/contao/themes/flexible/diff.min.css @@ -1 +1 @@ -body{background:var(--content-bg);padding:12px}h2{margin:0;padding:4px 6px;background:var(--tree-header);border-bottom:1px solid var(--panel-border);font-size:.875rem}.formbody{margin:12px 0 18px;text-align:right}.formbody .tl_select{width:42%;max-width:280px}.formbody .tl_submit{padding-top:5px;padding-bottom:6px}.formbody .arrow{vertical-align:middle}.formbody .static-version{margin-right:3px}.tl_info{padding:6px 6px 6px 28px;border-radius:2px;background:url(icons/show.svg) no-repeat left center;color:var(--blue);line-height:1.2}#diff .change{margin-bottom:1em;border:1px solid var(--panel-border);background:var(--table-odd);border-radius:2px}#diff .replace.left,#diff .delete.left{background:var(--diff-left-bg)}#diff .replace.right,#diff .insert.right{background:var(--diff-right-bg)}#diff .replace ins{color:var(--diff-ins);background:var(--diff-ins-bg)}#diff .replace del{color:var(--diff-del);background:var(--diff-del-bg)}#diff ins,#diff del{text-decoration:none}#diff dl{margin:0;padding:0;font:.75rem "Roboto Mono",monospace}#diff dt,#diff dd{margin:0;padding:0 6px;line-height:1.25}#diff dl dt:first-of-type,#diff dl dd:first-of-type{padding-top:3px}#diff dl dt:last-of-type,#diff dl dd:last-of-type{padding-bottom:3px} \ No newline at end of file +body{background:var(--content-bg);padding:12px}h2{margin:0;padding:4px 6px;background:var(--tree-header);border-bottom:1px solid var(--tree-header-border);font-size:.875rem}.formbody{margin:12px 0 18px;text-align:right}.formbody .tl_select{width:42%;max-width:280px}.formbody .tl_submit{padding-top:5px;padding-bottom:6px}.formbody .arrow{vertical-align:middle}.formbody .static-version{margin-right:3px}.tl_info{padding:6px 6px 6px 28px;border-radius:2px;background:url(icons/show.svg) no-repeat left center;color:var(--blue);line-height:1.2}#diff .change{margin-bottom:1em;border:1px solid var(--border);background:var(--table-odd);border-radius:2px}#diff .replace.left,#diff .delete.left{background:var(--diff-left)}#diff .replace.right,#diff .insert.right{background:var(--diff-right)}#diff .replace ins{background:var(--diff-ins)}#diff .replace del{background:var(--diff-del)}#diff ins,#diff del{text-decoration:none}#diff dl{margin:0;padding:0;font:.75rem "Roboto Mono",monospace}#diff dt,#diff dd{margin:0;padding:0 6px;word-break:break-word;line-height:1.25}#diff dl dt:first-of-type,#diff dl dd:first-of-type{padding-top:3px}#diff dl dt:last-of-type,#diff dl dd:last-of-type{padding-bottom:3px} \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/help.css b/core-bundle/contao/themes/flexible/help.css index 9764cf64ce8..b5f59f1aeb9 100644 --- a/core-bundle/contao/themes/flexible/help.css +++ b/core-bundle/contao/themes/flexible/help.css @@ -30,7 +30,7 @@ body { .tl_help_table td { padding: 12px 0; vertical-align: top; - border-bottom: 1px solid var(--panel-border); + border-bottom: 1px solid var(--border); line-height: 1.3; } diff --git a/core-bundle/contao/themes/flexible/help.min.css b/core-bundle/contao/themes/flexible/help.min.css index 642f8464406..29b7029f165 100644 --- a/core-bundle/contao/themes/flexible/help.min.css +++ b/core-bundle/contao/themes/flexible/help.min.css @@ -1 +1 @@ -body{background:var(--content-bg);padding:12px}#main{padding:0 9px}.tl_help_table{width:100%;margin:0 0 18px}.tl_help_table a{text-decoration:underline}.tl_help_table td{padding:12px 0;vertical-align:top;border-bottom:1px solid var(--panel-border);line-height:1.3}.tl_help_table td code{background:var(--code-bg);border-radius:2px;padding:0 1px}.tl_label{width:200px;font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_label{font-weight:500}}td.headline{font-size:1rem;padding-top:36px}tr:first-child td.headline{padding-top:12px}@media (max-width:459px){.tl_help_table{margin-left:0;margin-right:0}} \ No newline at end of file +body{background:var(--content-bg);padding:12px}#main{padding:0 9px}.tl_help_table{width:100%;margin:0 0 18px}.tl_help_table a{text-decoration:underline}.tl_help_table td{padding:12px 0;vertical-align:top;border-bottom:1px solid var(--border);line-height:1.3}.tl_help_table td code{background:var(--code-bg);border-radius:2px;padding:0 1px}.tl_label{width:200px;font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_label{font-weight:500}}td.headline{font-size:1rem;padding-top:36px}tr:first-child td.headline{padding-top:12px}@media (max-width:459px){.tl_help_table{margin-left:0;margin-right:0}} \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/hover.js b/core-bundle/contao/themes/flexible/hover.js index 2bf823e22dd..5cab5f95595 100644 --- a/core-bundle/contao/themes/flexible/hover.js +++ b/core-bundle/contao/themes/flexible/hover.js @@ -6,7 +6,7 @@ * @license LGPL-3.0-or-later */ -var Theme = { +window.Theme = { /** * Check for WebKit @@ -209,16 +209,15 @@ var Theme = { * Hide the menu on scroll */ hideMenuOnScroll: function() { - if (!$('header')) { - return; - } + var header = $('header'); + if (!header) return; var wh = window.getSize().y, dh = window.getScrollSize().y - wh, anchor = 0; if (!('ontouchmove' in window) || wh >= dh) { - $('header').removeClass('down'); + header.removeClass('down'); return; } @@ -229,16 +228,16 @@ var Theme = { if (Math.abs(anchor - ws) < 20) return; if (ws > 0 && ws > anchor) { - $('header').addClass('down'); + header.addClass('down'); } else { - $('header').removeClass('down'); + header.removeClass('down'); } anchor = ws; }) .addEvent('scroll', function() { if (window.getScroll().y < 1) { - $('header').removeClass('down'); + header.removeClass('down'); } }) ; diff --git a/core-bundle/contao/themes/flexible/hover.min.js b/core-bundle/contao/themes/flexible/hover.min.js index b7e7cbdb406..a40c356117e 100644 --- a/core-bundle/contao/themes/flexible/hover.min.js +++ b/core-bundle/contao/themes/flexible/hover.min.js @@ -1 +1 @@ -var Theme={isWebkit:Browser.chrome||Browser.safari||navigator.userAgent.match(/(?:webkit|khtml)/i),stopClickPropagation:function(){$$(".picker_selector").each((function(e){e.getElements("a").each((function(e){e.addEvent("click",(function(e){e.stopPropagation()}))}))})),$$(".picker_selector,.click2edit").each((function(e){e.getElements('input[type="checkbox"]').each((function(e){e.addEvent("click",(function(e){e.stopPropagation()}))}))}))},setupCtrlClick:function(){$$(".click2edit").each((function(e){e.getElements("a").each((function(e){e.addEvent("click",(function(e){e.stopPropagation()}))})),Browser.Features.Touch?e.addEvent("click",(function(){e.getAttribute("data-visited")?(e.getElements("a").each((function(e){e.hasClass("edit")&&(document.location.href=e.href)})),e.removeAttribute("data-visited")):e.setAttribute("data-visited","1")})):e.addEvent("click",(function(t){(Browser.Platform.mac?t.event.metaKey:t.event.ctrlKey)&&(t.event.shiftKey?e.getElements("a").each((function(e){e.hasClass("children")&&(document.location.href=e.href)})):e.getElements("a").each((function(e){e.hasClass("edit")&&(document.location.href=e.href)})))}))}))},setupTextareaResizing:function(){$$(".tl_textarea").each((function(e){if(!(Browser.ie6||Browser.ie7||Browser.ie8||e.hasClass("noresize")||e.retrieve("autogrow"))){var t=new Element("div",{html:"X",styles:{position:"absolute",top:0,left:"-999em","overflow-x":"hidden"}}).setStyles(e.getStyles("font-size","font-family","width","line-height")).inject(document.body);"border-box"!=e.getStyle("-moz-box-sizing")&&"border-box"!=e.getStyle("-webkit-box-sizing")&&"border-box"!=e.getStyle("box-sizing")||t.setStyles({padding:e.getStyle("padding"),border:e.getStyle("border-left")});var n=Math.max(t.clientHeight,30);e.addEvent("input",(function(){t.set("html",this.get("value").replace(//g,">").replace(/\n|\r\n/g,"
X"));var e=Math.max(n,t.getSize().y);this.clientHeight!=e&&this.tween("height",e)})).set("tween",{duration:100}).setStyle("height",n+"px"),e.fireEvent("input"),e.store("autogrow",!0)}}))},setupMenuToggle:function(){var e=$("burger");if(e&&(e.addEvent("click",(function(){document.body.toggleClass("show-navigation"),e.setAttribute("aria-expanded",document.body.hasClass("show-navigation")?"true":"false")})).addEvent("keydown",(function(e){27==e.event.keyCode&&document.body.removeClass("show-navigation")})),window.matchMedia)){var t=window.matchMedia("(max-width:991px)"),n=function(){t.matches?(e.setAttribute("aria-controls","left"),e.setAttribute("aria-expanded",document.body.hasClass("show-navigation")?"true":"false")):(e.removeAttribute("aria-controls"),e.removeAttribute("aria-expanded"))};t.addEventListener("change",n),n()}},setupProfileToggle:function(){var e=$("tmenu");if(e){var t=e.getElement(".submenu"),n=t.getFirst("span").getFirst("button"),i=t.getFirst("ul");t&&n&&i&&(n.setAttribute("aria-controls","tmenu__profile"),n.setAttribute("aria-expanded","false"),i.id="tmenu__profile",n.addEvent("click",(function(e){t.hasClass("active")?(t.removeClass("active"),n.setAttribute("aria-expanded","false")):(t.addClass("active"),n.setAttribute("aria-expanded","true")),e.stopPropagation()})),$(document.body).addEvent("click",(function(){t.hasClass("active")&&t.removeClass("active")})))}},hideMenuOnScroll:function(){if($("header")){var e=window.getSize().y,t=window.getScrollSize().y-e,n=0;!("ontouchmove"in window)||e>=t?$("header").removeClass("down"):window.addEvent("touchmove",(function(){var e=window.getScroll().y;Math.abs(n-e)<20||(e>0&&e>n?$("header").addClass("down"):$("header").removeClass("down"),n=e)})).addEvent("scroll",(function(){window.getScroll().y<1&&$("header").removeClass("down")}))}},setupSplitButtonToggle:function(){var e=$("sbtog");if(e){var t,n,i=e.getParent(".split-button").getElement("ul");e.addEvent("click",(function(n){t=!1,i.toggleClass("invisible"),e.toggleClass("active"),n.stopPropagation()})),$(document.body).addEvent("click",(function(){t=!1,i.addClass("invisible"),e.removeClass("active")})),$(document.body).addEvent("keydown",(function(e){t=9==e.event.keyCode})),[e].append(i.getElements("button")).each((function(a){a.addEvent("focus",(function(){t&&(i.removeClass("invisible"),e.addClass("active"),clearTimeout(n))})),a.addEvent("blur",(function(){t&&(n=setTimeout((function(){i.addClass("invisible"),e.removeClass("active")}),100))}))})),e.set("tabindex","-1")}}};window.addEvent("domready",(function(){Theme.stopClickPropagation(),Theme.setupCtrlClick(),Theme.setupTextareaResizing(),Theme.setupMenuToggle(),Theme.setupProfileToggle(),Theme.hideMenuOnScroll(),Theme.setupSplitButtonToggle()})),window.addEvent("ajax_change",(function(){Theme.stopClickPropagation(),Theme.setupCtrlClick(),Theme.setupTextareaResizing()})); \ No newline at end of file +window.Theme={isWebkit:Browser.chrome||Browser.safari||navigator.userAgent.match(/(?:webkit|khtml)/i),stopClickPropagation:function(){$$(".picker_selector").each((function(e){e.getElements("a").each((function(e){e.addEvent("click",(function(e){e.stopPropagation()}))}))})),$$(".picker_selector,.click2edit").each((function(e){e.getElements('input[type="checkbox"]').each((function(e){e.addEvent("click",(function(e){e.stopPropagation()}))}))}))},setupCtrlClick:function(){$$(".click2edit").each((function(e){e.getElements("a").each((function(e){e.addEvent("click",(function(e){e.stopPropagation()}))})),Browser.Features.Touch?e.addEvent("click",(function(){e.getAttribute("data-visited")?(e.getElements("a").each((function(e){e.hasClass("edit")&&(document.location.href=e.href)})),e.removeAttribute("data-visited")):e.setAttribute("data-visited","1")})):e.addEvent("click",(function(t){(Browser.Platform.mac?t.event.metaKey:t.event.ctrlKey)&&(t.event.shiftKey?e.getElements("a").each((function(e){e.hasClass("children")&&(document.location.href=e.href)})):e.getElements("a").each((function(e){e.hasClass("edit")&&(document.location.href=e.href)})))}))}))},setupTextareaResizing:function(){$$(".tl_textarea").each((function(e){if(!(Browser.ie6||Browser.ie7||Browser.ie8||e.hasClass("noresize")||e.retrieve("autogrow"))){var t=new Element("div",{html:"X",styles:{position:"absolute",top:0,left:"-999em","overflow-x":"hidden"}}).setStyles(e.getStyles("font-size","font-family","width","line-height")).inject(document.body);"border-box"!=e.getStyle("-moz-box-sizing")&&"border-box"!=e.getStyle("-webkit-box-sizing")&&"border-box"!=e.getStyle("box-sizing")||t.setStyles({padding:e.getStyle("padding"),border:e.getStyle("border-left")});var n=Math.max(t.clientHeight,30);e.addEvent("input",(function(){t.set("html",this.get("value").replace(//g,">").replace(/\n|\r\n/g,"
X"));var e=Math.max(n,t.getSize().y);this.clientHeight!=e&&this.tween("height",e)})).set("tween",{duration:100}).setStyle("height",n+"px"),e.fireEvent("input"),e.store("autogrow",!0)}}))},setupMenuToggle:function(){var e=$("burger");if(e&&(e.addEvent("click",(function(){document.body.toggleClass("show-navigation"),e.setAttribute("aria-expanded",document.body.hasClass("show-navigation")?"true":"false")})).addEvent("keydown",(function(e){27==e.event.keyCode&&document.body.removeClass("show-navigation")})),window.matchMedia)){var t=window.matchMedia("(max-width:991px)"),n=function(){t.matches?(e.setAttribute("aria-controls","left"),e.setAttribute("aria-expanded",document.body.hasClass("show-navigation")?"true":"false")):(e.removeAttribute("aria-controls"),e.removeAttribute("aria-expanded"))};t.addEventListener("change",n),n()}},setupProfileToggle:function(){var e=$("tmenu");if(e){var t=e.getElement(".submenu"),n=t.getFirst("span").getFirst("button"),i=t.getFirst("ul");t&&n&&i&&(n.setAttribute("aria-controls","tmenu__profile"),n.setAttribute("aria-expanded","false"),i.id="tmenu__profile",n.addEvent("click",(function(e){t.hasClass("active")?(t.removeClass("active"),n.setAttribute("aria-expanded","false")):(t.addClass("active"),n.setAttribute("aria-expanded","true")),e.stopPropagation()})),$(document.body).addEvent("click",(function(){t.hasClass("active")&&t.removeClass("active")})))}},hideMenuOnScroll:function(){var e=$("header");if(e){var t=window.getSize().y,n=window.getScrollSize().y-t,i=0;!("ontouchmove"in window)||t>=n?e.removeClass("down"):window.addEvent("touchmove",(function(){var t=window.getScroll().y;Math.abs(i-t)<20||(t>0&&t>i?e.addClass("down"):e.removeClass("down"),i=t)})).addEvent("scroll",(function(){window.getScroll().y<1&&e.removeClass("down")}))}},setupSplitButtonToggle:function(){var e=$("sbtog");if(e){var t,n,i=e.getParent(".split-button").getElement("ul");e.addEvent("click",(function(n){t=!1,i.toggleClass("invisible"),e.toggleClass("active"),n.stopPropagation()})),$(document.body).addEvent("click",(function(){t=!1,i.addClass("invisible"),e.removeClass("active")})),$(document.body).addEvent("keydown",(function(e){t=9==e.event.keyCode})),[e].append(i.getElements("button")).each((function(o){o.addEvent("focus",(function(){t&&(i.removeClass("invisible"),e.addClass("active"),clearTimeout(n))})),o.addEvent("blur",(function(){t&&(n=setTimeout((function(){i.addClass("invisible"),e.removeClass("active")}),100))}))})),e.set("tabindex","-1")}}},window.addEvent("domready",(function(){Theme.stopClickPropagation(),Theme.setupCtrlClick(),Theme.setupTextareaResizing(),Theme.setupMenuToggle(),Theme.setupProfileToggle(),Theme.hideMenuOnScroll(),Theme.setupSplitButtonToggle()})),window.addEvent("ajax_change",(function(){Theme.stopClickPropagation(),Theme.setupCtrlClick(),Theme.setupTextareaResizing()})); \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/1cl.svg b/core-bundle/contao/themes/flexible/icons-dark/1cl.svg new file mode 100644 index 00000000000..61298263a77 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/1cl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/1rw.svg b/core-bundle/contao/themes/flexible/icons-dark/1rw.svg new file mode 100644 index 00000000000..61298263a77 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/1rw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/2cll.svg b/core-bundle/contao/themes/flexible/icons-dark/2cll.svg new file mode 100644 index 00000000000..190888eee45 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/2cll.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/2clr.svg b/core-bundle/contao/themes/flexible/icons-dark/2clr.svg new file mode 100644 index 00000000000..583a45fcd26 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/2clr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/2rwf.svg b/core-bundle/contao/themes/flexible/icons-dark/2rwf.svg new file mode 100644 index 00000000000..a2c690582f1 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/2rwf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/2rwh.svg b/core-bundle/contao/themes/flexible/icons-dark/2rwh.svg new file mode 100644 index 00000000000..6a20e027d71 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/2rwh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/3cl.svg b/core-bundle/contao/themes/flexible/icons-dark/3cl.svg new file mode 100644 index 00000000000..b911bbbe4d7 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/3cl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/3rw.svg b/core-bundle/contao/themes/flexible/icons-dark/3rw.svg new file mode 100644 index 00000000000..0112650627a --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/3rw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/above.svg b/core-bundle/contao/themes/flexible/icons-dark/above.svg new file mode 100644 index 00000000000..091a080e5fa --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/above.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/article.svg b/core-bundle/contao/themes/flexible/icons-dark/article.svg new file mode 100644 index 00000000000..def29ce2186 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/article.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/article_.svg b/core-bundle/contao/themes/flexible/icons-dark/article_.svg new file mode 100644 index 00000000000..85a898464ae --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/article_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/articles.svg b/core-bundle/contao/themes/flexible/icons-dark/articles.svg new file mode 100644 index 00000000000..0c054d55883 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/articles.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/articles_1.svg b/core-bundle/contao/themes/flexible/icons-dark/articles_1.svg new file mode 100644 index 00000000000..30ee316b095 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/articles_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/articles_2.svg b/core-bundle/contao/themes/flexible/icons-dark/articles_2.svg new file mode 100644 index 00000000000..63d5d33eb91 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/articles_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/articles_3.svg b/core-bundle/contao/themes/flexible/icons-dark/articles_3.svg new file mode 100644 index 00000000000..751bd6c7a87 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/articles_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/below.svg b/core-bundle/contao/themes/flexible/icons-dark/below.svg new file mode 100644 index 00000000000..5632cbec8f8 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/below.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/children_.svg b/core-bundle/contao/themes/flexible/icons-dark/children_.svg new file mode 100644 index 00000000000..fbd353f5fbf --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/children_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/color-scheme_small.svg b/core-bundle/contao/themes/flexible/icons-dark/color-scheme_small.svg new file mode 100644 index 00000000000..1b2e35df496 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/color-scheme_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/copy_.svg b/core-bundle/contao/themes/flexible/icons-dark/copy_.svg new file mode 100644 index 00000000000..dd78dce369a --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/copy_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/copychilds.svg b/core-bundle/contao/themes/flexible/icons-dark/copychilds.svg new file mode 100644 index 00000000000..63d3f406490 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/copychilds.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/copychilds_.svg b/core-bundle/contao/themes/flexible/icons-dark/copychilds_.svg new file mode 100644 index 00000000000..2353ad397bb --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/copychilds_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/cssimport.svg b/core-bundle/contao/themes/flexible/icons-dark/cssimport.svg new file mode 100644 index 00000000000..5a4b29d0fb4 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/cssimport.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/cut_.svg b/core-bundle/contao/themes/flexible/icons-dark/cut_.svg new file mode 100644 index 00000000000..ee1a1069857 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/cut_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/delete_.svg b/core-bundle/contao/themes/flexible/icons-dark/delete_.svg new file mode 100644 index 00000000000..1a01354424d --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/delete_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/diff.svg b/core-bundle/contao/themes/flexible/icons-dark/diff.svg new file mode 100644 index 00000000000..33b23aa8c6f --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/diff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/diffTemplate.svg b/core-bundle/contao/themes/flexible/icons-dark/diffTemplate.svg new file mode 100644 index 00000000000..9b999e82112 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/diffTemplate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/diffTemplate_.svg b/core-bundle/contao/themes/flexible/icons-dark/diffTemplate_.svg new file mode 100644 index 00000000000..42efe721a60 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/diffTemplate_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/diff_.svg b/core-bundle/contao/themes/flexible/icons-dark/diff_.svg new file mode 100644 index 00000000000..082a4307eae --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/diff_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/drag.svg b/core-bundle/contao/themes/flexible/icons-dark/drag.svg new file mode 100644 index 00000000000..cca0f7ff0db --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/edit_.svg b/core-bundle/contao/themes/flexible/icons-dark/edit_.svg new file mode 100644 index 00000000000..4a66de2509c --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/edit_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/editor.svg b/core-bundle/contao/themes/flexible/icons-dark/editor.svg new file mode 100644 index 00000000000..83274f4616b --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/editor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/editor_.svg b/core-bundle/contao/themes/flexible/icons-dark/editor_.svg new file mode 100644 index 00000000000..f088e2dc36c --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/editor_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/exit.svg b/core-bundle/contao/themes/flexible/icons-dark/exit.svg new file mode 100644 index 00000000000..87fd2fdf7fc --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/favorites.svg b/core-bundle/contao/themes/flexible/icons-dark/favorites.svg new file mode 100644 index 00000000000..5ef767df912 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/favorites.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/favorites_small.svg b/core-bundle/contao/themes/flexible/icons-dark/favorites_small.svg new file mode 100644 index 00000000000..c8f3d6c7637 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/favorites_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/featured.svg b/core-bundle/contao/themes/flexible/icons-dark/featured.svg new file mode 100644 index 00000000000..7d123d735bc --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/featured.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/featured_.svg b/core-bundle/contao/themes/flexible/icons-dark/featured_.svg new file mode 100644 index 00000000000..aea1ab38977 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/featured_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/feed_1.svg b/core-bundle/contao/themes/flexible/icons-dark/feed_1.svg new file mode 100644 index 00000000000..8b1535e3b5f --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/feed_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/feed_3.svg b/core-bundle/contao/themes/flexible/icons-dark/feed_3.svg new file mode 100644 index 00000000000..bb096c1d3bb --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/feed_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/folMinus.svg b/core-bundle/contao/themes/flexible/icons-dark/folMinus.svg new file mode 100644 index 00000000000..60a41b5029a --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/folMinus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/folPlus.svg b/core-bundle/contao/themes/flexible/icons-dark/folPlus.svg new file mode 100644 index 00000000000..97a4dcd15db --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/folPlus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/folderC.svg b/core-bundle/contao/themes/flexible/icons-dark/folderC.svg new file mode 100644 index 00000000000..bb0f1a0c4f7 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/folderC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/folderCP.svg b/core-bundle/contao/themes/flexible/icons-dark/folderCP.svg new file mode 100644 index 00000000000..c9142cc1295 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/folderCP.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/forward.svg b/core-bundle/contao/themes/flexible/icons-dark/forward.svg new file mode 100644 index 00000000000..ef67d34f5de --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/forward_1.svg b/core-bundle/contao/themes/flexible/icons-dark/forward_1.svg new file mode 100644 index 00000000000..372e07e229f --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/forward_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/forward_2.svg b/core-bundle/contao/themes/flexible/icons-dark/forward_2.svg new file mode 100644 index 00000000000..955327b7142 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/forward_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/forward_3.svg b/core-bundle/contao/themes/flexible/icons-dark/forward_3.svg new file mode 100644 index 00000000000..9b3a108a2a7 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/forward_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/forward_4.svg b/core-bundle/contao/themes/flexible/icons-dark/forward_4.svg new file mode 100644 index 00000000000..4a3038fd1eb --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/forward_4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/forward_5.svg b/core-bundle/contao/themes/flexible/icons-dark/forward_5.svg new file mode 100644 index 00000000000..98fe6f0f169 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/forward_5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/forward_6.svg b/core-bundle/contao/themes/flexible/icons-dark/forward_6.svg new file mode 100644 index 00000000000..25910f38f4d --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/forward_6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/forward_7.svg b/core-bundle/contao/themes/flexible/icons-dark/forward_7.svg new file mode 100644 index 00000000000..c2e06567ae7 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/forward_7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/hints.svg b/core-bundle/contao/themes/flexible/icons-dark/hints.svg new file mode 100644 index 00000000000..1157ef714c4 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/hints.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/invisible.svg b/core-bundle/contao/themes/flexible/icons-dark/invisible.svg new file mode 100644 index 00000000000..0063c6f6f0b --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/invisible.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/layout.svg b/core-bundle/contao/themes/flexible/icons-dark/layout.svg new file mode 100644 index 00000000000..d914fb841a8 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/layout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/layout_.svg b/core-bundle/contao/themes/flexible/icons-dark/layout_.svg new file mode 100644 index 00000000000..abbcdece5a1 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/layout_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/left.svg b/core-bundle/contao/themes/flexible/icons-dark/left.svg new file mode 100644 index 00000000000..f201f006ad1 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/logo.svg b/core-bundle/contao/themes/flexible/icons-dark/logo.svg new file mode 100644 index 00000000000..87a061678fa --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/logout.svg b/core-bundle/contao/themes/flexible/icons-dark/logout.svg new file mode 100644 index 00000000000..e182cd7f889 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/logout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/logout_1.svg b/core-bundle/contao/themes/flexible/icons-dark/logout_1.svg new file mode 100644 index 00000000000..60dde9df1d8 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/logout_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/logout_2.svg b/core-bundle/contao/themes/flexible/icons-dark/logout_2.svg new file mode 100644 index 00000000000..c62fdb7d015 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/logout_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/logout_3.svg b/core-bundle/contao/themes/flexible/icons-dark/logout_3.svg new file mode 100644 index 00000000000..969d1807161 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/logout_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/logout_4.svg b/core-bundle/contao/themes/flexible/icons-dark/logout_4.svg new file mode 100644 index 00000000000..17390034fe1 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/logout_4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/logout_5.svg b/core-bundle/contao/themes/flexible/icons-dark/logout_5.svg new file mode 100644 index 00000000000..75111f809b9 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/logout_5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/logout_6.svg b/core-bundle/contao/themes/flexible/icons-dark/logout_6.svg new file mode 100644 index 00000000000..7dba07975ae --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/logout_6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/logout_7.svg b/core-bundle/contao/themes/flexible/icons-dark/logout_7.svg new file mode 100644 index 00000000000..6ac1bf0b726 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/logout_7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/modules_.svg b/core-bundle/contao/themes/flexible/icons-dark/modules_.svg new file mode 100644 index 00000000000..114f9936fc2 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/modules_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/newfolder.svg b/core-bundle/contao/themes/flexible/icons-dark/newfolder.svg new file mode 100644 index 00000000000..bc2caaddcb1 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/newfolder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/parent_.svg b/core-bundle/contao/themes/flexible/icons-dark/parent_.svg new file mode 100644 index 00000000000..fbd353f5fbf --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/parent_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/pasteafter_.svg b/core-bundle/contao/themes/flexible/icons-dark/pasteafter_.svg new file mode 100644 index 00000000000..4e65641e3b3 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/pasteafter_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/pasteinto_.svg b/core-bundle/contao/themes/flexible/icons-dark/pasteinto_.svg new file mode 100644 index 00000000000..4f542868534 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/pasteinto_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/placeholder.svg b/core-bundle/contao/themes/flexible/icons-dark/placeholder.svg new file mode 100644 index 00000000000..b63ffedb2ee --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/placeholder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/profile_small.svg b/core-bundle/contao/themes/flexible/icons-dark/profile_small.svg new file mode 100644 index 00000000000..da2e97e2725 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/profile_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/redirect.svg b/core-bundle/contao/themes/flexible/icons-dark/redirect.svg new file mode 100644 index 00000000000..ed27b2b4039 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/redirect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/redirect_1.svg b/core-bundle/contao/themes/flexible/icons-dark/redirect_1.svg new file mode 100644 index 00000000000..eaaf173c828 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/redirect_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/redirect_2.svg b/core-bundle/contao/themes/flexible/icons-dark/redirect_2.svg new file mode 100644 index 00000000000..b29a810a602 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/redirect_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/redirect_3.svg b/core-bundle/contao/themes/flexible/icons-dark/redirect_3.svg new file mode 100644 index 00000000000..b9952787dc6 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/redirect_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/redirect_4.svg b/core-bundle/contao/themes/flexible/icons-dark/redirect_4.svg new file mode 100644 index 00000000000..91ae43ffd78 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/redirect_4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/redirect_5.svg b/core-bundle/contao/themes/flexible/icons-dark/redirect_5.svg new file mode 100644 index 00000000000..a14c364e1f0 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/redirect_5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/redirect_6.svg b/core-bundle/contao/themes/flexible/icons-dark/redirect_6.svg new file mode 100644 index 00000000000..69065bb9279 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/redirect_6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/redirect_7.svg b/core-bundle/contao/themes/flexible/icons-dark/redirect_7.svg new file mode 100644 index 00000000000..47ef622953f --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/redirect_7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/regular.svg b/core-bundle/contao/themes/flexible/icons-dark/regular.svg new file mode 100644 index 00000000000..90c24633f42 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/regular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/regular_1.svg b/core-bundle/contao/themes/flexible/icons-dark/regular_1.svg new file mode 100644 index 00000000000..dad61dcb449 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/regular_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/regular_2.svg b/core-bundle/contao/themes/flexible/icons-dark/regular_2.svg new file mode 100644 index 00000000000..2fb3c5e9f4a --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/regular_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/regular_3.svg b/core-bundle/contao/themes/flexible/icons-dark/regular_3.svg new file mode 100644 index 00000000000..548c48df289 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/regular_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/regular_4.svg b/core-bundle/contao/themes/flexible/icons-dark/regular_4.svg new file mode 100644 index 00000000000..e52399444b4 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/regular_4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/regular_5.svg b/core-bundle/contao/themes/flexible/icons-dark/regular_5.svg new file mode 100644 index 00000000000..881d6942402 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/regular_5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/regular_6.svg b/core-bundle/contao/themes/flexible/icons-dark/regular_6.svg new file mode 100644 index 00000000000..56f4e99b0ba --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/regular_6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/regular_7.svg b/core-bundle/contao/themes/flexible/icons-dark/regular_7.svg new file mode 100644 index 00000000000..0ba196eaa38 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/regular_7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/right.svg b/core-bundle/contao/themes/flexible/icons-dark/right.svg new file mode 100644 index 00000000000..6386a3f12d7 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/root_1.svg b/core-bundle/contao/themes/flexible/icons-dark/root_1.svg new file mode 100644 index 00000000000..310647f2551 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/root_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/share_.svg b/core-bundle/contao/themes/flexible/icons-dark/share_.svg new file mode 100644 index 00000000000..7c6e59d8744 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/share_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/shield_small.svg b/core-bundle/contao/themes/flexible/icons-dark/shield_small.svg new file mode 100644 index 00000000000..e35836128a5 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/shield_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/sizes.svg b/core-bundle/contao/themes/flexible/icons-dark/sizes.svg new file mode 100644 index 00000000000..8a87df74412 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/sizes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/sizes_.svg b/core-bundle/contao/themes/flexible/icons-dark/sizes_.svg new file mode 100644 index 00000000000..80f25058b7f --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/sizes_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/su_.svg b/core-bundle/contao/themes/flexible/icons-dark/su_.svg new file mode 100644 index 00000000000..9608f1f0ddb --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/su_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/tablewizard.svg b/core-bundle/contao/themes/flexible/icons-dark/tablewizard.svg new file mode 100644 index 00000000000..32200ae6c4d --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/tablewizard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/theme_export.svg b/core-bundle/contao/themes/flexible/icons-dark/theme_export.svg new file mode 100644 index 00000000000..adfc067a44c --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/theme_export.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/theme_export_.svg b/core-bundle/contao/themes/flexible/icons-dark/theme_export_.svg new file mode 100644 index 00000000000..0e4849a7bfc --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/theme_export_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/theme_import.svg b/core-bundle/contao/themes/flexible/icons-dark/theme_import.svg new file mode 100644 index 00000000000..0fe36f69ebd --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/theme_import.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/visible.svg b/core-bundle/contao/themes/flexible/icons-dark/visible.svg new file mode 100644 index 00000000000..348c536e725 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/visible.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons-dark/visible_.svg b/core-bundle/contao/themes/flexible/icons-dark/visible_.svg new file mode 100644 index 00000000000..caef7e1c01c --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons-dark/visible_.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/1cl.svg b/core-bundle/contao/themes/flexible/icons/1cl.svg index e3796700bd7..5263a6e2b7c 100644 --- a/core-bundle/contao/themes/flexible/icons/1cl.svg +++ b/core-bundle/contao/themes/flexible/icons/1cl.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/1rw.svg b/core-bundle/contao/themes/flexible/icons/1rw.svg index e3796700bd7..5263a6e2b7c 100644 --- a/core-bundle/contao/themes/flexible/icons/1rw.svg +++ b/core-bundle/contao/themes/flexible/icons/1rw.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/2cll.svg b/core-bundle/contao/themes/flexible/icons/2cll.svg index 902cb74c849..b0aa2464086 100644 --- a/core-bundle/contao/themes/flexible/icons/2cll.svg +++ b/core-bundle/contao/themes/flexible/icons/2cll.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/2clr.svg b/core-bundle/contao/themes/flexible/icons/2clr.svg index 9254e51b1f3..115213b654a 100644 --- a/core-bundle/contao/themes/flexible/icons/2clr.svg +++ b/core-bundle/contao/themes/flexible/icons/2clr.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/2rwf.svg b/core-bundle/contao/themes/flexible/icons/2rwf.svg index 6871f60d33b..64e108fd907 100644 --- a/core-bundle/contao/themes/flexible/icons/2rwf.svg +++ b/core-bundle/contao/themes/flexible/icons/2rwf.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/2rwh.svg b/core-bundle/contao/themes/flexible/icons/2rwh.svg index 6ce529c3b13..f70f706ecaa 100644 --- a/core-bundle/contao/themes/flexible/icons/2rwh.svg +++ b/core-bundle/contao/themes/flexible/icons/2rwh.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/3cl.svg b/core-bundle/contao/themes/flexible/icons/3cl.svg index 8f5965638a0..52352a595bd 100644 --- a/core-bundle/contao/themes/flexible/icons/3cl.svg +++ b/core-bundle/contao/themes/flexible/icons/3cl.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/3rw.svg b/core-bundle/contao/themes/flexible/icons/3rw.svg index fd3f3f96892..01e7d039465 100644 --- a/core-bundle/contao/themes/flexible/icons/3rw.svg +++ b/core-bundle/contao/themes/flexible/icons/3rw.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/about.svg b/core-bundle/contao/themes/flexible/icons/about.svg deleted file mode 100644 index 4aa6a8adc69..00000000000 --- a/core-bundle/contao/themes/flexible/icons/about.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/above.svg b/core-bundle/contao/themes/flexible/icons/above.svg index 0587db6b274..711bd85c660 100644 --- a/core-bundle/contao/themes/flexible/icons/above.svg +++ b/core-bundle/contao/themes/flexible/icons/above.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/admin.svg b/core-bundle/contao/themes/flexible/icons/admin.svg index 61bdd2b45a8..270a9212828 100644 --- a/core-bundle/contao/themes/flexible/icons/admin.svg +++ b/core-bundle/contao/themes/flexible/icons/admin.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/admin_.svg b/core-bundle/contao/themes/flexible/icons/admin_.svg index f110eaf57b2..7685c056d61 100644 --- a/core-bundle/contao/themes/flexible/icons/admin_.svg +++ b/core-bundle/contao/themes/flexible/icons/admin_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/admin_two_factor.svg b/core-bundle/contao/themes/flexible/icons/admin_two_factor.svg index 1c3523dc782..fdb592234f8 100644 --- a/core-bundle/contao/themes/flexible/icons/admin_two_factor.svg +++ b/core-bundle/contao/themes/flexible/icons/admin_two_factor.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/admin_two_factor_.svg b/core-bundle/contao/themes/flexible/icons/admin_two_factor_.svg index 4209d535c24..78541e5b2a3 100644 --- a/core-bundle/contao/themes/flexible/icons/admin_two_factor_.svg +++ b/core-bundle/contao/themes/flexible/icons/admin_two_factor_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/alias.svg b/core-bundle/contao/themes/flexible/icons/alias.svg index 4e916c61c3e..73d0a925700 100644 --- a/core-bundle/contao/themes/flexible/icons/alias.svg +++ b/core-bundle/contao/themes/flexible/icons/alias.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/all.svg b/core-bundle/contao/themes/flexible/icons/all.svg index 20edf70f0cf..132e9e49252 100644 --- a/core-bundle/contao/themes/flexible/icons/all.svg +++ b/core-bundle/contao/themes/flexible/icons/all.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/arrow_left.svg b/core-bundle/contao/themes/flexible/icons/arrow_left.svg index a9c7191ae9e..41c0e739300 100644 --- a/core-bundle/contao/themes/flexible/icons/arrow_left.svg +++ b/core-bundle/contao/themes/flexible/icons/arrow_left.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/arrow_right.svg b/core-bundle/contao/themes/flexible/icons/arrow_right.svg index 27689365435..7b7c78ef8ae 100644 --- a/core-bundle/contao/themes/flexible/icons/arrow_right.svg +++ b/core-bundle/contao/themes/flexible/icons/arrow_right.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/arrows.svg b/core-bundle/contao/themes/flexible/icons/arrows.svg deleted file mode 100644 index 6f892d574ac..00000000000 --- a/core-bundle/contao/themes/flexible/icons/arrows.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/article.svg b/core-bundle/contao/themes/flexible/icons/article.svg index 4d69ee8f5f7..1f5005bc399 100644 --- a/core-bundle/contao/themes/flexible/icons/article.svg +++ b/core-bundle/contao/themes/flexible/icons/article.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/article_.svg b/core-bundle/contao/themes/flexible/icons/article_.svg index 84014f64b3e..52d5d341baa 100644 --- a/core-bundle/contao/themes/flexible/icons/article_.svg +++ b/core-bundle/contao/themes/flexible/icons/article_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/articles.svg b/core-bundle/contao/themes/flexible/icons/articles.svg index ac753635d29..7cd9899799d 100644 --- a/core-bundle/contao/themes/flexible/icons/articles.svg +++ b/core-bundle/contao/themes/flexible/icons/articles.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/articles_1.svg b/core-bundle/contao/themes/flexible/icons/articles_1.svg index c6ab8074b6e..6e4d5cf2303 100644 --- a/core-bundle/contao/themes/flexible/icons/articles_1.svg +++ b/core-bundle/contao/themes/flexible/icons/articles_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/articles_2.svg b/core-bundle/contao/themes/flexible/icons/articles_2.svg index 4a9e0014622..63a4f2bec07 100644 --- a/core-bundle/contao/themes/flexible/icons/articles_2.svg +++ b/core-bundle/contao/themes/flexible/icons/articles_2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/articles_3.svg b/core-bundle/contao/themes/flexible/icons/articles_3.svg index c5d681afc35..7bb40358bdc 100644 --- a/core-bundle/contao/themes/flexible/icons/articles_3.svg +++ b/core-bundle/contao/themes/flexible/icons/articles_3.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/back.svg b/core-bundle/contao/themes/flexible/icons/back.svg index 1ebbe7c6c98..4a2b1a794f1 100644 --- a/core-bundle/contao/themes/flexible/icons/back.svg +++ b/core-bundle/contao/themes/flexible/icons/back.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/below.svg b/core-bundle/contao/themes/flexible/icons/below.svg index 89ff25cdd64..b5e96cc64f2 100644 --- a/core-bundle/contao/themes/flexible/icons/below.svg +++ b/core-bundle/contao/themes/flexible/icons/below.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/changelog.svg b/core-bundle/contao/themes/flexible/icons/changelog.svg deleted file mode 100644 index 3744b87ff43..00000000000 --- a/core-bundle/contao/themes/flexible/icons/changelog.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/chevron-down.svg b/core-bundle/contao/themes/flexible/icons/chevron-down.svg index 5c54f99e6f5..0bbb7e4395f 100644 --- a/core-bundle/contao/themes/flexible/icons/chevron-down.svg +++ b/core-bundle/contao/themes/flexible/icons/chevron-down.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/children.svg b/core-bundle/contao/themes/flexible/icons/children.svg index ad2216adf1e..c192b9d48d7 100644 --- a/core-bundle/contao/themes/flexible/icons/children.svg +++ b/core-bundle/contao/themes/flexible/icons/children.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/children_.svg b/core-bundle/contao/themes/flexible/icons/children_.svg index f59f9bfc214..2e775d8e67d 100644 --- a/core-bundle/contao/themes/flexible/icons/children_.svg +++ b/core-bundle/contao/themes/flexible/icons/children_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/clipboard.svg b/core-bundle/contao/themes/flexible/icons/clipboard.svg index ebfc94030d7..1f93d738f87 100644 --- a/core-bundle/contao/themes/flexible/icons/clipboard.svg +++ b/core-bundle/contao/themes/flexible/icons/clipboard.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/collapse.svg b/core-bundle/contao/themes/flexible/icons/collapse.svg deleted file mode 100644 index af10d46882d..00000000000 --- a/core-bundle/contao/themes/flexible/icons/collapse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/color-scheme_small.svg b/core-bundle/contao/themes/flexible/icons/color-scheme_small.svg new file mode 100644 index 00000000000..4cc0b215ef9 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons/color-scheme_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/copy.svg b/core-bundle/contao/themes/flexible/icons/copy.svg index d24a9965cc5..65838da07e2 100644 --- a/core-bundle/contao/themes/flexible/icons/copy.svg +++ b/core-bundle/contao/themes/flexible/icons/copy.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/copy_.svg b/core-bundle/contao/themes/flexible/icons/copy_.svg index fe335bde7f3..2e47d7f5a01 100644 --- a/core-bundle/contao/themes/flexible/icons/copy_.svg +++ b/core-bundle/contao/themes/flexible/icons/copy_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/copychilds.svg b/core-bundle/contao/themes/flexible/icons/copychilds.svg index af13a3e5222..2de5481c050 100644 --- a/core-bundle/contao/themes/flexible/icons/copychilds.svg +++ b/core-bundle/contao/themes/flexible/icons/copychilds.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/copychilds_.svg b/core-bundle/contao/themes/flexible/icons/copychilds_.svg index a4c87948e92..a892d5643ec 100644 --- a/core-bundle/contao/themes/flexible/icons/copychilds_.svg +++ b/core-bundle/contao/themes/flexible/icons/copychilds_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/css.svg b/core-bundle/contao/themes/flexible/icons/css.svg deleted file mode 100644 index df43c625b2c..00000000000 --- a/core-bundle/contao/themes/flexible/icons/css.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/css_.svg b/core-bundle/contao/themes/flexible/icons/css_.svg deleted file mode 100644 index 82db8386326..00000000000 --- a/core-bundle/contao/themes/flexible/icons/css_.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/cssimport.svg b/core-bundle/contao/themes/flexible/icons/cssimport.svg index 67c29cf7004..0b940afc897 100644 --- a/core-bundle/contao/themes/flexible/icons/cssimport.svg +++ b/core-bundle/contao/themes/flexible/icons/cssimport.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/cut.svg b/core-bundle/contao/themes/flexible/icons/cut.svg index 71c921fcccc..a5730993681 100644 --- a/core-bundle/contao/themes/flexible/icons/cut.svg +++ b/core-bundle/contao/themes/flexible/icons/cut.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/cut_.svg b/core-bundle/contao/themes/flexible/icons/cut_.svg index 8a777ab98d6..27e75e651ee 100644 --- a/core-bundle/contao/themes/flexible/icons/cut_.svg +++ b/core-bundle/contao/themes/flexible/icons/cut_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/db.svg b/core-bundle/contao/themes/flexible/icons/db.svg deleted file mode 100644 index 73b73848e98..00000000000 --- a/core-bundle/contao/themes/flexible/icons/db.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/delete.svg b/core-bundle/contao/themes/flexible/icons/delete.svg index 394babcbc7b..a133da11a76 100644 --- a/core-bundle/contao/themes/flexible/icons/delete.svg +++ b/core-bundle/contao/themes/flexible/icons/delete.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/deleteAll.svg b/core-bundle/contao/themes/flexible/icons/deleteAll.svg deleted file mode 100644 index d8e62ca3fe0..00000000000 --- a/core-bundle/contao/themes/flexible/icons/deleteAll.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/delete_.svg b/core-bundle/contao/themes/flexible/icons/delete_.svg index 7c83e7fb07c..cbacd3b1de5 100644 --- a/core-bundle/contao/themes/flexible/icons/delete_.svg +++ b/core-bundle/contao/themes/flexible/icons/delete_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/demagnify.svg b/core-bundle/contao/themes/flexible/icons/demagnify.svg index 01c9c22c76f..7c7e59deede 100644 --- a/core-bundle/contao/themes/flexible/icons/demagnify.svg +++ b/core-bundle/contao/themes/flexible/icons/demagnify.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/diff.svg b/core-bundle/contao/themes/flexible/icons/diff.svg index 911c598e5ef..688e60ad3c8 100644 --- a/core-bundle/contao/themes/flexible/icons/diff.svg +++ b/core-bundle/contao/themes/flexible/icons/diff.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/diffTemplate.svg b/core-bundle/contao/themes/flexible/icons/diffTemplate.svg index 04130c911f1..0c53df97811 100644 --- a/core-bundle/contao/themes/flexible/icons/diffTemplate.svg +++ b/core-bundle/contao/themes/flexible/icons/diffTemplate.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/diffTemplate_.svg b/core-bundle/contao/themes/flexible/icons/diffTemplate_.svg index 65a1afbb3e9..c50a5c5fd1d 100644 --- a/core-bundle/contao/themes/flexible/icons/diffTemplate_.svg +++ b/core-bundle/contao/themes/flexible/icons/diffTemplate_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/diff_.svg b/core-bundle/contao/themes/flexible/icons/diff_.svg index 7b4138e8a2d..928d6b1d643 100644 --- a/core-bundle/contao/themes/flexible/icons/diff_.svg +++ b/core-bundle/contao/themes/flexible/icons/diff_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/down.svg b/core-bundle/contao/themes/flexible/icons/down.svg deleted file mode 100644 index 4594e457559..00000000000 --- a/core-bundle/contao/themes/flexible/icons/down.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/drag.svg b/core-bundle/contao/themes/flexible/icons/drag.svg index e15d8521112..4321f99a734 100644 --- a/core-bundle/contao/themes/flexible/icons/drag.svg +++ b/core-bundle/contao/themes/flexible/icons/drag.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/edit.svg b/core-bundle/contao/themes/flexible/icons/edit.svg index 55382bd84e7..34cd8d8f770 100644 --- a/core-bundle/contao/themes/flexible/icons/edit.svg +++ b/core-bundle/contao/themes/flexible/icons/edit.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/edit_.svg b/core-bundle/contao/themes/flexible/icons/edit_.svg index c34ca9a3e05..78925adcae9 100644 --- a/core-bundle/contao/themes/flexible/icons/edit_.svg +++ b/core-bundle/contao/themes/flexible/icons/edit_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/editor.svg b/core-bundle/contao/themes/flexible/icons/editor.svg index 98fd88744be..23676c84563 100644 --- a/core-bundle/contao/themes/flexible/icons/editor.svg +++ b/core-bundle/contao/themes/flexible/icons/editor.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/editor_.svg b/core-bundle/contao/themes/flexible/icons/editor_.svg index 16a1db6d6da..b6633cd172d 100644 --- a/core-bundle/contao/themes/flexible/icons/editor_.svg +++ b/core-bundle/contao/themes/flexible/icons/editor_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/error.svg b/core-bundle/contao/themes/flexible/icons/error.svg index 5fa639fe8d3..f7dfc4e1692 100644 --- a/core-bundle/contao/themes/flexible/icons/error.svg +++ b/core-bundle/contao/themes/flexible/icons/error.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/error_401.svg b/core-bundle/contao/themes/flexible/icons/error_401.svg index 53c765514ae..44890585e6a 100644 --- a/core-bundle/contao/themes/flexible/icons/error_401.svg +++ b/core-bundle/contao/themes/flexible/icons/error_401.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/error_401_1.svg b/core-bundle/contao/themes/flexible/icons/error_401_1.svg index 978675d2e13..5da3cb67b1d 100644 --- a/core-bundle/contao/themes/flexible/icons/error_401_1.svg +++ b/core-bundle/contao/themes/flexible/icons/error_401_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/error_403.svg b/core-bundle/contao/themes/flexible/icons/error_403.svg index 53c765514ae..44890585e6a 100644 --- a/core-bundle/contao/themes/flexible/icons/error_403.svg +++ b/core-bundle/contao/themes/flexible/icons/error_403.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/error_403_1.svg b/core-bundle/contao/themes/flexible/icons/error_403_1.svg index 978675d2e13..5da3cb67b1d 100644 --- a/core-bundle/contao/themes/flexible/icons/error_403_1.svg +++ b/core-bundle/contao/themes/flexible/icons/error_403_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/error_404.svg b/core-bundle/contao/themes/flexible/icons/error_404.svg index 53c765514ae..44890585e6a 100644 --- a/core-bundle/contao/themes/flexible/icons/error_404.svg +++ b/core-bundle/contao/themes/flexible/icons/error_404.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/error_404_1.svg b/core-bundle/contao/themes/flexible/icons/error_404_1.svg index 978675d2e13..5da3cb67b1d 100644 --- a/core-bundle/contao/themes/flexible/icons/error_404_1.svg +++ b/core-bundle/contao/themes/flexible/icons/error_404_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/error_503.svg b/core-bundle/contao/themes/flexible/icons/error_503.svg index 53c765514ae..44890585e6a 100644 --- a/core-bundle/contao/themes/flexible/icons/error_503.svg +++ b/core-bundle/contao/themes/flexible/icons/error_503.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/error_503_1.svg b/core-bundle/contao/themes/flexible/icons/error_503_1.svg index 978675d2e13..5da3cb67b1d 100644 --- a/core-bundle/contao/themes/flexible/icons/error_503_1.svg +++ b/core-bundle/contao/themes/flexible/icons/error_503_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/exit.svg b/core-bundle/contao/themes/flexible/icons/exit.svg new file mode 100644 index 00000000000..bc1c33d1997 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons/exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/exit_dark.svg b/core-bundle/contao/themes/flexible/icons/exit_dark.svg deleted file mode 100644 index 86ca5c3e357..00000000000 --- a/core-bundle/contao/themes/flexible/icons/exit_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/expand.svg b/core-bundle/contao/themes/flexible/icons/expand.svg deleted file mode 100644 index 9dae838c206..00000000000 --- a/core-bundle/contao/themes/flexible/icons/expand.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/expand_.svg b/core-bundle/contao/themes/flexible/icons/expand_.svg deleted file mode 100644 index cd1b18bd29c..00000000000 --- a/core-bundle/contao/themes/flexible/icons/expand_.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/favorites.svg b/core-bundle/contao/themes/flexible/icons/favorites.svg index a62d3d518ba..4e2e371b788 100644 --- a/core-bundle/contao/themes/flexible/icons/favorites.svg +++ b/core-bundle/contao/themes/flexible/icons/favorites.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/favorites_dark.svg b/core-bundle/contao/themes/flexible/icons/favorites_small.svg similarity index 100% rename from core-bundle/contao/themes/flexible/icons/favorites_dark.svg rename to core-bundle/contao/themes/flexible/icons/favorites_small.svg diff --git a/core-bundle/contao/themes/flexible/icons/featured.svg b/core-bundle/contao/themes/flexible/icons/featured.svg index 6533ba10336..6368d34e93a 100644 --- a/core-bundle/contao/themes/flexible/icons/featured.svg +++ b/core-bundle/contao/themes/flexible/icons/featured.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/featured_.svg b/core-bundle/contao/themes/flexible/icons/featured_.svg index ad73f5beee2..502f3a4fcb9 100644 --- a/core-bundle/contao/themes/flexible/icons/featured_.svg +++ b/core-bundle/contao/themes/flexible/icons/featured_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/feed_1.svg b/core-bundle/contao/themes/flexible/icons/feed_1.svg index d3e751b0b42..03538a6589e 100644 --- a/core-bundle/contao/themes/flexible/icons/feed_1.svg +++ b/core-bundle/contao/themes/flexible/icons/feed_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/feed_2.svg b/core-bundle/contao/themes/flexible/icons/feed_2.svg index 2a7a71b991d..9623a85e2d1 100644 --- a/core-bundle/contao/themes/flexible/icons/feed_2.svg +++ b/core-bundle/contao/themes/flexible/icons/feed_2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/feed_3.svg b/core-bundle/contao/themes/flexible/icons/feed_3.svg index 6669caea6bd..3b3aa3d6c67 100644 --- a/core-bundle/contao/themes/flexible/icons/feed_3.svg +++ b/core-bundle/contao/themes/flexible/icons/feed_3.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/filemanager.svg b/core-bundle/contao/themes/flexible/icons/filemanager.svg index e5e0ac0a57c..43f67554168 100644 --- a/core-bundle/contao/themes/flexible/icons/filemanager.svg +++ b/core-bundle/contao/themes/flexible/icons/filemanager.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/filemounts.svg b/core-bundle/contao/themes/flexible/icons/filemounts.svg index 7d4ebee893e..5fa46f42496 100644 --- a/core-bundle/contao/themes/flexible/icons/filemounts.svg +++ b/core-bundle/contao/themes/flexible/icons/filemounts.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/filter-apply.svg b/core-bundle/contao/themes/flexible/icons/filter-apply.svg index ce4790e5784..5a0a56ca3d2 100644 --- a/core-bundle/contao/themes/flexible/icons/filter-apply.svg +++ b/core-bundle/contao/themes/flexible/icons/filter-apply.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/filter-reset.svg b/core-bundle/contao/themes/flexible/icons/filter-reset.svg index 481fbd39488..f94a0db3dbd 100644 --- a/core-bundle/contao/themes/flexible/icons/filter-reset.svg +++ b/core-bundle/contao/themes/flexible/icons/filter-reset.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/flash.svg b/core-bundle/contao/themes/flexible/icons/flash.svg deleted file mode 100644 index edea7a5f49b..00000000000 --- a/core-bundle/contao/themes/flexible/icons/flash.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/folMinus.svg b/core-bundle/contao/themes/flexible/icons/folMinus.svg index 9c637a5dd04..2058bf54abc 100644 --- a/core-bundle/contao/themes/flexible/icons/folMinus.svg +++ b/core-bundle/contao/themes/flexible/icons/folMinus.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/folPlus.svg b/core-bundle/contao/themes/flexible/icons/folPlus.svg index 29e92d022a4..fbd5f321ba0 100644 --- a/core-bundle/contao/themes/flexible/icons/folPlus.svg +++ b/core-bundle/contao/themes/flexible/icons/folPlus.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/folderC.svg b/core-bundle/contao/themes/flexible/icons/folderC.svg index 7b2299f4993..be25265f6b7 100644 --- a/core-bundle/contao/themes/flexible/icons/folderC.svg +++ b/core-bundle/contao/themes/flexible/icons/folderC.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/folderCP.svg b/core-bundle/contao/themes/flexible/icons/folderCP.svg index 2ee6f4fce8f..491c978a4cc 100644 --- a/core-bundle/contao/themes/flexible/icons/folderCP.svg +++ b/core-bundle/contao/themes/flexible/icons/folderCP.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/folderO.svg b/core-bundle/contao/themes/flexible/icons/folderO.svg deleted file mode 100644 index 2856afaf2ca..00000000000 --- a/core-bundle/contao/themes/flexible/icons/folderO.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/folderOP.svg b/core-bundle/contao/themes/flexible/icons/folderOP.svg deleted file mode 100644 index 3ea61ea2031..00000000000 --- a/core-bundle/contao/themes/flexible/icons/folderOP.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/forward.svg b/core-bundle/contao/themes/flexible/icons/forward.svg index ec37852d58b..13a2c409987 100644 --- a/core-bundle/contao/themes/flexible/icons/forward.svg +++ b/core-bundle/contao/themes/flexible/icons/forward.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/forward_1.svg b/core-bundle/contao/themes/flexible/icons/forward_1.svg index ab3ecc2340c..39d06f464b9 100644 --- a/core-bundle/contao/themes/flexible/icons/forward_1.svg +++ b/core-bundle/contao/themes/flexible/icons/forward_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/forward_2.svg b/core-bundle/contao/themes/flexible/icons/forward_2.svg index 9670cac43ed..f401f2c68e0 100644 --- a/core-bundle/contao/themes/flexible/icons/forward_2.svg +++ b/core-bundle/contao/themes/flexible/icons/forward_2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/forward_3.svg b/core-bundle/contao/themes/flexible/icons/forward_3.svg index 1e1706b1b40..28075a37f9d 100644 --- a/core-bundle/contao/themes/flexible/icons/forward_3.svg +++ b/core-bundle/contao/themes/flexible/icons/forward_3.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/forward_4.svg b/core-bundle/contao/themes/flexible/icons/forward_4.svg index c7c95bc2822..d91aeea662b 100644 --- a/core-bundle/contao/themes/flexible/icons/forward_4.svg +++ b/core-bundle/contao/themes/flexible/icons/forward_4.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/forward_5.svg b/core-bundle/contao/themes/flexible/icons/forward_5.svg index 4e4b988098a..98a33080e1d 100644 --- a/core-bundle/contao/themes/flexible/icons/forward_5.svg +++ b/core-bundle/contao/themes/flexible/icons/forward_5.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/forward_6.svg b/core-bundle/contao/themes/flexible/icons/forward_6.svg index 73fe96866b0..accd21db475 100644 --- a/core-bundle/contao/themes/flexible/icons/forward_6.svg +++ b/core-bundle/contao/themes/flexible/icons/forward_6.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/forward_7.svg b/core-bundle/contao/themes/flexible/icons/forward_7.svg index 7583f62557b..b4a780494cb 100644 --- a/core-bundle/contao/themes/flexible/icons/forward_7.svg +++ b/core-bundle/contao/themes/flexible/icons/forward_7.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/group.svg b/core-bundle/contao/themes/flexible/icons/group.svg index 2fa2b98e203..fa847fff29a 100644 --- a/core-bundle/contao/themes/flexible/icons/group.svg +++ b/core-bundle/contao/themes/flexible/icons/group.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/group_.svg b/core-bundle/contao/themes/flexible/icons/group_.svg index 7888873cce9..089c671cc20 100644 --- a/core-bundle/contao/themes/flexible/icons/group_.svg +++ b/core-bundle/contao/themes/flexible/icons/group_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/header.svg b/core-bundle/contao/themes/flexible/icons/header.svg deleted file mode 100644 index 5292511c53c..00000000000 --- a/core-bundle/contao/themes/flexible/icons/header.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/header_.svg b/core-bundle/contao/themes/flexible/icons/header_.svg deleted file mode 100644 index dd37a7a9abe..00000000000 --- a/core-bundle/contao/themes/flexible/icons/header_.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/help.svg b/core-bundle/contao/themes/flexible/icons/help.svg index 0689b2c1e77..4be03d6dd4d 100644 --- a/core-bundle/contao/themes/flexible/icons/help.svg +++ b/core-bundle/contao/themes/flexible/icons/help.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/hints.svg b/core-bundle/contao/themes/flexible/icons/hints.svg index 15738f89d0c..46c679a7d03 100644 --- a/core-bundle/contao/themes/flexible/icons/hints.svg +++ b/core-bundle/contao/themes/flexible/icons/hints.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/important.svg b/core-bundle/contao/themes/flexible/icons/important.svg index 9149748d07c..4e369656e34 100644 --- a/core-bundle/contao/themes/flexible/icons/important.svg +++ b/core-bundle/contao/themes/flexible/icons/important.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/invisible.svg b/core-bundle/contao/themes/flexible/icons/invisible.svg index bfca5e36290..13257113386 100644 --- a/core-bundle/contao/themes/flexible/icons/invisible.svg +++ b/core-bundle/contao/themes/flexible/icons/invisible.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/layout.svg b/core-bundle/contao/themes/flexible/icons/layout.svg index f4204356a3c..bad03feda89 100644 --- a/core-bundle/contao/themes/flexible/icons/layout.svg +++ b/core-bundle/contao/themes/flexible/icons/layout.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/layout_.svg b/core-bundle/contao/themes/flexible/icons/layout_.svg index 585b469e645..4ad32b23a3e 100644 --- a/core-bundle/contao/themes/flexible/icons/layout_.svg +++ b/core-bundle/contao/themes/flexible/icons/layout_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/left.svg b/core-bundle/contao/themes/flexible/icons/left.svg index 2705b442bce..c23c3e2f59f 100644 --- a/core-bundle/contao/themes/flexible/icons/left.svg +++ b/core-bundle/contao/themes/flexible/icons/left.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/loading.svg b/core-bundle/contao/themes/flexible/icons/loading.svg index 44be1b35572..544c75bf7ff 100644 --- a/core-bundle/contao/themes/flexible/icons/loading.svg +++ b/core-bundle/contao/themes/flexible/icons/loading.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/logo.svg b/core-bundle/contao/themes/flexible/icons/logo.svg index 4002ea4fe58..e057c41b605 100644 --- a/core-bundle/contao/themes/flexible/icons/logo.svg +++ b/core-bundle/contao/themes/flexible/icons/logo.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/logout.svg b/core-bundle/contao/themes/flexible/icons/logout.svg index 522202f43c2..86539eb0709 100644 --- a/core-bundle/contao/themes/flexible/icons/logout.svg +++ b/core-bundle/contao/themes/flexible/icons/logout.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/logout_1.svg b/core-bundle/contao/themes/flexible/icons/logout_1.svg index 0c8f8c85ab9..fa5657d04ba 100644 --- a/core-bundle/contao/themes/flexible/icons/logout_1.svg +++ b/core-bundle/contao/themes/flexible/icons/logout_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/logout_2.svg b/core-bundle/contao/themes/flexible/icons/logout_2.svg index 2ae0a985600..0955427ac9d 100644 --- a/core-bundle/contao/themes/flexible/icons/logout_2.svg +++ b/core-bundle/contao/themes/flexible/icons/logout_2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/logout_3.svg b/core-bundle/contao/themes/flexible/icons/logout_3.svg index 90fa411251e..98a1d6b73ec 100644 --- a/core-bundle/contao/themes/flexible/icons/logout_3.svg +++ b/core-bundle/contao/themes/flexible/icons/logout_3.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/logout_4.svg b/core-bundle/contao/themes/flexible/icons/logout_4.svg index cd29dac1d09..46d6a80f14f 100644 --- a/core-bundle/contao/themes/flexible/icons/logout_4.svg +++ b/core-bundle/contao/themes/flexible/icons/logout_4.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/logout_5.svg b/core-bundle/contao/themes/flexible/icons/logout_5.svg index 22b4d12d3d6..01364410a95 100644 --- a/core-bundle/contao/themes/flexible/icons/logout_5.svg +++ b/core-bundle/contao/themes/flexible/icons/logout_5.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/logout_6.svg b/core-bundle/contao/themes/flexible/icons/logout_6.svg index 24cd528f36b..96541290deb 100644 --- a/core-bundle/contao/themes/flexible/icons/logout_6.svg +++ b/core-bundle/contao/themes/flexible/icons/logout_6.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/logout_7.svg b/core-bundle/contao/themes/flexible/icons/logout_7.svg index 5655a5c6c50..de7ff346b52 100644 --- a/core-bundle/contao/themes/flexible/icons/logout_7.svg +++ b/core-bundle/contao/themes/flexible/icons/logout_7.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/magnify.svg b/core-bundle/contao/themes/flexible/icons/magnify.svg index 2a42b9c7ea1..f62fed0c7ff 100644 --- a/core-bundle/contao/themes/flexible/icons/magnify.svg +++ b/core-bundle/contao/themes/flexible/icons/magnify.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/manager.svg b/core-bundle/contao/themes/flexible/icons/manager.svg index 65ff65515c3..db139d10003 100644 --- a/core-bundle/contao/themes/flexible/icons/manager.svg +++ b/core-bundle/contao/themes/flexible/icons/manager.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/member.svg b/core-bundle/contao/themes/flexible/icons/member.svg index 3b148c555d1..a6522ca05b0 100644 --- a/core-bundle/contao/themes/flexible/icons/member.svg +++ b/core-bundle/contao/themes/flexible/icons/member.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/member_.svg b/core-bundle/contao/themes/flexible/icons/member_.svg index ec3811ca197..3f6e3ba3a34 100644 --- a/core-bundle/contao/themes/flexible/icons/member_.svg +++ b/core-bundle/contao/themes/flexible/icons/member_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/member_two_factor.svg b/core-bundle/contao/themes/flexible/icons/member_two_factor.svg index a19f77bae58..a248036b7cc 100644 --- a/core-bundle/contao/themes/flexible/icons/member_two_factor.svg +++ b/core-bundle/contao/themes/flexible/icons/member_two_factor.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/member_two_factor_.svg b/core-bundle/contao/themes/flexible/icons/member_two_factor_.svg index a4852a6a460..8b9c713cdb7 100644 --- a/core-bundle/contao/themes/flexible/icons/member_two_factor_.svg +++ b/core-bundle/contao/themes/flexible/icons/member_two_factor_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/mgroup.svg b/core-bundle/contao/themes/flexible/icons/mgroup.svg index a3f8073fd6f..3fdb60c10ad 100644 --- a/core-bundle/contao/themes/flexible/icons/mgroup.svg +++ b/core-bundle/contao/themes/flexible/icons/mgroup.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/mgroup_.svg b/core-bundle/contao/themes/flexible/icons/mgroup_.svg index b77eca911eb..fd40866dab5 100644 --- a/core-bundle/contao/themes/flexible/icons/mgroup_.svg +++ b/core-bundle/contao/themes/flexible/icons/mgroup_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/modules.svg b/core-bundle/contao/themes/flexible/icons/modules.svg index f85fa6560b5..7943d8dd90a 100644 --- a/core-bundle/contao/themes/flexible/icons/modules.svg +++ b/core-bundle/contao/themes/flexible/icons/modules.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/modules_.svg b/core-bundle/contao/themes/flexible/icons/modules_.svg index 763d96f99f5..4d53c7f030f 100644 --- a/core-bundle/contao/themes/flexible/icons/modules_.svg +++ b/core-bundle/contao/themes/flexible/icons/modules_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/movel.svg b/core-bundle/contao/themes/flexible/icons/movel.svg index 1ebbe7c6c98..4a2b1a794f1 100644 --- a/core-bundle/contao/themes/flexible/icons/movel.svg +++ b/core-bundle/contao/themes/flexible/icons/movel.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/mover.svg b/core-bundle/contao/themes/flexible/icons/mover.svg index 72fe10bbbf7..a47e6caee12 100644 --- a/core-bundle/contao/themes/flexible/icons/mover.svg +++ b/core-bundle/contao/themes/flexible/icons/mover.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/navcol.svg b/core-bundle/contao/themes/flexible/icons/navcol.svg index 1983448ea8d..8886cd57270 100644 --- a/core-bundle/contao/themes/flexible/icons/navcol.svg +++ b/core-bundle/contao/themes/flexible/icons/navcol.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/navexp.svg b/core-bundle/contao/themes/flexible/icons/navexp.svg index c3bd187bb30..4c8928546b4 100644 --- a/core-bundle/contao/themes/flexible/icons/navexp.svg +++ b/core-bundle/contao/themes/flexible/icons/navexp.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/new.svg b/core-bundle/contao/themes/flexible/icons/new.svg index dc7f2b366da..811e5bfc87f 100644 --- a/core-bundle/contao/themes/flexible/icons/new.svg +++ b/core-bundle/contao/themes/flexible/icons/new.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/newfolder.svg b/core-bundle/contao/themes/flexible/icons/newfolder.svg index 802fb109b83..4dde5bb490d 100644 --- a/core-bundle/contao/themes/flexible/icons/newfolder.svg +++ b/core-bundle/contao/themes/flexible/icons/newfolder.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/news.svg b/core-bundle/contao/themes/flexible/icons/news.svg deleted file mode 100644 index 9e86f88bef3..00000000000 --- a/core-bundle/contao/themes/flexible/icons/news.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/ok.svg b/core-bundle/contao/themes/flexible/icons/ok.svg index fb0a51294d6..a709f2b27af 100644 --- a/core-bundle/contao/themes/flexible/icons/ok.svg +++ b/core-bundle/contao/themes/flexible/icons/ok.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/pagemounts.svg b/core-bundle/contao/themes/flexible/icons/pagemounts.svg index 5cb352c474b..71f48aa591a 100644 --- a/core-bundle/contao/themes/flexible/icons/pagemounts.svg +++ b/core-bundle/contao/themes/flexible/icons/pagemounts.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/parent.svg b/core-bundle/contao/themes/flexible/icons/parent.svg index e394d673b97..7767f82c89e 100644 --- a/core-bundle/contao/themes/flexible/icons/parent.svg +++ b/core-bundle/contao/themes/flexible/icons/parent.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/parent_.svg b/core-bundle/contao/themes/flexible/icons/parent_.svg index f59f9bfc214..2e775d8e67d 100644 --- a/core-bundle/contao/themes/flexible/icons/parent_.svg +++ b/core-bundle/contao/themes/flexible/icons/parent_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/pasteafter.svg b/core-bundle/contao/themes/flexible/icons/pasteafter.svg index f38b1c04c25..29efa117e8f 100644 --- a/core-bundle/contao/themes/flexible/icons/pasteafter.svg +++ b/core-bundle/contao/themes/flexible/icons/pasteafter.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/pasteafter_.svg b/core-bundle/contao/themes/flexible/icons/pasteafter_.svg index 5f3662bcf60..8a4b42b5feb 100644 --- a/core-bundle/contao/themes/flexible/icons/pasteafter_.svg +++ b/core-bundle/contao/themes/flexible/icons/pasteafter_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/pasteinto.svg b/core-bundle/contao/themes/flexible/icons/pasteinto.svg index 0d6e22eb3a1..5b1ceed9584 100644 --- a/core-bundle/contao/themes/flexible/icons/pasteinto.svg +++ b/core-bundle/contao/themes/flexible/icons/pasteinto.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/pasteinto_.svg b/core-bundle/contao/themes/flexible/icons/pasteinto_.svg index 77eabff2a1a..a0bafb7f4be 100644 --- a/core-bundle/contao/themes/flexible/icons/pasteinto_.svg +++ b/core-bundle/contao/themes/flexible/icons/pasteinto_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/person.svg b/core-bundle/contao/themes/flexible/icons/person.svg index 8170e9955bc..d499c68691b 100644 --- a/core-bundle/contao/themes/flexible/icons/person.svg +++ b/core-bundle/contao/themes/flexible/icons/person.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/pickcolor.svg b/core-bundle/contao/themes/flexible/icons/pickcolor.svg index 95958a939ee..4a829656b8c 100644 --- a/core-bundle/contao/themes/flexible/icons/pickcolor.svg +++ b/core-bundle/contao/themes/flexible/icons/pickcolor.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/pickfile.svg b/core-bundle/contao/themes/flexible/icons/pickfile.svg index e5e0ac0a57c..43f67554168 100644 --- a/core-bundle/contao/themes/flexible/icons/pickfile.svg +++ b/core-bundle/contao/themes/flexible/icons/pickfile.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/pickpage.svg b/core-bundle/contao/themes/flexible/icons/pickpage.svg index f3f274cf501..b093adc2e1e 100644 --- a/core-bundle/contao/themes/flexible/icons/pickpage.svg +++ b/core-bundle/contao/themes/flexible/icons/pickpage.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/placeholder.svg b/core-bundle/contao/themes/flexible/icons/placeholder.svg index b57ee2f7846..0cd3dd6e494 100644 --- a/core-bundle/contao/themes/flexible/icons/placeholder.svg +++ b/core-bundle/contao/themes/flexible/icons/placeholder.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/profile.svg b/core-bundle/contao/themes/flexible/icons/profile.svg index 05b5053f0d5..bb2f18121a5 100644 --- a/core-bundle/contao/themes/flexible/icons/profile.svg +++ b/core-bundle/contao/themes/flexible/icons/profile.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/profile_dark.svg b/core-bundle/contao/themes/flexible/icons/profile_dark.svg deleted file mode 100644 index f641b1ab48c..00000000000 --- a/core-bundle/contao/themes/flexible/icons/profile_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/profile_small.svg b/core-bundle/contao/themes/flexible/icons/profile_small.svg new file mode 100644 index 00000000000..614c1cf4be6 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons/profile_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/protected.svg b/core-bundle/contao/themes/flexible/icons/protected.svg new file mode 100644 index 00000000000..824022d1c23 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons/protected.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/published.svg b/core-bundle/contao/themes/flexible/icons/published.svg deleted file mode 100644 index 1daa6db3e29..00000000000 --- a/core-bundle/contao/themes/flexible/icons/published.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/redirect.svg b/core-bundle/contao/themes/flexible/icons/redirect.svg index 42358f0fa9f..c3389cee25c 100644 --- a/core-bundle/contao/themes/flexible/icons/redirect.svg +++ b/core-bundle/contao/themes/flexible/icons/redirect.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/redirect_1.svg b/core-bundle/contao/themes/flexible/icons/redirect_1.svg index 786c65c8657..6169f71eb17 100644 --- a/core-bundle/contao/themes/flexible/icons/redirect_1.svg +++ b/core-bundle/contao/themes/flexible/icons/redirect_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/redirect_2.svg b/core-bundle/contao/themes/flexible/icons/redirect_2.svg index 9d6dc0fd76a..45be95ed25b 100644 --- a/core-bundle/contao/themes/flexible/icons/redirect_2.svg +++ b/core-bundle/contao/themes/flexible/icons/redirect_2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/redirect_3.svg b/core-bundle/contao/themes/flexible/icons/redirect_3.svg index b679bbbc683..cef6dd8494c 100644 --- a/core-bundle/contao/themes/flexible/icons/redirect_3.svg +++ b/core-bundle/contao/themes/flexible/icons/redirect_3.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/redirect_4.svg b/core-bundle/contao/themes/flexible/icons/redirect_4.svg index 6975bc5547d..3820998388a 100644 --- a/core-bundle/contao/themes/flexible/icons/redirect_4.svg +++ b/core-bundle/contao/themes/flexible/icons/redirect_4.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/redirect_5.svg b/core-bundle/contao/themes/flexible/icons/redirect_5.svg index 2f70af7781a..2f413ccbe95 100644 --- a/core-bundle/contao/themes/flexible/icons/redirect_5.svg +++ b/core-bundle/contao/themes/flexible/icons/redirect_5.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/redirect_6.svg b/core-bundle/contao/themes/flexible/icons/redirect_6.svg index 4d3ad0b0713..c591037873c 100644 --- a/core-bundle/contao/themes/flexible/icons/redirect_6.svg +++ b/core-bundle/contao/themes/flexible/icons/redirect_6.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/redirect_7.svg b/core-bundle/contao/themes/flexible/icons/redirect_7.svg index 4bf0466406e..9d11247e009 100644 --- a/core-bundle/contao/themes/flexible/icons/redirect_7.svg +++ b/core-bundle/contao/themes/flexible/icons/redirect_7.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/regular.svg b/core-bundle/contao/themes/flexible/icons/regular.svg index 701cc6b1841..cc99bd342e4 100644 --- a/core-bundle/contao/themes/flexible/icons/regular.svg +++ b/core-bundle/contao/themes/flexible/icons/regular.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/regular_1.svg b/core-bundle/contao/themes/flexible/icons/regular_1.svg index b3cd3f0abfd..da0221dc312 100644 --- a/core-bundle/contao/themes/flexible/icons/regular_1.svg +++ b/core-bundle/contao/themes/flexible/icons/regular_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/regular_2.svg b/core-bundle/contao/themes/flexible/icons/regular_2.svg index 43ef9daf12b..11df99467e4 100644 --- a/core-bundle/contao/themes/flexible/icons/regular_2.svg +++ b/core-bundle/contao/themes/flexible/icons/regular_2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/regular_3.svg b/core-bundle/contao/themes/flexible/icons/regular_3.svg index a7d66558e70..872345861f8 100644 --- a/core-bundle/contao/themes/flexible/icons/regular_3.svg +++ b/core-bundle/contao/themes/flexible/icons/regular_3.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/regular_4.svg b/core-bundle/contao/themes/flexible/icons/regular_4.svg index 296fed6af02..0c635680092 100644 --- a/core-bundle/contao/themes/flexible/icons/regular_4.svg +++ b/core-bundle/contao/themes/flexible/icons/regular_4.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/regular_5.svg b/core-bundle/contao/themes/flexible/icons/regular_5.svg index a34c4130b94..9245a19c4e9 100644 --- a/core-bundle/contao/themes/flexible/icons/regular_5.svg +++ b/core-bundle/contao/themes/flexible/icons/regular_5.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/regular_6.svg b/core-bundle/contao/themes/flexible/icons/regular_6.svg index 4c383e3d59e..0bf91223dfa 100644 --- a/core-bundle/contao/themes/flexible/icons/regular_6.svg +++ b/core-bundle/contao/themes/flexible/icons/regular_6.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/regular_7.svg b/core-bundle/contao/themes/flexible/icons/regular_7.svg index 5509a3efc49..640646dbad5 100644 --- a/core-bundle/contao/themes/flexible/icons/regular_7.svg +++ b/core-bundle/contao/themes/flexible/icons/regular_7.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/right.svg b/core-bundle/contao/themes/flexible/icons/right.svg index 31ed5803e06..cada5800a8f 100644 --- a/core-bundle/contao/themes/flexible/icons/right.svg +++ b/core-bundle/contao/themes/flexible/icons/right.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/root.svg b/core-bundle/contao/themes/flexible/icons/root.svg index 5cb352c474b..71f48aa591a 100644 --- a/core-bundle/contao/themes/flexible/icons/root.svg +++ b/core-bundle/contao/themes/flexible/icons/root.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/root_1.svg b/core-bundle/contao/themes/flexible/icons/root_1.svg index 6348fccfff3..11b8f6ddef3 100644 --- a/core-bundle/contao/themes/flexible/icons/root_1.svg +++ b/core-bundle/contao/themes/flexible/icons/root_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/root_2.svg b/core-bundle/contao/themes/flexible/icons/root_2.svg index 1483647da41..f7967478fa7 100644 --- a/core-bundle/contao/themes/flexible/icons/root_2.svg +++ b/core-bundle/contao/themes/flexible/icons/root_2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/rows.svg b/core-bundle/contao/themes/flexible/icons/rows.svg deleted file mode 100644 index 03da6c7544b..00000000000 --- a/core-bundle/contao/themes/flexible/icons/rows.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/rss.svg b/core-bundle/contao/themes/flexible/icons/rss.svg index 157304df249..3270d704ef6 100644 --- a/core-bundle/contao/themes/flexible/icons/rss.svg +++ b/core-bundle/contao/themes/flexible/icons/rss.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/select.svg b/core-bundle/contao/themes/flexible/icons/select.svg deleted file mode 100644 index f82718cd2b2..00000000000 --- a/core-bundle/contao/themes/flexible/icons/select.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/settings.svg b/core-bundle/contao/themes/flexible/icons/settings.svg deleted file mode 100644 index a76d914acdf..00000000000 --- a/core-bundle/contao/themes/flexible/icons/settings.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/share.svg b/core-bundle/contao/themes/flexible/icons/share.svg index 2a56f9ea8e0..f2f4414352a 100644 --- a/core-bundle/contao/themes/flexible/icons/share.svg +++ b/core-bundle/contao/themes/flexible/icons/share.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/share_.svg b/core-bundle/contao/themes/flexible/icons/share_.svg index 66c3b13b7dd..eeeb4542de0 100644 --- a/core-bundle/contao/themes/flexible/icons/share_.svg +++ b/core-bundle/contao/themes/flexible/icons/share_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/shield.svg b/core-bundle/contao/themes/flexible/icons/shield.svg index d0555e093da..3c249d48f1a 100644 --- a/core-bundle/contao/themes/flexible/icons/shield.svg +++ b/core-bundle/contao/themes/flexible/icons/shield.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/shield_dark.svg b/core-bundle/contao/themes/flexible/icons/shield_dark.svg deleted file mode 100644 index 49517d8fc41..00000000000 --- a/core-bundle/contao/themes/flexible/icons/shield_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/shield_small.svg b/core-bundle/contao/themes/flexible/icons/shield_small.svg new file mode 100644 index 00000000000..169c6a5a102 --- /dev/null +++ b/core-bundle/contao/themes/flexible/icons/shield_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/show.svg b/core-bundle/contao/themes/flexible/icons/show.svg index b14a7e7d0b6..bca74354fe6 100644 --- a/core-bundle/contao/themes/flexible/icons/show.svg +++ b/core-bundle/contao/themes/flexible/icons/show.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/sizes.svg b/core-bundle/contao/themes/flexible/icons/sizes.svg index 88e6e26a1cc..4da23579d0b 100644 --- a/core-bundle/contao/themes/flexible/icons/sizes.svg +++ b/core-bundle/contao/themes/flexible/icons/sizes.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/sizes_.svg b/core-bundle/contao/themes/flexible/icons/sizes_.svg index 0ff20323b60..f544a8afc39 100644 --- a/core-bundle/contao/themes/flexible/icons/sizes_.svg +++ b/core-bundle/contao/themes/flexible/icons/sizes_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/stop.svg b/core-bundle/contao/themes/flexible/icons/stop.svg index d4d29d0a719..9b1f6de1c29 100644 --- a/core-bundle/contao/themes/flexible/icons/stop.svg +++ b/core-bundle/contao/themes/flexible/icons/stop.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/store.svg b/core-bundle/contao/themes/flexible/icons/store.svg index b0720bde95e..0b572596889 100644 --- a/core-bundle/contao/themes/flexible/icons/store.svg +++ b/core-bundle/contao/themes/flexible/icons/store.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/su.svg b/core-bundle/contao/themes/flexible/icons/su.svg index 4f01f792e84..b773b69a265 100644 --- a/core-bundle/contao/themes/flexible/icons/su.svg +++ b/core-bundle/contao/themes/flexible/icons/su.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/su_.svg b/core-bundle/contao/themes/flexible/icons/su_.svg index 4835ba490d3..fdea1298042 100644 --- a/core-bundle/contao/themes/flexible/icons/su_.svg +++ b/core-bundle/contao/themes/flexible/icons/su_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/sync.svg b/core-bundle/contao/themes/flexible/icons/sync.svg index b6d7671be2e..082ec46ef88 100644 --- a/core-bundle/contao/themes/flexible/icons/sync.svg +++ b/core-bundle/contao/themes/flexible/icons/sync.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/tablewizard.svg b/core-bundle/contao/themes/flexible/icons/tablewizard.svg index b6211304922..bc1bab18ed3 100644 --- a/core-bundle/contao/themes/flexible/icons/tablewizard.svg +++ b/core-bundle/contao/themes/flexible/icons/tablewizard.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/theme_export.svg b/core-bundle/contao/themes/flexible/icons/theme_export.svg index 07fc78eedb6..bc44b40020e 100644 --- a/core-bundle/contao/themes/flexible/icons/theme_export.svg +++ b/core-bundle/contao/themes/flexible/icons/theme_export.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/theme_export_.svg b/core-bundle/contao/themes/flexible/icons/theme_export_.svg index 8656dbcecd7..7900c6b8cbc 100644 --- a/core-bundle/contao/themes/flexible/icons/theme_export_.svg +++ b/core-bundle/contao/themes/flexible/icons/theme_export_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/theme_import.svg b/core-bundle/contao/themes/flexible/icons/theme_import.svg index ab815c6aa8e..f7ce9f6b933 100644 --- a/core-bundle/contao/themes/flexible/icons/theme_import.svg +++ b/core-bundle/contao/themes/flexible/icons/theme_import.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/themes.svg b/core-bundle/contao/themes/flexible/icons/themes.svg deleted file mode 100644 index 2d1e2c97cf3..00000000000 --- a/core-bundle/contao/themes/flexible/icons/themes.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/undo.svg b/core-bundle/contao/themes/flexible/icons/undo.svg index f1b73359a26..6dd73a2c97d 100644 --- a/core-bundle/contao/themes/flexible/icons/undo.svg +++ b/core-bundle/contao/themes/flexible/icons/undo.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/unpublished.svg b/core-bundle/contao/themes/flexible/icons/unpublished.svg index 878da6099cf..e3d365b49a8 100644 --- a/core-bundle/contao/themes/flexible/icons/unpublished.svg +++ b/core-bundle/contao/themes/flexible/icons/unpublished.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/up.svg b/core-bundle/contao/themes/flexible/icons/up.svg deleted file mode 100644 index 2e5bcbb822b..00000000000 --- a/core-bundle/contao/themes/flexible/icons/up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/user.svg b/core-bundle/contao/themes/flexible/icons/user.svg index c66c7b8444c..b85f0ecff24 100644 --- a/core-bundle/contao/themes/flexible/icons/user.svg +++ b/core-bundle/contao/themes/flexible/icons/user.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/user_.svg b/core-bundle/contao/themes/flexible/icons/user_.svg index d4e9fad406b..bd937fc9e49 100644 --- a/core-bundle/contao/themes/flexible/icons/user_.svg +++ b/core-bundle/contao/themes/flexible/icons/user_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/user_two_factor.svg b/core-bundle/contao/themes/flexible/icons/user_two_factor.svg index 75afb063054..8d97e79c256 100644 --- a/core-bundle/contao/themes/flexible/icons/user_two_factor.svg +++ b/core-bundle/contao/themes/flexible/icons/user_two_factor.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/user_two_factor_.svg b/core-bundle/contao/themes/flexible/icons/user_two_factor_.svg index 82a0d76cfee..5b0280882c8 100644 --- a/core-bundle/contao/themes/flexible/icons/user_two_factor_.svg +++ b/core-bundle/contao/themes/flexible/icons/user_two_factor_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/visible.svg b/core-bundle/contao/themes/flexible/icons/visible.svg index 7836761663f..917fa715a21 100644 --- a/core-bundle/contao/themes/flexible/icons/visible.svg +++ b/core-bundle/contao/themes/flexible/icons/visible.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/visible_.svg b/core-bundle/contao/themes/flexible/icons/visible_.svg index 51592f54328..682742cba71 100644 --- a/core-bundle/contao/themes/flexible/icons/visible_.svg +++ b/core-bundle/contao/themes/flexible/icons/visible_.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/icons/wrench.svg b/core-bundle/contao/themes/flexible/icons/wrench.svg index a818625158a..1bbf736a8dd 100644 --- a/core-bundle/contao/themes/flexible/icons/wrench.svg +++ b/core-bundle/contao/themes/flexible/icons/wrench.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/main.css b/core-bundle/contao/themes/flexible/main.css index 4b3496175dd..39015ae4336 100644 --- a/core-bundle/contao/themes/flexible/main.css +++ b/core-bundle/contao/themes/flexible/main.css @@ -6,6 +6,24 @@ * @license LGPL-3.0-or-later */ +:root { + --icon-logo: url("icons/logo.svg"); + --icon-profile: url("icons/profile_small.svg"); + --icon-security: url("icons/shield_small.svg"); + --icon-favorites: url("icons/favorites_small.svg"); + --icon-color-scheme: url("icons/color-scheme_small.svg"); + --icon-logout: url("icons/exit.svg"); +} + +html[data-color-scheme="dark"] { + --icon-logo: url("icons-dark/logo.svg"); + --icon-profile: url("icons-dark/profile_small.svg"); + --icon-security: url("icons-dark/shield_small.svg"); + --icon-favorites: url("icons-dark/favorites_small.svg"); + --icon-color-scheme: url("icons-dark/color-scheme_small.svg"); + --icon-logout: url("icons-dark/exit.svg"); +} + /* Body */ body { background: var(--body-bg); @@ -31,13 +49,13 @@ body.popup { display: block; height: 16px; padding: 12px 12px 12px 42px; - background: url("icons/logo.svg") no-repeat 10px center; + background: var(--icon-logo) no-repeat 10px center; font-weight: 400; } #header h1 a .app-title { font-size: 17px; - color: var(--white); + color: var(--header-text); } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { @@ -61,16 +79,12 @@ body.popup { display: inline-block; } -#tmenu img { - vertical-align: top; -} - #tmenu sup { position: absolute; top: 5px; left: 20px; font-size: .6rem; - background: var(--white); + background: var(--header-text); padding: 2px; border-radius: 2px; text-indent: 0; @@ -111,7 +125,7 @@ body.popup { } #tmenu a, #tmenu .profile button, #tmenu .burger button { - color: var(--white); + color: var(--header-text); transition: background-color .3s ease; } @@ -124,10 +138,10 @@ body.popup { position: absolute; right: 6px; margin-top: 5px; - padding: 6px 0 9px; - background: var(--white); - box-shadow: 0 0 3px var(--gray); - z-index: 1; + background: var(--content-bg); + border: 1px solid var(--content-border); + box-shadow: 0 1px 6px rgba(0,0,0,.2); + z-index: 2; color: var(--text); text-align: left; opacity: 0; @@ -148,12 +162,12 @@ body.popup { } #tmenu ul.menu_level_1 li a:hover { - background-color: var(--nav-hover); + background-color: var(--nav-hover-bg); } #tmenu ul.menu_level_1 .info { color: var(--info); - padding: 9px 20px 15px; + padding: 15px 20px; border-bottom: 1px solid var(--border); line-height: 1.4; margin-bottom: 9px; @@ -174,16 +188,26 @@ body.popup { right: 9px; top: -14px; border: 7px solid transparent; - border-bottom-color: var(--white); + border-bottom-color: var(--content-bg); } #tmenu ul.menu_level_1:after { content: ""; display: block; - width: 100%; - height: 5px; + width: 9px; + height: 9px; position: absolute; - top: -5px; + top: -6px; + right: 11px; + border-top: 1px solid var(--content-border); + border-right: 1px solid var(--content-border); + transform: rotateZ(-45deg); +} + +#tmenu ul.menu_level_1 .color-scheme { + margin-top: 9px; + padding: 6px 0; + border-top: 1px solid var(--border); } #tmenu .icon-alert, #tmenu .icon-favorite, #tmenu .icon-manual { @@ -211,20 +235,24 @@ body.popup { background: url("icons/manual.svg") center center no-repeat; } +#tmenu .icon-color-scheme { + background: var(--icon-color-scheme) 20px center no-repeat; +} + #tmenu .icon-profile { - background: url("icons/profile_dark.svg") 20px center no-repeat; + background: var(--icon-profile) 20px center no-repeat; } #tmenu .icon-security { - background: url("icons/shield_dark.svg") 20px center no-repeat; + background: var(--icon-security) 20px center no-repeat; } #tmenu .icon-favorites { - background: url("icons/favorites_dark.svg") 20px center no-repeat; + background: var(--icon-favorites) 20px center no-repeat; } #tmenu .icon-logout { - background: url("icons/exit_dark.svg") 20px center no-repeat; + background: var(--icon-logout) 20px center no-repeat; } /* Container */ @@ -237,7 +265,6 @@ body.popup { padding: 0; width: auto; min-height: 0; - background: var(--white); max-width: none; } @@ -279,8 +306,10 @@ body.popup { #main .content { margin: 0 15px 15px; +} + +#main .content { background: var(--content-bg); - border-radius: 3px; border: 1px solid var(--content-border); } @@ -506,30 +535,34 @@ h2.sub_headline { .tl_error, .tl_confirm, .tl_info, .tl_new { margin: 0 0 1px; - padding: 11px 18px 11px 37px; + padding: 11px 18px 11px 32px; line-height: 1.3; } .tl_error { - background: var(--error-bg) url("icons/error.svg") no-repeat 16px 12px; + background: var(--error-bg) url("icons/error.svg") no-repeat 11px 12px; } .tl_confirm { - background: var(--confirm-bg) url("icons/ok.svg") no-repeat 16px 12px; + background: var(--confirm-bg) url("icons/ok.svg") no-repeat 11px 12px; } .tl_info { - background: var(--info-bg) url("icons/show.svg") no-repeat 16px 12px; + background: var(--info-bg) url("icons/show.svg") no-repeat 11px 12px; } .tl_new { - background: var(--new-bg) url("icons/featured.svg") no-repeat 16px 12px; + background: var(--new-bg) url("icons/featured.svg") no-repeat 11px 12px; } .tl_gerror, .tl_gerror a, .tl_error, .tl_error a { color: var(--red); } +.tl_gerror a, .tl_error a { + text-decoration: underline; +} + .tl_confirm, .tl_confirm a { color: var(--green); } @@ -553,12 +586,16 @@ h2.sub_headline { /* Filter */ .tl_panel, .tl_version_panel { - padding: 8px 10px 8px 0; + padding: 4px 12px; background: var(--panel-bg); - border-bottom: 1px solid var(--panel-border); + border-bottom: 1px solid var(--content-border); text-align: right; } +.tl_version_panel { + padding: 8px 12px; +} + .tl_panel .tl_select { text-align: left; } @@ -615,6 +652,7 @@ h2.sub_headline { .tl_panel .active, .tl_panel_bottom .active, #search .active { background-color: var(--active-bg); + border: 1px solid var(--active-border); } .tl_filter { @@ -729,11 +767,11 @@ h2.sub_headline { } .tl_formbody_submit { - border-top: 1px solid var(--panel-border); + border-top: 1px solid var(--content-border); } .tl_submit_container { - padding: 8px 15px; + padding: 8px 12px; background: var(--panel-bg); } @@ -847,7 +885,7 @@ h2.sub_headline { #tl_crawl .progress-bar.running { background-color: var(--progress-running); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); animation: crawl-progress-bar-stripes 1s linear infinite; } @@ -931,7 +969,7 @@ h2.sub_headline { } .two-factor .tl_listing_container { - margin-top: 0; + margin-top: 6px; } .two-factor .widget { @@ -959,14 +997,13 @@ h2.sub_headline { } .two-factor .tl_message { - margin-bottom: 12px; + margin: 0 15px 12px; } .two-factor .tl_message > p { - padding-top: 0; - padding-bottom: 0; + padding: 0 3px 0 27px; background-color: transparent; - background-position-y: center; + background-position: 3px center; } .two-factor .tl_backup_codes > p, .two-factor .tl_trusted_devices > p { @@ -977,6 +1014,7 @@ h2.sub_headline { .two-factor .backup-codes { max-width: 224px; margin: 15px 15px 24px; + padding: 0; display: grid; grid-template-columns:repeat(2, 1fr); } @@ -986,10 +1024,6 @@ h2.sub_headline { list-style: none; } -.two-factor .tl_trusted_devices .tl_listing tr:nth-child(odd) td { - background-color: var(--table-odd); -} - /* Picker search */ #search { margin: 18px 18px -9px; @@ -1011,7 +1045,7 @@ h2.sub_headline { max-width: 100%; height: auto; padding: 2px; - border: 1px solid var(--panel-border); + border: 1px solid var(--content-border); background: var(--white); } @@ -1035,14 +1069,6 @@ h2.sub_headline { line-height: 1.3; } -#index_note { - margin: 24px 0 18px; - padding: 11px 12px 12px; - background: var(--note-bg); - border: 1px solid var(--note-border); - font-size: .875rem; -} - #index_loading { margin: 0; padding: 12px 12px 12px 24px; @@ -1064,25 +1090,22 @@ table.tl_listing { } .tl_listing_container { - padding: 24px 15px 18px; -} - -#tl_buttons + .tl_listing_container { - padding-top: 9px; + margin: 18px 0; + padding: 0 15px; } -.tl_listing_container.tree_view { - position: relative; +#tl_buttons + .tl_listing_container, #tl_buttons + .tl_form .tl_listing_container { + margin-top: 12px; } #paste_hint + .tl_listing_container { - margin-top: 30px; + margin-top: 36px; } .tl_folder_list, .tl_folder_tlist { - padding: 7px 0; + padding: 6px; border-bottom: 1px solid var(--border); - background: var(--panel-bg); + background: var(--table-header); font-weight: 600; } @@ -1097,15 +1120,11 @@ table.tl_listing { } .tl_file, .tl_file_list { - padding: 5px 0; + padding: 5px 6px; border-bottom: 1px solid var(--border); background: var(--content-bg); } -.tl_file_list { - padding: 7px 0; -} - .tl_file_list .ellipsis { height: 16px; text-overflow: ellipsis; @@ -1115,7 +1134,7 @@ table.tl_listing { } .tl_right_nowrap { - padding: 6px 0; + padding: 6px; vertical-align: top; text-align: right; white-space: nowrap; @@ -1143,15 +1162,6 @@ table.tl_listing { } /* List view */ -.tl_listing tr.odd td { - background-color: var(--table-odd); -} - -.tl_listing th, .tl_listing td { - padding-left: 6px !important; - padding-right: 6px !important; -} - .list_view .tl_listing img.theme_preview { margin-right: 9px; } @@ -1162,11 +1172,9 @@ table.tl_listing { padding: 9px 0 18px; } -.tl_show td { - padding: 4px 6px; +.tl_show th, .tl_show td { line-height: 16px; white-space: pre-line; - background: var(--table-header); } .tl_show td:first-child { @@ -1178,10 +1186,6 @@ table.tl_listing { margin-bottom: 0; } -.tl_show tr:nth-child(2n) td { - background: var(--white); -} - .tl_show small { display: block; color: var(--info); @@ -1198,6 +1202,10 @@ table.tl_listing { } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { + .tl_label { + font-weight: 500; + } + .tl_label small { font-weight: 300; } @@ -1214,7 +1222,7 @@ table.tl_listing { } .tl_listing_container + .tl_empty { - margin-top: -32px; + margin-top: -18px; } .tl_noopt { @@ -1241,10 +1249,9 @@ table.tl_listing { /* Parent view */ .tl_header { - padding: 6px; - background: var(--table-even); - border-top: 1px solid var(--panel-border); - border-bottom: 1px solid var(--panel-border); + margin-bottom: 18px; + padding: 10px; + background: var(--table-header); } .tl_header_table { @@ -1252,6 +1259,7 @@ table.tl_listing { } .tl_content_header { + margin-top: 18px; padding: 7px 6px; border-bottom: 1px solid var(--border); background: var(--table-header); @@ -1264,30 +1272,53 @@ table.tl_listing { } } +.as-grid .tl_content_header { + margin-top: 24px; + padding: 0 1px; + border: 0; + background-color: transparent; + font-size: 1rem; +} + .tl_content { - padding: 6px; border-bottom: 1px solid var(--border); overflow: hidden; position: relative; - background-color: var(--white); +} + +.tl_content .inside { + padding: 6px; + background-color: var(--content-bg); } .tl_content.draft > *, .tl_folder.draft > *, .tl_file.draft > *, .hover-row.draft > td { opacity: 0.5; } +.as-grid .tl_content { + margin-top: 18px; + padding: 0; + border: 1px solid var(--border); + background-color: var(--content-bg); +} + +.as-grid .tl_content .inside { + display: grid; + grid-template-columns: 1fr auto; +} + +.as-grid .tl_content_header + .tl_content { + margin-top: 12px; +} + .parent_view > ul { margin: 0; padding: 0; list-style: none; } -.tl_content.wrapper_stop { - border-top: 1px solid var(--border); -} - -.tl_content.wrapper_start h1 { - margin-bottom: 9px; +.parent_view:not(.as-grid) > ul { + background-color: var(--table-header); } .tl_content.indent_1 { @@ -1310,48 +1341,61 @@ table.tl_listing { margin-left: 100px; } -.tl_content.indent_last { - border-bottom: 0; +.as-grid .tl_content .inside { + padding: 0; } -.tl_content h1, .tl_content h2, .tl_content h3, .tl_content h4, .tl_content h5, .tl_content h6 { - font-size: .875rem; +.as-grid .tl_content.indent { + margin: 0; + padding: 15px 15px 0; + border-width: 0 1px; + background: var(--nested-bg); } -.tl_content figure { - margin-bottom: 1em; +.as-grid .tl_content.indent_2 { + padding-left: 30px; + padding-right: 30px; } -.tl_content img, .selector_container img, .tl_undo_preview img { - max-width: 320px; - height: auto; +.as-grid .tl_content.indent_3 { + padding-left: 45px; + padding-right: 45px; } -.tl_content pre { - margin-top: 3px; - margin-bottom: 3px; - word-break: break-all; - white-space: pre-wrap; +.as-grid .tl_content.indent_4 { + padding-left: 60px; + padding-right: 60px; } -.tl_content pre.disabled { - color: var(--pre-disabled); +.as-grid .tl_content.indent_5 { + padding-left: 75px; + padding-right: 75px; } -.tl_content .ce_text a { - color: var(--green); +.as-grid .tl_content.indent_last { + padding-bottom: 15px; } -.tl_content span.comment { - color: var(--blue); - display: inline-block; - margin-bottom: 3px; +.as-grid .tl_content.indent .inside { + border: 1px solid var(--border); +} + +.as-grid .tl_content.wrapper_stop { + margin-top: 0; +} + +.as-grid .tl_content.indent.wrapper_stop { + padding-top: 0; } .tl_content_left { line-height: 16px; } +.as-grid .tl_content_left { + padding: 8px 10px; +} + .tl_content_right { position: relative; z-index: 1; @@ -1361,6 +1405,16 @@ table.tl_listing { margin-bottom: -1px; } +.as-grid .tl_content .tl_content_right { + order: 2; + float: none; + margin-left: 0; + margin-bottom: 0; + padding: 8px 10px; + border-left: 1px solid var(--border); + background: var(--table-header); +} + .tl_right button, .tl_content_right button { margin: 0; padding: 0; @@ -1376,6 +1430,14 @@ table.tl_listing { line-height: 16px; } +.as-grid .cte_type { + order: 1; + margin-bottom: 0; + padding: 8px 10px; + background-color: var(--table-header); + font-size: .8rem; +} + .cte_type.published, .cte_type.published a { color: var(--green); } @@ -1384,13 +1446,151 @@ table.tl_listing { color: var(--red); } +.cte_type.icon-protected { + padding-left: 27px; + background: var(--table-header) url("icons/protected.svg") 8px center no-repeat; +} + .cte_type .visibility { color: var(--gray); } +.cte_preview { + line-height: 1.25; + position: relative; +} + +.cte_preview h1 { + font-size: 1.25rem; + margin-bottom: 6px; +} + +.cte_preview h2 { + font-size: 1rem; + margin-bottom: 6px; +} + +.cte_preview h3 { + font-size: .9rem; + margin-bottom: 6px; +} + +.cte_preview h4, .cte_preview h5, .cte_preview h6 { + font-size: .875rem; + margin-bottom: 6px; +} + +.cte_preview p, .cte_preview figure, .cte_preview ol, .cte_preview ul, .cte_preview table, .cte_preview div.tl_gray, .content-hyperlink, .content-toplink, .cte_preview table caption { + margin-bottom: 6px; +} + +.cte_preview img { + max-width: 320px; + height: auto; + padding: 6px 0; +} + +.cte_preview th, .cte_preview td { + padding: 3px 6px; + border-bottom: 1px solid var(--border); +} + +.cte_preview th { + padding: 6px; + background: var(--table-header); +} + +.cte_preview td { + background: var(--content-bg); +} + +.cte_preview table caption { + text-align: left; + font-size: .75rem; +} + +.cte_preview pre { + margin-top: 0; + margin-bottom: 6px; + word-break: break-all; + white-space: pre-wrap; +} + +.cte_preview pre.disabled { + color: var(--pre-disabled); +} + +.cte_preview .content-gallery ul { + margin: 0; + padding: 0; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + list-style: none; +} + +.cte_preview a { + color: var(--green); +} + +.cte_preview div.tl_gray a { + color: var(--gray); +} + +.cte_preview span.comment { + color: var(--blue); + display: inline-block; + margin-bottom: 3px; +} + +.cte_preview input, .cte_preview select, .cte_preview textarea, .cte_preview button { + background: var(--form-bg); + border: 1px solid var(--form-border); +} + +.cte_preview input[type="file"] { + position: relative; +} + +.cte_preview select { + -moz-appearance: menulist; + -webkit-appearance: menulist; +} + +.cte_preview label, .cte_preview .checkbox_container legend, .cte_preview .radio_container legend { + display: block; + margin-bottom: 6px; +} + +.cte_preview .widget { + margin: 0 0 6px; +} + +.cte_preview .checkbox_container label, .cte_preview .radio_container label { + display: initial; +} + +.cte_preview .widget-captcha { + display: block !important; +} + +.cte_preview .widget-captcha .captcha_text { + padding-left: 3px; + vertical-align: middle; +} + +.cte_preview.empty { + display: none; +} + +.as-grid .cte_preview { + order: 3; + grid-column: 1 / span 2; + padding: 10px 10px 6px; + border-top: 1px solid var(--border); +} + .limit_height { overflow: hidden; - line-height: 1.25; } .limit_toggler { @@ -1398,7 +1598,7 @@ table.tl_listing { position: absolute; bottom: 0; left: 0; - background: var(--white); + background: var(--content-bg); line-height: 11px; text-align: center; } @@ -1407,7 +1607,7 @@ table.tl_listing { margin: 0; padding: 0; border: 0; - background: var(--white); + background: var(--content-bg); width: 24px; line-height: 8px; color: var(--gray); @@ -1421,52 +1621,23 @@ table.tl_listing { top: -4px; } -.limit_height input[type="file"] { - position: relative; -} - -.limit_height select { - -moz-appearance: menulist; - -webkit-appearance: menulist; -} - -.limit_height label, .limit_height .checkbox_container legend, .limit_height .radio_container legend { - display: inline-block; - width: 180px; - vertical-align: top; - margin-top: 3px; -} - -.limit_height .widget { - margin-left: 0; - margin-right: 0; -} - -.limit_height .widget-submit { - margin-left: 180px; -} - -.limit_height .checkbox_container label, .limit_height .radio_container label { - display: initial; -} - /* Tree view */ .tl_folder_top { - padding: 5px 0; - border-top: 1px solid var(--tree-header-border); - border-bottom: 1px solid var(--tree-header-border); + padding: 5px 6px; + border: solid var(--tree-header-border); + border-width: 1px 0; background: var(--tree-header); } .tl_folder { - padding: 5px 0; + padding: 5px 6px; border-bottom: 1px solid var(--border); background: var(--table-header); } .tl_folder.tl_folder_dropping, .tl_folder_top.tl_folder_dropping { background-color: var(--drag-bg) !important; - color: var(--white) !important; + color: var(--text) !important; } .tl_folder.tl_folder_dropping a, .tl_folder_top.tl_folder_dropping a { @@ -1486,7 +1657,7 @@ table.tl_listing { position: absolute; background: var(--drag-bg); border-radius: 10px; - color: var(--white); + color: var(--text); padding: 5px 10px !important; margin-left: 0; text-indent: 0; @@ -1558,8 +1729,6 @@ table.tl_listing { .tl_listing li { display: flex; margin: 0; - padding-left: 6px; - padding-right: 6px; list-style-type: none; } @@ -1582,6 +1751,7 @@ label.tl_change_selected { overflow: hidden; background: var(--active-bg); border: 1px solid var(--active-border); + border-radius: 2px; line-height: 24px; } @@ -1629,6 +1799,11 @@ label.tl_change_selected { vertical-align: text-top; } +.selector_container img { + max-width: 320px; + height: auto; +} + .selector_container .limit_height { height: auto !important; max-height: 190px; @@ -1715,18 +1890,8 @@ ul.sgallery li { margin-bottom: 0; } -#tl_versions th { - background: var(--table-header); - padding: 6px; - border-top: 1px solid var(--border); -} - -#tl_versions th, #tl_versions td { - border-bottom: 1px solid var(--border); -} - #tl_versions td { - padding: 4px; + padding: 6px; } #tl_versions td:first-child { @@ -1739,14 +1904,6 @@ ul.sgallery li { text-align: right; } -#tl_versions tr:nth-child(even) td { - background-color: var(--table-odd); -} - -#tl_versions img.undo { - padding-right: 2px; -} - #tl_versions .pagination { margin-top: 18px; margin-bottom: 14px; @@ -1778,7 +1935,7 @@ ul.sgallery li { .tl_chmod th, .tl_chmod td { width: 14.2857%; padding: 6px; - border: 1px solid var(--white); + border: 1px solid var(--content-bg); } /* Wizards */ @@ -1951,13 +2108,18 @@ ul.sgallery li { /* Meta wizard */ .tl_metawizard { margin: 3px 0; + padding: 0; + list-style: none; } .tl_metawizard li { overflow: hidden; margin-bottom: 2px; padding: 9px; - background: var(--panel-bg); +} + +.tl_metawizard li:nth-child(odd) { + background: var(--table-header); } .tl_metawizard li:nth-child(even) { @@ -2184,12 +2346,12 @@ ul.sortable button[disabled] { } ul.sortable button[disabled]:hover { - background: rgba(255, 255, 255, .7); + background: rgba(255,255,255,.7); } #picker-menu { padding: 9px 6px 0; - border-bottom: 1px solid var(--panel-border); + border-bottom: 1px solid var(--content-border); } #picker-menu > ul { @@ -2202,7 +2364,7 @@ ul.sortable button[disabled]:hover { display: inline-block; padding: 8px 0; background-color: var(--table-even); - border: 1px solid var(--panel-border); + border: 1px solid var(--content-border); border-radius: 2px 2px 0 0; position: relative; top: 1px; @@ -2332,10 +2494,6 @@ time[title] { background-image: url("icons/all.svg"); } -.header_delete_all { - background-image: url("icons/deleteAll.svg"); -} - .header_new_folder { padding-left: 24px; background-image: url("icons/newfolder.svg"); @@ -2364,7 +2522,7 @@ time[title] { /* Visual hint for TRBL fields - thanks to Eugene Rybyakov */ .tl_text_trbl, .tl_imageSize_0, .tl_imageSize_1, #ctrl_playerSize input { - background: url("icons/hints.svg") no-repeat right 1px top 2px; + background: var(--form-bg) url("icons/hints.svg") no-repeat right 1px top 2px; } #ctrl_playerSize_1, .tl_imageSize_1 { @@ -2482,25 +2640,10 @@ fieldset.collapsed > legend { width: 100%; } -#tl_maintenance_cache th, #tl_maintenance_cache td { - border-bottom: 1px solid var(--border); -} - -#tl_maintenance_cache th { - background: var(--table-header); - padding: 6px; - border-top: 1px solid var(--border); -} - #tl_maintenance_cache td { - padding: 6px; line-height: 1.2; } -#tl_maintenance_cache tr:nth-child(even) td { - background: var(--table-odd); -} - #tl_maintenance_cache td span { color: var(--gray); } @@ -2534,7 +2677,7 @@ fieldset.collapsed > legend { /* Pagination */ .pagination { overflow: hidden; - background: var(--table-header); + background: var(--panel-bg); margin-bottom: 18px; border: solid var(--border); border-width: 1px 0; @@ -2545,7 +2688,6 @@ fieldset.collapsed > legend { width: 60%; float: right; text-align: right; - padding-right: 3px; } .pagination p { @@ -2556,7 +2698,7 @@ fieldset.collapsed > legend { .pagination li { display: inline; - padding-right: 3px; + padding-left: 3px; } .pagination .active { @@ -2564,8 +2706,9 @@ fieldset.collapsed > legend { } .pagination-lp { - margin-left: 15px; - margin-right: 15px; + margin-bottom: 0; + border-bottom: 0; + padding: 15px 12px; } /* File synchronization */ @@ -2600,8 +2743,9 @@ fieldset.collapsed > legend { .dropzone { margin: 2px 0; min-height: auto !important; - border: 3px dashed var(--panel-border) !important; + border: 3px dashed var(--border) !important; border-radius: 2px; + background: var(--form-bg) !important; } .dropzone-filetree { @@ -2652,6 +2796,11 @@ fieldset.collapsed > legend { padding-right: 32px !important; } +.tl_undo_preview img { + max-width: 320px; + height: auto; +} + .tl_listing .odd .tl_undo_preview .limit_toggler { background-color: var(--table-odd); } diff --git a/core-bundle/contao/themes/flexible/main.min.css b/core-bundle/contao/themes/flexible/main.min.css index bc89c2a2801..fa7d6b563a5 100644 --- a/core-bundle/contao/themes/flexible/main.min.css +++ b/core-bundle/contao/themes/flexible/main.min.css @@ -1 +1 @@ -body{background:var(--body-bg);overflow-y:scroll}body.popup{background:var(--content-bg)}#header{min-height:40px;text-align:left;background:var(--header-bg)}#header h1{position:absolute}#header h1 a{display:block;height:16px;padding:12px 12px 12px 42px;background:url(icons/logo.svg) no-repeat 10px center;font-weight:400}#header h1 a .app-title{font-size:17px;color:var(--white)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#header h1 a{font-weight:300}}#tmenu{display:flex;justify-content:flex-end}#tmenu li{position:relative}#tmenu a,#tmenu .profile button{margin:0;padding:13px 12px;display:inline-block}#tmenu img{vertical-align:top}#tmenu sup{position:absolute;top:5px;left:20px;font-size:.6rem;background:var(--white);padding:2px;border-radius:2px;text-indent:0;font-weight:400}#tmenu .burger{display:none}#tmenu .burger button{margin-right:-2px;padding:8px 10px 9px;background:0 0;border:0;vertical-align:top}#tmenu .burger svg{margin-bottom:-1px;vertical-align:middle}#tmenu .profile button{position:relative;cursor:pointer;font-size:.875rem;font-weight:400;border:0;padding-right:26px;background:url(icons/chevron-down.svg) right 9px top 14px no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tmenu .profile button{font-weight:300}}#tmenu a,#tmenu .profile button,#tmenu .burger button{color:var(--white);transition:background-color .3s ease}#tmenu a:hover,#tmenu a.hover,#tmenu li:hover .profile button,#tmenu .active .profile button,#tmenu .burger button:hover{background-color:var(--header-bg-hover)}#tmenu ul.menu_level_1{min-width:150px;position:absolute;right:6px;margin-top:5px;padding:6px 0 9px;background:var(--white);box-shadow:0 0 3px var(--gray);z-index:1;color:var(--text);text-align:left;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}#tmenu .active ul.menu_level_1{opacity:1;visibility:visible}#tmenu ul.menu_level_1 li a{display:block;color:inherit;padding:6px 20px 6px 40px;white-space:nowrap}#tmenu ul.menu_level_1 li a:hover{background-color:var(--nav-hover)}#tmenu ul.menu_level_1 .info{color:var(--info);padding:9px 20px 15px;border-bottom:1px solid var(--border);line-height:1.4;margin-bottom:9px;white-space:nowrap}#tmenu ul.menu_level_1 strong{color:var(--text);display:block}#tmenu ul.menu_level_1:before{content:"";display:block;width:0;height:0;position:absolute;right:9px;top:-14px;border:7px solid transparent;border-bottom-color:var(--white)}#tmenu ul.menu_level_1:after{content:"";display:block;width:100%;height:5px;position:absolute;top:-5px}#tmenu .icon-alert,#tmenu .icon-favorite,#tmenu .icon-manual{width:16px;margin-bottom:-2px;position:relative;overflow:hidden;white-space:nowrap;text-indent:28px}#tmenu .icon-alert{background:url(icons/alert.svg) center center no-repeat}#tmenu .icon-favorite{background:url(icons/favorite.svg) center center no-repeat}#tmenu .icon-favorite--active{background:url(icons/favorite_active.svg) center center no-repeat}#tmenu .icon-manual{background:url(icons/manual.svg) center center no-repeat}#tmenu .icon-profile{background:url(icons/profile_dark.svg) 20px center no-repeat}#tmenu .icon-security{background:url(icons/shield_dark.svg) 20px center no-repeat}#tmenu .icon-favorites{background:url(icons/favorites_dark.svg) 20px center no-repeat}#tmenu .icon-logout{background:url(icons/exit_dark.svg) 20px center no-repeat}#container{display:flex;min-height:calc(100vh - 40px)}.popup #container{padding:0;width:auto;min-height:0;background:var(--white);max-width:none}#left{width:210px;background:var(--nav-bg);display:flex;flex-direction:column}#left .version{margin-top:4em;padding:15px 18px;font-size:.75rem;line-height:1.4}#left .version,#left .version a{color:var(--nav-group)}#main{width:calc(100% - 210px);display:flex;flex-direction:column}.popup #main{float:none;width:auto;max-width:none;margin:0;padding:0;border:0;display:initial}#main .content{margin:0 15px 15px;background:var(--content-bg);border-radius:3px;border:1px solid var(--content-border)}.popup #main .content{margin:0;border:0;overflow:auto}#tl_navigation{flex-grow:1}#tl_navigation .menu_level_0{padding-top:20px}#tl_navigation .menu_level_0>li:after{content:"";width:calc(100% - 30px);height:1px;display:block;margin:15px auto;background:var(--nav-separator)}#tl_navigation .menu_level_0>li.last:after{display:none}#tl_navigation .menu_level_0 a[class^=group-]{display:block;margin:0 15px;padding:3px 3px 3px 22px;color:var(--nav-group);font-size:.75rem;text-transform:uppercase;font-weight:500}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tl_navigation .menu_level_0 a[class^=group-]{font-weight:400}}#tl_navigation .group-favorites{background:url(icons/favorites_group.svg) 3px 2px no-repeat}#tl_navigation .group-content{background:url(icons/content.svg) 3px 2px no-repeat}#tl_navigation .group-design{background:url(icons/monitor.svg) 3px 2px no-repeat}#tl_navigation .group-accounts{background:url(icons/person.svg) 3px 2px no-repeat}#tl_navigation .group-system{background:url(icons/wrench.svg) 3px 2px no-repeat}#tl_navigation .menu_level_1{padding-top:5px}#tl_navigation [class^=menu_level_] a{display:block;padding:5px 33px 5px 37px;font-weight:400;color:var(--nav);transition:color .2s ease}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tl_navigation [class^=menu_level_] a{font-weight:300}}#tl_navigation [class^=menu_level_]>li.current>a{background-color:var(--nav-current);border-left:4px solid var(--contao)}#tl_navigation .menu_level_1>li.current>a{padding-left:33px}#tl_navigation .menu_level_2 a{padding-left:49px}#tl_navigation .menu_level_2>li.current>a{padding-left:45px}#tl_navigation .menu_level_3 a{padding-left:61px}#tl_navigation .menu_level_3>li.current>a{padding-left:57px}#tl_navigation .menu_level_4 a{padding-left:73px}#tl_navigation .menu_level_4>li.current>a{padding-left:69px}#tl_navigation .menu_level_5 a{padding-left:85px}#tl_navigation .menu_level_5>li.current>a{padding-left:81px}#tl_navigation .menu_level_2 a{font-size:.75rem}#tl_navigation .menu_level_1 li.has-children:not(.first){padding-top:5px}#tl_navigation .menu_level_1 li.has-children:not(.last){padding-bottom:5px}#tl_navigation .menu_level_1 a:hover,#tl_navigation .menu_level_1 li.current a{color:var(--nav-hover)}#tl_navigation .collapsed .menu_level_1{display:none}#tl_buttons{margin:0;padding:12px 15px;text-align:right}.toggleWrap{cursor:pointer}.opacity{-moz-opacity:.8;opacity:.8}#main_headline{margin:18px 16px;font-size:1.1rem;display:flex}.popup #main_headline{display:none}#main_headline span{display:inline-block;max-width:max-content;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:22px;flex:1 0 0}#main_headline span:nth-child(even){font-weight:400}#main_headline span+span::before{content:"\A0› ";font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#main_headline span:nth-child(even){font-weight:300}#main_headline span+span::before{font-weight:500}}h2.sub_headline{margin:3px 18px;padding:7px 0}.label-info{color:var(--gray);padding-left:3px}.label-date{color:var(--gray);padding-right:3px}.tl_gerror{margin:12px;padding:3px 0 3px 22px;background:url(icons/error.svg) no-repeat left center}.tl_error,.tl_confirm,.tl_info,.tl_new{margin:0 0 1px;padding:11px 18px 11px 37px;line-height:1.3}.tl_error{background:var(--error-bg) url(icons/error.svg) no-repeat 16px 12px}.tl_confirm{background:var(--confirm-bg) url(icons/ok.svg) no-repeat 16px 12px}.tl_info{background:var(--info-bg) url(icons/show.svg) no-repeat 16px 12px}.tl_new{background:var(--new-bg) url(icons/featured.svg) no-repeat 16px 12px}.tl_gerror,.tl_gerror a,.tl_error,.tl_error a{color:var(--red)}.tl_confirm,.tl_confirm a{color:var(--green)}.tl_info,.tl_info a{color:var(--blue)}.tl_new,.tl_new a{color:var(--orange)}.widget .tl_error,.widget .tl_confirm,.widget .tl_info,.widget .tl_new{padding:8px 10px 8px 30px;background-position:9px 9px}.tl_error strong,.tl_confirm strong,.tl_info strong,.tl_new strong{color:inherit}.tl_panel,.tl_version_panel{padding:8px 10px 8px 0;background:var(--panel-bg);border-bottom:1px solid var(--panel-border);text-align:right}.tl_panel .tl_select{text-align:left}.tl_version_panel .tl_select{max-width:280px}.tl_version_panel .tl_formbody{position:relative}.tl_img_submit{width:16px;height:16px;border:0;margin:0;padding:0;text-indent:16px;white-space:nowrap;overflow:hidden;position:relative;top:9px;vertical-align:top;cursor:pointer}.filter_apply{background:url(icons/filter-apply.svg) center center no-repeat}.filter_reset{background:url(icons/filter-reset.svg) center center no-repeat}.tl_subpanel{float:right;letter-spacing:-.31em}.tl_subpanel *{letter-spacing:normal}.tl_subpanel strong,.tl_search span{vertical-align:middle}.tl_submit_panel{min-width:32px;padding-left:6px;padding-right:3px}.tl_panel .active,.tl_panel_bottom .active,#search .active{background-color:var(--active-bg)}.tl_filter{width:100%}.tl_filter .tl_select{max-width:14.65%;margin-left:3px}.tl_submit_panel+.tl_filter{width:86%}.tl_limit{width:22%}.tl_limit .tl_select{width:52%;margin-left:3px}.tl_search{width:40%}.tl_search .tl_select{width:38%;margin-left:3px;margin-right:1%}.tl_search .tl_text{width:30%;margin-left:1%;-webkit-appearance:textfield;box-sizing:content-box}.tl_sorting{width:26%}.tl_sorting .tl_select{width:60%;margin-left:1%}.tl_xpl{padding:0 18px}.tl_tbox,.tl_box{padding:12px 0 25px;border-bottom:1px solid var(--border)}.tl_tbox:last-child,.tl_box:last-child{border-bottom:0}.tl_box h3,.tl_tbox h3,.tl_xpl h3{margin:0;padding-top:13px;height:16px;font-size:.875rem}.tl_box h4,.tl_tbox h4{margin:6px 0 0;padding:0;font-size:.875rem}.tl_tbox.theme_import{padding-left:15px;padding-right:15px}.tl_tbox.theme_import h3,.tl_tbox.theme_import h4,.tl_tbox.theme_import p{line-height:1.3}.tl_help,.tl_help *{font-size:.75rem}.tl_help,.tl_help a{margin-bottom:0;line-height:1.2;color:var(--info)}.tl_help a:hover,.tl_help a:focus,.tl_help a:active{text-decoration:underline}.tl_formbody_edit.nogrid .w50{float:none}.tl_formbody_edit.nogrid .m12{margin-top:0;margin-bottom:0}#tl_buttons+.tl_edit_form .tl_formbody_edit{border-top:1px solid var(--border)}.tl_formbody_submit{border-top:1px solid var(--panel-border)}.tl_submit_container{padding:8px 15px;background:var(--panel-bg)}.tl_submit_container .tl_submit{margin:2px 0}.maintenance_active{padding-top:12px}.maintenance_active,.maintenance_inactive{border-top:1px solid var(--border)}.maintenance_inactive:last-child{padding-bottom:9px}.maintenance_inactive .tl_tbox{border:0!important;padding:6px 15px 14px}.maintenance_inactive .tl_message{margin-top:0}.maintenance_inactive h2.sub_headline{margin:18px 15px 3px}.maintenance_inactive .tl_submit_container{background:0 0;padding:0 15px 24px;border:0}.maintenance_inactive:last-of-type .tl_submit_container{padding-bottom:10px}#tl_maintenance_mode .tl_message{margin-bottom:12px}#tl_maintenance_mode .tl_message>p{padding-top:0;padding-bottom:0;background-color:transparent;background-position-y:center}#tl_maintenance_index .tl_tbox{margin-top:-12px}@keyframes crawl-progress-bar-stripes{0%{background-position-x:1rem}}#tl_crawl .tl_message{margin-bottom:24px}#tl_crawl .tl_message>p{padding-top:0;padding-bottom:0;background-color:transparent;background-position-y:center}#tl_crawl .tl_tbox{padding-top:0}#tl_crawl .tl_tbox>div{max-width:562px}#tl_crawl .tl_checkbox_container{margin-top:9px}#tl_crawl .inner{position:relative;margin:0 18px 18px}#tl_crawl .progress{display:flex;height:20px;overflow:hidden;background-color:var(--tree-header);border-radius:2px}#tl_crawl .progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-size:10px 10px}#tl_crawl .progress-bar.running{background-color:var(--progress-running);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);animation:crawl-progress-bar-stripes 1s linear infinite}#tl_crawl .progress-bar.finished{background-color:var(--progress-finished)}#tl_crawl .progress-count{margin:6px 0 24px}#tl_crawl .results h3{font-size:.9rem;margin:18px 0 9px}#tl_crawl .results p{margin-bottom:6px}#tl_crawl .results .spinner{margin:0;padding:10px;background:url(icons/loading.svg) no-repeat left center;background-size:16px}#tl_crawl .subscriber-log{display:none;padding:5px 0;margin-bottom:0}#tl_crawl .wait{margin-top:18px}#tl_crawl .results.running .show-when-finished,#tl_crawl .results.finished .show-when-running{display:none}#tl_crawl .results.running .show-when-running,#tl_crawl .results.finished .show-when-finished{display:block}#tl_crawl .result .summary.success{color:var(--green)}#tl_crawl .result .summary.failure{color:var(--red)}#tl_crawl .result .warning{display:none;color:var(--blue)}.two-factor{border-top:1px solid var(--border);padding-bottom:9px}.two-factor h2.sub_headline{margin:18px 15px 3px}.two-factor>p{margin:0 15px 12px;line-height:1.3}.two-factor li{margin-left:2em;list-style:initial}.two-factor .qr-code{margin:0 15px}.two-factor .tl_listing_container{margin-top:0}.two-factor .widget{height:auto;margin:15px 15px 12px}.two-factor .widget .tl_error{margin:0;padding:1px 0;background:0 0;font-size:.75rem;line-height:1.25}.two-factor .tl_submit_container{background:0 0;padding:0 15px 10px;border:0}.two-factor .submit_container{clear:both;margin:0 15px 12px}.two-factor .tl_message{margin-bottom:12px}.two-factor .tl_message>p{padding-top:0;padding-bottom:0;background-color:transparent;background-position-y:center}.two-factor .tl_backup_codes>p,.two-factor .tl_trusted_devices>p{margin:0 15px 12px;line-height:1.3}.two-factor .backup-codes{max-width:224px;margin:15px 15px 24px;display:grid;grid-template-columns:repeat(2,1fr)}.two-factor .backup-codes li{margin:0;list-style:none}.two-factor .tl_trusted_devices .tl_listing tr:nth-child(odd) td{background-color:var(--table-odd)}#search{margin:18px 18px -9px;text-align:right}#search .tl_text{max-width:160px;-webkit-appearance:textfield;box-sizing:content-box}.tl_edit_preview{margin-top:18px}.tl_edit_preview img{max-width:100%;height:auto;padding:2px;border:1px solid var(--panel-border);background:var(--white)}.tl_edit_preview_enabled{position:relative;cursor:crosshair;display:inline-block}.tl_edit_preview_important_part{position:absolute;margin:-1px;border:1px solid var(--black);box-shadow:0 0 0 1px var(--white),inset 0 0 0 1px var(--white);opacity:.5}#tl_rebuild_index{padding:0 18px 18px;line-height:1.3}#index_note{margin:24px 0 18px;padding:11px 12px 12px;background:var(--note-bg);border:1px solid var(--note-border);font-size:.875rem}#index_loading{margin:0;padding:12px 12px 12px 24px;background:url(icons/loading.svg) no-repeat left center;background-size:16px;color:var(--blue)}#index_complete{margin:0;padding:12px 12px 12px 24px;background:url(icons/ok.svg) no-repeat left center;color:var(--green)}table.tl_listing{width:100%}.tl_listing_container{padding:24px 15px 18px}#tl_buttons+.tl_listing_container{padding-top:9px}.tl_listing_container.tree_view{position:relative}#paste_hint+.tl_listing_container{margin-top:30px}.tl_folder_list,.tl_folder_tlist{padding:7px 0;border-bottom:1px solid var(--border);background:var(--panel-bg);font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_folder_list,.tl_folder_tlist{font-weight:500}}.tl_folder_tlist{border-top:1px solid var(--border)}.tl_file,.tl_file_list{padding:5px 0;border-bottom:1px solid var(--border);background:var(--content-bg)}.tl_file_list{padding:7px 0}.tl_file_list .ellipsis{height:16px;text-overflow:ellipsis;overflow:hidden;padding-right:18px;word-break:break-all}.tl_right_nowrap{padding:6px 0;vertical-align:top;text-align:right;white-space:nowrap}.tl_listing.picker .tl_file,.tl_listing.picker .tl_folder,.tl_listing.picker .tl_right_nowrap,.tl_listing_container.picker .tl_content_header,.tl_listing_container.picker .tl_content{background-image:linear-gradient(90deg,transparent calc(100% - 26px),var(--tree-header) 26px)}.tl_listing.picker .tl_tree_checkbox,.tl_listing.picker .tl_tree_radio,.tl_listing_container.picker .tl_tree_checkbox,.tl_listing_container.picker .tl_tree_radio{margin-top:2px;margin-left:8px}.tl_listing.picker .tl_tree_checkbox:disabled,.tl_listing.picker .tl_tree_radio:disabled,.tl_listing_container.picker .tl_tree_checkbox:disabled,.tl_listing_container.picker .tl_tree_radio:disabled{visibility:hidden}.tl_listing_container.picker div[class^=ce_]{padding-right:24px}.tl_listing_container.picker .limit_toggler{width:calc(100% - 26px)}.tl_listing tr.odd td{background-color:var(--table-odd)}.tl_listing th,.tl_listing td{padding-left:6px!important;padding-right:6px!important}.list_view .tl_listing img.theme_preview{margin-right:9px}.tl_show{width:96%;margin:18px 2%;padding:9px 0 18px}.tl_show td{padding:4px 6px;line-height:16px;white-space:pre-line;background:var(--table-header)}.tl_show td:first-child{width:34%;white-space:normal}.tl_show td p:last-of-type{margin-bottom:0}.tl_show tr:nth-child(2n) td{background:var(--white)}.tl_show small{display:block;color:var(--info)}.tl_label{margin-right:12px;font-weight:600;white-space:nowrap}.tl_label small{font-weight:400}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_label small{font-weight:300}}.tl_empty{margin:0;padding:18px}.tl_empty_parent_view{margin:0;padding:18px 0 0}.tl_listing_container+.tl_empty{margin-top:-32px}.tl_noopt{margin:0 0 -1px}.tl_select_trigger{margin-top:-9px;padding:0 6px 3px 0;text-align:right}.tl_radio_reset{margin-top:6px;padding:0 6px 3px 0;text-align:right}.tl_select_label,.tl_radio_label{margin-right:2px;color:var(--gray);font-size:.75rem}.tl_header{padding:6px;background:var(--table-even);border-top:1px solid var(--panel-border);border-bottom:1px solid var(--panel-border)}.tl_header_table{line-height:1.3}.tl_content_header{padding:7px 6px;border-bottom:1px solid var(--border);background:var(--table-header);font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_content_header{font-weight:500}}.tl_content{padding:6px;border-bottom:1px solid var(--border);overflow:hidden;position:relative;background-color:var(--white)}.tl_content.draft>*,.tl_folder.draft>*,.tl_file.draft>*,.hover-row.draft>td{opacity:.5}.parent_view>ul{margin:0;padding:0;list-style:none}.tl_content.wrapper_stop{border-top:1px solid var(--border)}.tl_content.wrapper_start h1{margin-bottom:9px}.tl_content.indent_1{margin-left:20px}.tl_content.indent_2{margin-left:40px}.tl_content.indent_3{margin-left:60px}.tl_content.indent_4{margin-left:80px}.tl_content.indent_5{margin-left:100px}.tl_content.indent_last{border-bottom:0}.tl_content h1,.tl_content h2,.tl_content h3,.tl_content h4,.tl_content h5,.tl_content h6{font-size:.875rem}.tl_content figure{margin-bottom:1em}.tl_content img,.selector_container img,.tl_undo_preview img{max-width:320px;height:auto}.tl_content pre{margin-top:3px;margin-bottom:3px;word-break:break-all;white-space:pre-wrap}.tl_content pre.disabled{color:var(--pre-disabled)}.tl_content .ce_text a{color:var(--green)}.tl_content span.comment{color:var(--blue);display:inline-block;margin-bottom:3px}.tl_content_left{line-height:16px}.tl_content_right{position:relative;z-index:1;float:right;text-align:right;margin-left:12px;margin-bottom:-1px}.tl_right button,.tl_content_right button{margin:0;padding:0;border:0;height:16px;background:0 0}.cte_type{margin:0 0 4px;font-size:.75rem;color:var(--info);line-height:16px}.cte_type.published,.cte_type.published a{color:var(--green)}.cte_type.unpublished,.cte_type.unpublished a{color:var(--red)}.cte_type .visibility{color:var(--gray)}.limit_height{overflow:hidden;line-height:1.25}.limit_toggler{width:100%;position:absolute;bottom:0;left:0;background:var(--white);line-height:11px;text-align:center}.limit_toggler button{margin:0;padding:0;border:0;background:var(--white);width:24px;line-height:8px;color:var(--gray);outline:0;border-top-left-radius:2px;border-top-right-radius:2px}.limit_toggler button span{position:relative;top:-4px}.limit_height input[type=file]{position:relative}.limit_height select{-moz-appearance:menulist;-webkit-appearance:menulist}.limit_height label,.limit_height .checkbox_container legend,.limit_height .radio_container legend{display:inline-block;width:180px;vertical-align:top;margin-top:3px}.limit_height .widget{margin-left:0;margin-right:0}.limit_height .widget-submit{margin-left:180px}.limit_height .checkbox_container label,.limit_height .radio_container label{display:initial}.tl_folder_top{padding:5px 0;border-top:1px solid var(--tree-header-border);border-bottom:1px solid var(--tree-header-border);background:var(--tree-header)}.tl_folder{padding:5px 0;border-bottom:1px solid var(--border);background:var(--table-header)}.tl_folder.tl_folder_dropping,.tl_folder_top.tl_folder_dropping{background-color:var(--drag-bg)!important;color:var(--white)!important}.tl_folder.tl_folder_dropping a,.tl_folder_top.tl_folder_dropping a{color:inherit}.tl_listing .tl_left{flex-grow:1;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:normal}.tl_listing .tl_left.tl_left_dragging{position:absolute;background:var(--drag-bg);border-radius:10px;color:var(--white);padding:5px 10px!important;margin-left:0;text-indent:0;white-space:nowrap}.tl_listing .tl_left.tl_left_dragging .preview-image,.tl_listing .tl_left.tl_left_dragging a img{display:none}.tl_listing .tl_left.tl_left_dragging a,.tl_listing .tl_left.tl_left_dragging .tl_gray{color:inherit}.tl_listing_dragging .hover-div:not(.tl_folder):hover{background-color:transparent!important}.tl_listing .tl_left *{vertical-align:text-top}.tl_listing .tl_left a:hover{color:var(--text)}.tl_tree_xtnd .tl_file{padding-top:5px;padding-bottom:5px}.tl_tree_xtnd .tl_file .tl_left img{margin-right:2px}.tl_file_manager .preview-image{max-width:100px;max-height:75px;width:auto;height:auto;margin:0 0 2px 22px}.tl_file_manager .preview-important{max-width:80px;max-height:60px;width:auto;height:auto;margin:0 0 2px 0;vertical-align:bottom}.tl_listing .tl_right{padding:1px 0 0 9px;white-space:nowrap}@-moz-document url-prefix(){.tl_listing .tl_right{padding-top:0}}.tl_listing,.tl_listing ul{margin:0;padding:0}.tl_listing li{display:flex;margin:0;padding-left:6px;padding-right:6px;list-style-type:none}.tl_listing li.parent{display:inline;padding-left:0;padding-right:0}label.tl_change_selected{margin-right:2px;color:var(--gray);font-size:.75rem}#tl_breadcrumb{margin:0 0 12px;padding:4px 6px;overflow:hidden;background:var(--active-bg);border:1px solid var(--active-border);line-height:24px}#tl_breadcrumb li{margin:0;padding:0 3px;list-style-type:none;float:left}#tl_breadcrumb li a{display:inline-block}#tl_breadcrumb li img{width:16px;height:16px;vertical-align:-3px}.selector_container{margin-top:1px;position:relative}.selector_container>ul{margin:0 0 1px;padding:0;list-style-type:none;overflow:hidden}.selector_container>ul>li{margin:0 9px 0 0;padding:2px 0}.selector_container p{margin-bottom:1px}.selector_container ul:not(.sgallery) img{margin-right:1px;vertical-align:text-top}.selector_container .limit_height{height:auto!important;max-height:190px}.selector_container .limit_toggler{display:none}.selector_container h1,.selector_container h2,.selector_container h3,.selector_container h4{margin:0;padding:0}.selector_container pre{white-space:pre-wrap}.selector_container table.showColumns{margin:2px 0 3px}.selector_container table.sortable td{cursor:move}ul.sgallery{overflow:hidden}ul.sgallery li{min-width:100px;min-height:75px;float:left;margin:2px 4px 2px 0;padding:0;background:var(--form-button);display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.popup #tl_soverview{margin-top:15px}#tl_soverview>div{padding:4px 15px;border-bottom:1px solid var(--border)}#tl_soverview>div:last-child{border-bottom:0}#tl_soverview table{width:100%;margin-bottom:14px}#tl_messages h2,#tl_shortcuts h2,#tl_versions h2{margin:14px 0 6px}#tl_messages p:not([class]){margin-top:6px}#tl_messages .tl_error,#tl_messages .tl_confirm,#tl_messages .tl_info,#tl_messages .tl_new{padding:3px 6px 3px 21px;background-position:left 4px;background-color:transparent}#tl_shortcuts p a{text-decoration:underline}#tl_versions{margin-bottom:0}#tl_versions th{background:var(--table-header);padding:6px;border-top:1px solid var(--border)}#tl_versions th,#tl_versions td{border-bottom:1px solid var(--border)}#tl_versions td{padding:4px}#tl_versions td:first-child{white-space:nowrap}#tl_versions td:last-child{width:32px;white-space:nowrap;text-align:right}#tl_versions tr:nth-child(even) td{background-color:var(--table-odd)}#tl_versions img.undo{padding-right:2px}#tl_versions .pagination{margin-top:18px;margin-bottom:14px}.tl_chmod{width:100%}.tl_chmod th{height:18px;text-align:center;font-weight:400;background:var(--tree-header)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_chmod th{font-weight:300}}.tl_chmod td{text-align:center;background:var(--table-header)}.tl_chmod th,.tl_chmod td{width:14.2857%;padding:6px;border:1px solid var(--white)}.tl_modulewizard button,.tl_optionwizard button,.tl_key_value_wizard button,.tl_tablewizard button,.tl_listwizard button,.tl_checkbox_wizard button,.tl_metawizard button,.tl_sectionwizard button,.tl_image_size+button{margin:0;padding:0;border:0;background:0 0}.tl_modulewizard{width:100%;max-width:800px;margin-top:2px}.tl_modulewizard td{position:relative;padding:0 3px 0 0}.tl_modulewizard th{font-size:.75rem;font-weight:400;padding:0 6px 1px 0}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_modulewizard th{font-weight:300}}.tl_modulewizard td:last-child{width:1%;white-space:nowrap}.tl_modulewizard img{position:relative;top:1px}.tl_modulewizard input.mw_enable+button,.js .tl_modulewizard input.mw_enable{display:none}.js .tl_modulewizard input.mw_enable+button{display:inline;width:16px;height:16px;background:url(icons/invisible.svg) 0 0 no-repeat}.js .tl_modulewizard input.mw_enable:checked+button{background-image:url(icons/visible.svg)}.tl_modulewizard img.mw_enable{display:none}.js .tl_modulewizard img.mw_enable{display:inline;margin-right:1px}.tl_optionwizard{width:100%;max-width:600px}.tl_key_value_wizard{width:100%;max-width:450px}.tl_optionwizard,.tl_key_value_wizard{margin-top:2px}.tl_optionwizard label,.tl_key_value_wizard label{margin-right:3px}.tl_optionwizard td,.tl_key_value_wizard td{padding:0 3px 0 0}.tl_optionwizard th,.tl_key_value_wizard th{font-size:.75rem;font-weight:400;padding:0 6px 1px 0}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_optionwizard th,.tl_key_value_wizard th{font-weight:300}}.tl_optionwizard td:nth-child(n+3),.tl_key_value_wizard td:nth-child(n+3){width:1%;white-space:nowrap}.tl_optionwizard img,.tl_key_value_wizard img{position:relative;top:1px}.tl_optionwizard .fw_checkbox,.tl_key_value_wizard .fw_checkbox{margin:0 1px}#ctrl_allowedAttributes{max-width:none}#ctrl_allowedAttributes td:first-child{width:100px}#tl_tablewizard{margin-top:2px;padding-bottom:2px;overflow:auto}.tl_tablewizard td{padding:0 3px 0 0}.tl_tablewizard thead td{padding-bottom:3px;text-align:center;white-space:nowrap}.tl_tablewizard tbody td:last-child{white-space:nowrap}.tl_tablewizard td.tcontainer{vertical-align:top}.tl_listwizard .tl_text{width:78%}.tl_checkbox_wizard .fixed{display:block;margin-top:1px}.tl_checkbox_wizard .sortable span{display:block}.tl_checkbox_wizard .sortable img{vertical-align:bottom}.tl_metawizard{margin:3px 0}.tl_metawizard li{overflow:hidden;margin-bottom:2px;padding:9px;background:var(--panel-bg)}.tl_metawizard li:nth-child(even){background:var(--table-even)}.tl_metawizard label{float:left;width:18%;margin-top:9px}.tl_metawizard .tl_text,.tl_metawizard .tl_textarea{float:left;width:calc(82% - 20px);margin:1px 0}.tl_metawizard .tl_textarea{resize:vertical}.tl_metawizard .tl_text+a{position:relative;top:7px;margin-left:4px}.tl_metawizard br{clear:left}.tl_metawizard .lang{display:block;margin:3px 0 9px;font-weight:600;position:relative}.tl_metawizard .lang button{position:absolute;right:0;top:-1px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_metawizard .lang{font-weight:500}}.tl_sectionwizard{margin-top:2px;width:100%;max-width:680px}.tl_sectionwizard td{width:25%;position:relative;padding:0 3px 0 0}.tl_sectionwizard th{font-size:.75rem;font-weight:400;padding:0 4px 1px 0}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_sectionwizard th{font-weight:300}}.tl_sectionwizard td:last-child{white-space:nowrap}#paste_hint{position:relative;z-index:1}.tl_message+#paste_hint{margin-top:-12px}#paste_hint p{position:absolute;font-family:"Architects Daughter",cursive;font-size:1rem;color:var(--paste-hint);top:0;right:30px;padding:0 36px 24px 0;background:url(icons/arrow_right.svg) bottom right no-repeat;transform:rotate(-1deg)}.sort_hint{position:absolute;font-family:"Architects Daughter",cursive;font-size:1rem;color:var(--paste-hint);top:-50px;left:160px;padding:0 6px 24px 42px;background:url(icons/arrow_left.svg) 6px bottom no-repeat;transform:rotate(-2deg)}.widget+.subpal .sort_hint{left:260px}.widget+.widget .sort_hint{left:320px}.serp-preview{max-width:600px;margin:2px 0;padding:7px 7px 3px;font-family:Arial,sans-serif;font-weight:400;color:var(--serp-preview);background:var(--panel-bg);border-radius:3px}.serp-preview p{margin-bottom:4px;line-height:1.5}.serp-preview .title{font-size:18px;color:var(--serp-preview-title);line-height:normal}.serp-preview .description:empty{display:none}#tl_ajaxBox{width:300px;padding:2em;box-sizing:border-box;position:absolute;left:50%;margin-left:-150px;background:var(--white) url(icons/loading.svg) no-repeat right 2em center;border:2px solid var(--black);border-radius:2px;font-size:1rem;text-align:left}#tl_ajaxOverlay{width:100%;height:100%;position:absolute;top:0;left:0;background:var(--white);opacity:.5}.ce_gallery ul{overflow:hidden}.ce_gallery li{float:left;margin:0 6px 6px 0}.drag-handle{cursor:move}ul.sortable li{cursor:move;position:relative}ul.sortable li .dirname{display:none}ul.sortable li:hover .dirname{display:inline}ul.sortable button{position:absolute;top:0;right:0;border:0;border-radius:2px;background:var(--form-button);margin:0;padding:0 0 3px;font-size:22px;line-height:9px;cursor:pointer;transition:all .1s linear}ul.sortable button:hover{background:var(--form-button-hover)}ul.sortable button[disabled]{color:var(--gray);cursor:not-allowed}ul.sortable button[disabled]:hover{background:rgba(255,255,255,.7)}#picker-menu{padding:9px 6px 0;border-bottom:1px solid var(--panel-border)}#picker-menu>ul{margin:0;padding:0;list-style:none}#picker-menu li{display:inline-block;padding:8px 0;background-color:var(--table-even);border:1px solid var(--panel-border);border-radius:2px 2px 0 0;position:relative;top:1px}#picker-menu li:hover{background-color:var(--panel-bg)}#picker-menu li.current{background-color:var(--panel-bg);border-bottom-color:var(--panel-bg)}#picker-menu a{padding:3px 12px 3px 32px;background:url(icons/manager.svg) 12px center no-repeat}#picker-menu a:hover{color:var(--text)}#picker-menu a.pagePicker{background-image:url(icons/pagemounts.svg);background-size:16px}#picker-menu a.filePicker{background-image:url(icons/filemounts.svg);background-size:14px}#picker-menu a.articlePicker{background-image:url(icons/articles.svg);background-size:16px}#picker-menu a.close{background-image:url(icons/back.svg)}.ace_editor{padding:3px;z-index:0}.ace_editor,.ace_editor *{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important;font-size:.75rem!important;color:var(--text)}.ace-fullsize{overflow:hidden!important}.ace-fullsize .ace_editor{position:fixed!important;top:0;right:0;bottom:0;left:0;width:auto!important;height:auto!important;margin:0;border:0;z-index:10000}div.mce-edit-area{width:99.9%}time[title]{cursor:help}.float_left{float:left}.float_right{float:right}.header_icon,.header_clipboard,.header_back,.header_new,.header_rss,.header_edit_all,.header_delete_all,.header_new_folder,.header_css_import,.header_theme_import,.header_store,.header_toggle,.header_sync{padding:3px 0 3px 21px;background-position:left center;background-repeat:no-repeat;margin-left:15px}.list_icon{margin-left:-3px;padding-left:20px;background-position:left center;background-repeat:no-repeat}.list_icon_new{width:16px;background-position:1px center;background-repeat:no-repeat}.header_clipboard{background-image:url(icons/clipboard.svg)}.header_back{background-image:url(icons/back.svg)}.header_new{background-image:url(icons/new.svg)}.header_rss{background-image:url(icons/rss.svg)}.header_edit_all{background-image:url(icons/all.svg)}.header_delete_all{background-image:url(icons/deleteAll.svg)}.header_new_folder{padding-left:24px;background-image:url(icons/newfolder.svg)}.header_css_import{background-image:url(icons/cssimport.svg)}.header_theme_import{background-image:url(icons/theme_import.svg)}.header_store{padding-left:18px;background-image:url(icons/store.svg)}.header_toggle{background-image:url(icons/folPlus.svg)}.header_sync{background-image:url(icons/sync.svg)}.tl_text_trbl,.tl_imageSize_0,.tl_imageSize_1,#ctrl_playerSize input{background:url(icons/hints.svg) no-repeat right 1px top 2px}#ctrl_playerSize_1,.tl_imageSize_1{background-position:right 1px top -28px!important}.trbl_top{background-position:right 1px top -59px!important}.trbl_right{background-position:right 1px top -89px!important}.trbl_bottom{background-position:right 1px top -119px!important}.trbl_left{background-position:right 1px top -149px!important}#ctrl_shadowsize_top{background-position:right 1px top -179px!important}#ctrl_shadowsize_right{background-position:right 1px top -209px!important}#ctrl_shadowsize_bottom{background-position:right 1px top -238px!important}#ctrl_shadowsize_left{background-position:right 1px top -269px!important}#ctrl_borderradius_top{background-position:left -299px!important}#ctrl_borderradius_right{background-position:right 1px top -329px!important}#ctrl_borderradius_bottom{background-position:right 1px top -352px!important}#ctrl_borderradius_left{background-position:left -382px!important}label.error,legend.error,.tl_checkbox_container.error legend{color:var(--red)}.tl_tbox .tl_error,.tl_box .tl_error{background:0 0;padding:0;margin-bottom:0;font-size:.75rem}.tl_formbody_edit>.tl_error{margin-top:9px}.broken-image{display:inline-block;padding:12px 12px 12px 30px;background:var(--error-bg) url(icons/error.svg) no-repeat 9px center;color:var(--red);text-indent:0}fieldset.tl_tbox,fieldset.tl_box{margin-top:5px;padding-top:0;border-top:none;border-left:0;border-right:0}fieldset.tl_tbox.nolegend,fieldset.tl_box.nolegend{border-top:0}fieldset.tl_tbox>legend,fieldset.tl_box>legend{box-sizing:border-box;color:var(--legend);padding:9px 12px 9px 28px;background:url(icons/navcol.svg) 13px 10px no-repeat;cursor:pointer}fieldset.collapsed{margin-bottom:0;padding-bottom:5px}fieldset.collapsed div{display:none!important}fieldset.collapsed>legend{background:url(icons/navexp.svg) 13px 10px no-repeat}#tl_maintenance_cache table{width:100%}#tl_maintenance_cache th,#tl_maintenance_cache td{border-bottom:1px solid var(--border)}#tl_maintenance_cache th{background:var(--table-header);padding:6px;border-top:1px solid var(--border)}#tl_maintenance_cache td{padding:6px;line-height:1.2}#tl_maintenance_cache tr:nth-child(even) td{background:var(--table-odd)}#tl_maintenance_cache td span{color:var(--gray)}#tl_maintenance_cache td:first-child{width:16px}.mac #tl_maintenance_cache td:first-child .tl_checkbox{top:-2px}#tl_maintenance_cache .nw{white-space:nowrap}#tl_maintenance_cache .tl_checkbox_container{margin-top:12px}#tl_maintenance_cache .tl_checkbox_container label{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tl_maintenance_cache .tl_checkbox_container label{font-weight:500}}.pagination{overflow:hidden;background:var(--table-header);margin-bottom:18px;border:solid var(--border);border-width:1px 0;padding:12px 15px}.pagination ul{width:60%;float:right;text-align:right;padding-right:3px}.pagination p{width:30%;float:left;margin-bottom:0}.pagination li{display:inline;padding-right:3px}.pagination .active{color:var(--gray)}.pagination-lp{margin-left:15px;margin-right:15px}#sync-results{overflow:hidden;margin:18px 15px 0}#sync-results p{margin-bottom:0}#sync-results .left{float:left;padding:2px 0}#sync-results .right{float:right}#result-list{margin:15px}#result-list .tl_error,#result-list .tl_confirm,#result-list .tl_info,#result-list .tl_new{padding:3px 0;background:0 0}.dropzone{margin:2px 0;min-height:auto!important;border:3px dashed var(--panel-border)!important;border-radius:2px}.dropzone-filetree{display:none;position:absolute;top:0;left:0;width:100%;height:100%;opacity:.8;z-index:1}.dropzone-filetree-enabled{display:block}.dz-message span{font-size:1.3125rem;color:var(--gray)}.tox-tinymce{margin:3px 0;border-radius:2px!important}.tl_undo_header{max-width:880px;display:grid;grid-template-columns:2fr 2fr 3fr 3fr;grid-column-gap:24px}.hover-row:hover .tl_undo_header{background-color:var(--hover-row)!important}.tl_undo_preview{position:relative;padding:22px 0 10px}.tl_undo_preview td{padding-left:0!important;padding-right:32px!important}.tl_listing .odd .tl_undo_preview .limit_toggler{background-color:var(--table-odd)}@media (max-width:991px){#header{width:100%;padding:0;position:fixed;top:0;z-index:2;transition:transform .2s ease;-webkit-transform:none;transform:none;will-change:transform}#container{display:block;padding-top:40px;overflow:hidden}#main,#left{float:none;overflow:hidden}#main{width:100%!important;position:relative;transition:transform .2s ease;-webkit-transform:none;transform:none;will-change:transform}.show-navigation #main{-webkit-transform:translateX(240px);transform:translateX(240px)}#left{visibility:hidden;position:absolute;top:40px;width:240px;transition:transform .2s ease,visibility .2s ease;-webkit-transform:translateX(-240px);transform:translateX(-240px);will-change:transform,visibility}.show-navigation #left{visibility:visible;-webkit-transform:none;transform:none}#tmenu .burger{display:inline}}@media (max-width:767px){#header.down{-webkit-transform:translateY(-40px);transform:translateY(-40px)}#header h1 a{min-width:22px;padding:12px}#header h1 a .app-title{display:none}#header h1 a .badge-title{margin-left:32px}#tmenu>li>a{width:16px;margin-bottom:-2px;position:relative;overflow:hidden;white-space:nowrap;text-indent:28px;background-size:18px!important}#tmenu sup{top:6px;font-size:.5rem}#tmenu .icon-debug{background:url(icons/debug.svg) center center no-repeat}#tmenu .icon-preview{background:url(icons/preview.svg) center center no-repeat}#tmenu .profile button{width:40px;margin:0 0 -2px;padding-right:12px;overflow:hidden;white-space:nowrap;text-indent:28px;background:url(icons/profile.svg) center center no-repeat;background-size:18px}#main .content{margin:15px 10px}#main_headline{margin:13px 0;padding:0 11px}div.tl_tbox,div.tl_box{position:relative}.tl_content_left{width:100%;float:none}.showColumns th,.showColumns td{display:block}.showColumns th:empty{display:none}.tl_label{white-space:normal}.list_view .tl_listing img.theme_preview{display:none}.tl_filter{box-sizing:border-box;padding:0 3px 0 7px}.tl_filter strong{display:none}.tl_filter .tl_select{display:block;max-width:100%}.tl_search{width:76%;max-width:283px}.tl_search .tl_select{width:36%}.tl_search .tl_text{width:26%}.tl_sorting{width:60%;max-width:212px}.tl_limit{width:50%;max-width:177px}.tl_submit_panel{float:right;z-index:1}input.tl_submit{margin-top:3px;margin-bottom:3px;padding-left:6px!important;padding-right:7px!important}.tl_listing .tl_left,.tl_show td{word-break:break-word}#tl_breadcrumb li{padding:3px}#tl_versions{display:none}.tl_version_panel .tl_select{width:44%}.tl_modulewizard td:first-child{width:1%}.tl_modulewizard td:first-child .tl_select{max-width:52vw}#paste_hint,.sort_hint{display:none}#tl_maintenance_cache table{width:100%}#tl_maintenance_cache tr th:last-child,#tl_maintenance_cache tr td:last-child{display:none}.tl_file_list .ellipsis{padding-right:10px}.tl_undo_header{grid-template-columns:2fr 3fr}.tl_undo_header div:not(.tstamp):not(.source){display:none}}@media (max-width:599px){.tl_metawizard label{width:auto;float:none;font-size:.9em;display:block;margin-top:3px}.tl_metawizard .tl_text{width:100%}}@media (max-width:479px){.tl_modulewizard td:first-child .tl_select{max-width:48vw}} \ No newline at end of file +:root{--icon-logo:url("icons/logo.svg");--icon-profile:url("icons/profile_small.svg");--icon-security:url("icons/shield_small.svg");--icon-favorites:url("icons/favorites_small.svg");--icon-color-scheme:url("icons/color-scheme_small.svg");--icon-logout:url("icons/exit.svg")}html[data-color-scheme=dark]{--icon-logo:url("icons-dark/logo.svg");--icon-profile:url("icons-dark/profile_small.svg");--icon-security:url("icons-dark/shield_small.svg");--icon-favorites:url("icons-dark/favorites_small.svg");--icon-color-scheme:url("icons-dark/color-scheme_small.svg");--icon-logout:url("icons-dark/exit.svg")}body{background:var(--body-bg);overflow-y:scroll}body.popup{background:var(--content-bg)}#header{min-height:40px;text-align:left;background:var(--header-bg)}#header h1{position:absolute}#header h1 a{display:block;height:16px;padding:12px 12px 12px 42px;background:var(--icon-logo) no-repeat 10px center;font-weight:400}#header h1 a .app-title{font-size:17px;color:var(--header-text)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#header h1 a{font-weight:300}}#tmenu{display:flex;justify-content:flex-end}#tmenu li{position:relative}#tmenu a,#tmenu .profile button{margin:0;padding:13px 12px;display:inline-block}#tmenu sup{position:absolute;top:5px;left:20px;font-size:.6rem;background:var(--header-text);padding:2px;border-radius:2px;text-indent:0;font-weight:400}#tmenu .burger{display:none}#tmenu .burger button{margin-right:-2px;padding:8px 10px 9px;background:0 0;border:0;vertical-align:top}#tmenu .burger svg{margin-bottom:-1px;vertical-align:middle}#tmenu .profile button{position:relative;cursor:pointer;font-size:.875rem;font-weight:400;border:0;padding-right:26px;background:url(icons/chevron-down.svg) right 9px top 14px no-repeat}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tmenu .profile button{font-weight:300}}#tmenu a,#tmenu .profile button,#tmenu .burger button{color:var(--header-text);transition:background-color .3s ease}#tmenu a:hover,#tmenu a.hover,#tmenu li:hover .profile button,#tmenu .active .profile button,#tmenu .burger button:hover{background-color:var(--header-bg-hover)}#tmenu ul.menu_level_1{min-width:150px;position:absolute;right:6px;margin-top:5px;background:var(--content-bg);border:1px solid var(--content-border);box-shadow:0 1px 6px rgba(0,0,0,.2);z-index:2;color:var(--text);text-align:left;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}#tmenu .active ul.menu_level_1{opacity:1;visibility:visible}#tmenu ul.menu_level_1 li a{display:block;color:inherit;padding:6px 20px 6px 40px;white-space:nowrap}#tmenu ul.menu_level_1 li a:hover{background-color:var(--nav-hover-bg)}#tmenu ul.menu_level_1 .info{color:var(--info);padding:15px 20px;border-bottom:1px solid var(--border);line-height:1.4;margin-bottom:9px;white-space:nowrap}#tmenu ul.menu_level_1 strong{color:var(--text);display:block}#tmenu ul.menu_level_1:before{content:"";display:block;width:0;height:0;position:absolute;right:9px;top:-14px;border:7px solid transparent;border-bottom-color:var(--content-bg)}#tmenu ul.menu_level_1:after{content:"";display:block;width:9px;height:9px;position:absolute;top:-6px;right:11px;border-top:1px solid var(--content-border);border-right:1px solid var(--content-border);transform:rotateZ(-45deg)}#tmenu ul.menu_level_1 .color-scheme{margin-top:9px;padding:6px 0;border-top:1px solid var(--border)}#tmenu .icon-alert,#tmenu .icon-favorite,#tmenu .icon-manual{width:16px;margin-bottom:-2px;position:relative;overflow:hidden;white-space:nowrap;text-indent:28px}#tmenu .icon-alert{background:url(icons/alert.svg) center center no-repeat}#tmenu .icon-favorite{background:url(icons/favorite.svg) center center no-repeat}#tmenu .icon-favorite--active{background:url(icons/favorite_active.svg) center center no-repeat}#tmenu .icon-manual{background:url(icons/manual.svg) center center no-repeat}#tmenu .icon-color-scheme{background:var(--icon-color-scheme) 20px center no-repeat}#tmenu .icon-profile{background:var(--icon-profile) 20px center no-repeat}#tmenu .icon-security{background:var(--icon-security) 20px center no-repeat}#tmenu .icon-favorites{background:var(--icon-favorites) 20px center no-repeat}#tmenu .icon-logout{background:var(--icon-logout) 20px center no-repeat}#container{display:flex;min-height:calc(100vh - 40px)}.popup #container{padding:0;width:auto;min-height:0;max-width:none}#left{width:210px;background:var(--nav-bg);display:flex;flex-direction:column}#left .version{margin-top:4em;padding:15px 18px;font-size:.75rem;line-height:1.4}#left .version,#left .version a{color:var(--nav-group)}#main{width:calc(100% - 210px);display:flex;flex-direction:column}.popup #main{float:none;width:auto;max-width:none;margin:0;padding:0;border:0;display:initial}#main .content{margin:0 15px 15px}#main .content{background:var(--content-bg);border:1px solid var(--content-border)}.popup #main .content{margin:0;border:0;overflow:auto}#tl_navigation{flex-grow:1}#tl_navigation .menu_level_0{padding-top:20px}#tl_navigation .menu_level_0>li:after{content:"";width:calc(100% - 30px);height:1px;display:block;margin:15px auto;background:var(--nav-separator)}#tl_navigation .menu_level_0>li.last:after{display:none}#tl_navigation .menu_level_0 a[class^=group-]{display:block;margin:0 15px;padding:3px 3px 3px 22px;color:var(--nav-group);font-size:.75rem;text-transform:uppercase;font-weight:500}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tl_navigation .menu_level_0 a[class^=group-]{font-weight:400}}#tl_navigation .group-favorites{background:url(icons/favorites_group.svg) 3px 2px no-repeat}#tl_navigation .group-content{background:url(icons/content.svg) 3px 2px no-repeat}#tl_navigation .group-design{background:url(icons/monitor.svg) 3px 2px no-repeat}#tl_navigation .group-accounts{background:url(icons/person.svg) 3px 2px no-repeat}#tl_navigation .group-system{background:url(icons/wrench.svg) 3px 2px no-repeat}#tl_navigation .menu_level_1{padding-top:5px}#tl_navigation [class^=menu_level_] a{display:block;padding:5px 33px 5px 37px;font-weight:400;color:var(--nav);transition:color .2s ease}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tl_navigation [class^=menu_level_] a{font-weight:300}}#tl_navigation [class^=menu_level_]>li.current>a{background-color:var(--nav-current);border-left:4px solid var(--contao)}#tl_navigation .menu_level_1>li.current>a{padding-left:33px}#tl_navigation .menu_level_2 a{padding-left:49px}#tl_navigation .menu_level_2>li.current>a{padding-left:45px}#tl_navigation .menu_level_3 a{padding-left:61px}#tl_navigation .menu_level_3>li.current>a{padding-left:57px}#tl_navigation .menu_level_4 a{padding-left:73px}#tl_navigation .menu_level_4>li.current>a{padding-left:69px}#tl_navigation .menu_level_5 a{padding-left:85px}#tl_navigation .menu_level_5>li.current>a{padding-left:81px}#tl_navigation .menu_level_2 a{font-size:.75rem}#tl_navigation .menu_level_1 li.has-children:not(.first){padding-top:5px}#tl_navigation .menu_level_1 li.has-children:not(.last){padding-bottom:5px}#tl_navigation .menu_level_1 a:hover,#tl_navigation .menu_level_1 li.current a{color:var(--nav-hover)}#tl_navigation .collapsed .menu_level_1{display:none}#tl_buttons{margin:0;padding:12px 15px;text-align:right}.toggleWrap{cursor:pointer}.opacity{-moz-opacity:.8;opacity:.8}#main_headline{margin:18px 16px;font-size:1.1rem;display:flex}.popup #main_headline{display:none}#main_headline span{display:inline-block;max-width:max-content;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:22px;flex:1 0 0}#main_headline span:nth-child(even){font-weight:400}#main_headline span+span::before{content:"\A0› ";font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#main_headline span:nth-child(even){font-weight:300}#main_headline span+span::before{font-weight:500}}h2.sub_headline{margin:3px 18px;padding:7px 0}.label-info{color:var(--gray);padding-left:3px}.label-date{color:var(--gray);padding-right:3px}.tl_gerror{margin:12px;padding:3px 0 3px 22px;background:url(icons/error.svg) no-repeat left center}.tl_error,.tl_confirm,.tl_info,.tl_new{margin:0 0 1px;padding:11px 18px 11px 32px;line-height:1.3}.tl_error{background:var(--error-bg) url(icons/error.svg) no-repeat 11px 12px}.tl_confirm{background:var(--confirm-bg) url(icons/ok.svg) no-repeat 11px 12px}.tl_info{background:var(--info-bg) url(icons/show.svg) no-repeat 11px 12px}.tl_new{background:var(--new-bg) url(icons/featured.svg) no-repeat 11px 12px}.tl_gerror,.tl_gerror a,.tl_error,.tl_error a{color:var(--red)}.tl_gerror a,.tl_error a{text-decoration:underline}.tl_confirm,.tl_confirm a{color:var(--green)}.tl_info,.tl_info a{color:var(--blue)}.tl_new,.tl_new a{color:var(--orange)}.widget .tl_error,.widget .tl_confirm,.widget .tl_info,.widget .tl_new{padding:8px 10px 8px 30px;background-position:9px 9px}.tl_error strong,.tl_confirm strong,.tl_info strong,.tl_new strong{color:inherit}.tl_panel,.tl_version_panel{padding:4px 12px;background:var(--panel-bg);border-bottom:1px solid var(--content-border);text-align:right}.tl_version_panel{padding:8px 12px}.tl_panel .tl_select{text-align:left}.tl_version_panel .tl_select{max-width:280px}.tl_version_panel .tl_formbody{position:relative}.tl_img_submit{width:16px;height:16px;border:0;margin:0;padding:0;text-indent:16px;white-space:nowrap;overflow:hidden;position:relative;top:9px;vertical-align:top;cursor:pointer}.filter_apply{background:url(icons/filter-apply.svg) center center no-repeat}.filter_reset{background:url(icons/filter-reset.svg) center center no-repeat}.tl_subpanel{float:right;letter-spacing:-.31em}.tl_subpanel *{letter-spacing:normal}.tl_subpanel strong,.tl_search span{vertical-align:middle}.tl_submit_panel{min-width:32px;padding-left:6px;padding-right:3px}.tl_panel .active,.tl_panel_bottom .active,#search .active{background-color:var(--active-bg);border:1px solid var(--active-border)}.tl_filter{width:100%}.tl_filter .tl_select{max-width:14.65%;margin-left:3px}.tl_submit_panel+.tl_filter{width:86%}.tl_limit{width:22%}.tl_limit .tl_select{width:52%;margin-left:3px}.tl_search{width:40%}.tl_search .tl_select{width:38%;margin-left:3px;margin-right:1%}.tl_search .tl_text{width:30%;margin-left:1%;-webkit-appearance:textfield;box-sizing:content-box}.tl_sorting{width:26%}.tl_sorting .tl_select{width:60%;margin-left:1%}.tl_xpl{padding:0 18px}.tl_tbox,.tl_box{padding:12px 0 25px;border-bottom:1px solid var(--border)}.tl_tbox:last-child,.tl_box:last-child{border-bottom:0}.tl_box h3,.tl_tbox h3,.tl_xpl h3{margin:0;padding-top:13px;height:16px;font-size:.875rem}.tl_box h4,.tl_tbox h4{margin:6px 0 0;padding:0;font-size:.875rem}.tl_tbox.theme_import{padding-left:15px;padding-right:15px}.tl_tbox.theme_import h3,.tl_tbox.theme_import h4,.tl_tbox.theme_import p{line-height:1.3}.tl_help,.tl_help *{font-size:.75rem}.tl_help,.tl_help a{margin-bottom:0;line-height:1.2;color:var(--info)}.tl_help a:hover,.tl_help a:focus,.tl_help a:active{text-decoration:underline}.tl_formbody_edit.nogrid .w50{float:none}.tl_formbody_edit.nogrid .m12{margin-top:0;margin-bottom:0}#tl_buttons+.tl_edit_form .tl_formbody_edit{border-top:1px solid var(--border)}.tl_formbody_submit{border-top:1px solid var(--content-border)}.tl_submit_container{padding:8px 12px;background:var(--panel-bg)}.tl_submit_container .tl_submit{margin:2px 0}.maintenance_active{padding-top:12px}.maintenance_active,.maintenance_inactive{border-top:1px solid var(--border)}.maintenance_inactive:last-child{padding-bottom:9px}.maintenance_inactive .tl_tbox{border:0!important;padding:6px 15px 14px}.maintenance_inactive .tl_message{margin-top:0}.maintenance_inactive h2.sub_headline{margin:18px 15px 3px}.maintenance_inactive .tl_submit_container{background:0 0;padding:0 15px 24px;border:0}.maintenance_inactive:last-of-type .tl_submit_container{padding-bottom:10px}#tl_maintenance_mode .tl_message{margin-bottom:12px}#tl_maintenance_mode .tl_message>p{padding-top:0;padding-bottom:0;background-color:transparent;background-position-y:center}#tl_maintenance_index .tl_tbox{margin-top:-12px}@keyframes crawl-progress-bar-stripes{0%{background-position-x:1rem}}#tl_crawl .tl_message{margin-bottom:24px}#tl_crawl .tl_message>p{padding-top:0;padding-bottom:0;background-color:transparent;background-position-y:center}#tl_crawl .tl_tbox{padding-top:0}#tl_crawl .tl_tbox>div{max-width:562px}#tl_crawl .tl_checkbox_container{margin-top:9px}#tl_crawl .inner{position:relative;margin:0 18px 18px}#tl_crawl .progress{display:flex;height:20px;overflow:hidden;background-color:var(--tree-header);border-radius:2px}#tl_crawl .progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-size:10px 10px}#tl_crawl .progress-bar.running{background-color:var(--progress-running);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);animation:crawl-progress-bar-stripes 1s linear infinite}#tl_crawl .progress-bar.finished{background-color:var(--progress-finished)}#tl_crawl .progress-count{margin:6px 0 24px}#tl_crawl .results h3{font-size:.9rem;margin:18px 0 9px}#tl_crawl .results p{margin-bottom:6px}#tl_crawl .results .spinner{margin:0;padding:10px;background:url(icons/loading.svg) no-repeat left center;background-size:16px}#tl_crawl .subscriber-log{display:none;padding:5px 0;margin-bottom:0}#tl_crawl .wait{margin-top:18px}#tl_crawl .results.running .show-when-finished,#tl_crawl .results.finished .show-when-running{display:none}#tl_crawl .results.running .show-when-running,#tl_crawl .results.finished .show-when-finished{display:block}#tl_crawl .result .summary.success{color:var(--green)}#tl_crawl .result .summary.failure{color:var(--red)}#tl_crawl .result .warning{display:none;color:var(--blue)}.two-factor{border-top:1px solid var(--border);padding-bottom:9px}.two-factor h2.sub_headline{margin:18px 15px 3px}.two-factor>p{margin:0 15px 12px;line-height:1.3}.two-factor li{margin-left:2em;list-style:initial}.two-factor .qr-code{margin:0 15px}.two-factor .tl_listing_container{margin-top:6px}.two-factor .widget{height:auto;margin:15px 15px 12px}.two-factor .widget .tl_error{margin:0;padding:1px 0;background:0 0;font-size:.75rem;line-height:1.25}.two-factor .tl_submit_container{background:0 0;padding:0 15px 10px;border:0}.two-factor .submit_container{clear:both;margin:0 15px 12px}.two-factor .tl_message{margin:0 15px 12px}.two-factor .tl_message>p{padding:0 3px 0 27px;background-color:transparent;background-position:3px center}.two-factor .tl_backup_codes>p,.two-factor .tl_trusted_devices>p{margin:0 15px 12px;line-height:1.3}.two-factor .backup-codes{max-width:224px;margin:15px 15px 24px;padding:0;display:grid;grid-template-columns:repeat(2,1fr)}.two-factor .backup-codes li{margin:0;list-style:none}#search{margin:18px 18px -9px;text-align:right}#search .tl_text{max-width:160px;-webkit-appearance:textfield;box-sizing:content-box}.tl_edit_preview{margin-top:18px}.tl_edit_preview img{max-width:100%;height:auto;padding:2px;border:1px solid var(--content-border);background:var(--white)}.tl_edit_preview_enabled{position:relative;cursor:crosshair;display:inline-block}.tl_edit_preview_important_part{position:absolute;margin:-1px;border:1px solid var(--black);box-shadow:0 0 0 1px var(--white),inset 0 0 0 1px var(--white);opacity:.5}#tl_rebuild_index{padding:0 18px 18px;line-height:1.3}#index_loading{margin:0;padding:12px 12px 12px 24px;background:url(icons/loading.svg) no-repeat left center;background-size:16px;color:var(--blue)}#index_complete{margin:0;padding:12px 12px 12px 24px;background:url(icons/ok.svg) no-repeat left center;color:var(--green)}table.tl_listing{width:100%}.tl_listing_container{margin:18px 0;padding:0 15px}#tl_buttons+.tl_listing_container,#tl_buttons+.tl_form .tl_listing_container{margin-top:12px}#paste_hint+.tl_listing_container{margin-top:36px}.tl_folder_list,.tl_folder_tlist{padding:6px;border-bottom:1px solid var(--border);background:var(--table-header);font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_folder_list,.tl_folder_tlist{font-weight:500}}.tl_folder_tlist{border-top:1px solid var(--border)}.tl_file,.tl_file_list{padding:5px 6px;border-bottom:1px solid var(--border);background:var(--content-bg)}.tl_file_list .ellipsis{height:16px;text-overflow:ellipsis;overflow:hidden;padding-right:18px;word-break:break-all}.tl_right_nowrap{padding:6px;vertical-align:top;text-align:right;white-space:nowrap}.tl_listing.picker .tl_file,.tl_listing.picker .tl_folder,.tl_listing.picker .tl_right_nowrap,.tl_listing_container.picker .tl_content_header,.tl_listing_container.picker .tl_content{background-image:linear-gradient(90deg,transparent calc(100% - 26px),var(--tree-header) 26px)}.tl_listing.picker .tl_tree_checkbox,.tl_listing.picker .tl_tree_radio,.tl_listing_container.picker .tl_tree_checkbox,.tl_listing_container.picker .tl_tree_radio{margin-top:2px;margin-left:8px}.tl_listing.picker .tl_tree_checkbox:disabled,.tl_listing.picker .tl_tree_radio:disabled,.tl_listing_container.picker .tl_tree_checkbox:disabled,.tl_listing_container.picker .tl_tree_radio:disabled{visibility:hidden}.tl_listing_container.picker div[class^=ce_]{padding-right:24px}.tl_listing_container.picker .limit_toggler{width:calc(100% - 26px)}.list_view .tl_listing img.theme_preview{margin-right:9px}.tl_show{width:96%;margin:18px 2%;padding:9px 0 18px}.tl_show th,.tl_show td{line-height:16px;white-space:pre-line}.tl_show td:first-child{width:34%;white-space:normal}.tl_show td p:last-of-type{margin-bottom:0}.tl_show small{display:block;color:var(--info)}.tl_label{margin-right:12px;font-weight:600;white-space:nowrap}.tl_label small{font-weight:400}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_label{font-weight:500}.tl_label small{font-weight:300}}.tl_empty{margin:0;padding:18px}.tl_empty_parent_view{margin:0;padding:18px 0 0}.tl_listing_container+.tl_empty{margin-top:-18px}.tl_noopt{margin:0 0 -1px}.tl_select_trigger{margin-top:-9px;padding:0 6px 3px 0;text-align:right}.tl_radio_reset{margin-top:6px;padding:0 6px 3px 0;text-align:right}.tl_select_label,.tl_radio_label{margin-right:2px;color:var(--gray);font-size:.75rem}.tl_header{margin-bottom:18px;padding:10px;background:var(--table-header)}.tl_header_table{line-height:1.3}.tl_content_header{margin-top:18px;padding:7px 6px;border-bottom:1px solid var(--border);background:var(--table-header);font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_content_header{font-weight:500}}.as-grid .tl_content_header{margin-top:24px;padding:0 1px;border:0;background-color:transparent;font-size:1rem}.tl_content{border-bottom:1px solid var(--border);overflow:hidden;position:relative}.tl_content .inside{padding:6px;background-color:var(--content-bg)}.tl_content.draft>*,.tl_folder.draft>*,.tl_file.draft>*,.hover-row.draft>td{opacity:.5}.as-grid .tl_content{margin-top:18px;padding:0;border:1px solid var(--border);background-color:var(--content-bg)}.as-grid .tl_content .inside{display:grid;grid-template-columns:1fr auto}.as-grid .tl_content_header+.tl_content{margin-top:12px}.parent_view>ul{margin:0;padding:0;list-style:none}.parent_view:not(.as-grid)>ul{background-color:var(--table-header)}.tl_content.indent_1{margin-left:20px}.tl_content.indent_2{margin-left:40px}.tl_content.indent_3{margin-left:60px}.tl_content.indent_4{margin-left:80px}.tl_content.indent_5{margin-left:100px}.as-grid .tl_content .inside{padding:0}.as-grid .tl_content.indent{margin:0;padding:15px 15px 0;border-width:0 1px;background:var(--nested-bg)}.as-grid .tl_content.indent_2{padding-left:30px;padding-right:30px}.as-grid .tl_content.indent_3{padding-left:45px;padding-right:45px}.as-grid .tl_content.indent_4{padding-left:60px;padding-right:60px}.as-grid .tl_content.indent_5{padding-left:75px;padding-right:75px}.as-grid .tl_content.indent_last{padding-bottom:15px}.as-grid .tl_content.indent .inside{border:1px solid var(--border)}.as-grid .tl_content.wrapper_stop{margin-top:0}.as-grid .tl_content.indent.wrapper_stop{padding-top:0}.tl_content_left{line-height:16px}.as-grid .tl_content_left{padding:8px 10px}.tl_content_right{position:relative;z-index:1;float:right;text-align:right;margin-left:12px;margin-bottom:-1px}.as-grid .tl_content .tl_content_right{order:2;float:none;margin-left:0;margin-bottom:0;padding:8px 10px;border-left:1px solid var(--border);background:var(--table-header)}.tl_right button,.tl_content_right button{margin:0;padding:0;border:0;height:16px;background:0 0}.cte_type{margin:0 0 4px;font-size:.75rem;color:var(--info);line-height:16px}.as-grid .cte_type{order:1;margin-bottom:0;padding:8px 10px;background-color:var(--table-header);font-size:.8rem}.cte_type.published,.cte_type.published a{color:var(--green)}.cte_type.unpublished,.cte_type.unpublished a{color:var(--red)}.cte_type.icon-protected{padding-left:27px;background:var(--table-header) url(icons/protected.svg) 8px center no-repeat}.cte_type .visibility{color:var(--gray)}.cte_preview{line-height:1.25;position:relative}.cte_preview h1{font-size:1.25rem;margin-bottom:6px}.cte_preview h2{font-size:1rem;margin-bottom:6px}.cte_preview h3{font-size:.9rem;margin-bottom:6px}.cte_preview h4,.cte_preview h5,.cte_preview h6{font-size:.875rem;margin-bottom:6px}.cte_preview p,.cte_preview figure,.cte_preview ol,.cte_preview ul,.cte_preview table,.cte_preview div.tl_gray,.content-hyperlink,.content-toplink,.cte_preview table caption{margin-bottom:6px}.cte_preview img{max-width:320px;height:auto;padding:6px 0}.cte_preview th,.cte_preview td{padding:3px 6px;border-bottom:1px solid var(--border)}.cte_preview th{padding:6px;background:var(--table-header)}.cte_preview td{background:var(--content-bg)}.cte_preview table caption{text-align:left;font-size:.75rem}.cte_preview pre{margin-top:0;margin-bottom:6px;word-break:break-all;white-space:pre-wrap}.cte_preview pre.disabled{color:var(--pre-disabled)}.cte_preview .content-gallery ul{margin:0;padding:0;display:grid;grid-template-columns:1fr 1fr 1fr;list-style:none}.cte_preview a{color:var(--green)}.cte_preview div.tl_gray a{color:var(--gray)}.cte_preview span.comment{color:var(--blue);display:inline-block;margin-bottom:3px}.cte_preview input,.cte_preview select,.cte_preview textarea,.cte_preview button{background:var(--form-bg);border:1px solid var(--form-border)}.cte_preview input[type=file]{position:relative}.cte_preview select{-moz-appearance:menulist;-webkit-appearance:menulist}.cte_preview label,.cte_preview .checkbox_container legend,.cte_preview .radio_container legend{display:block;margin-bottom:6px}.cte_preview .widget{margin:0 0 6px}.cte_preview .checkbox_container label,.cte_preview .radio_container label{display:initial}.cte_preview .widget-captcha{display:block!important}.cte_preview .widget-captcha .captcha_text{padding-left:3px;vertical-align:middle}.cte_preview.empty{display:none}.as-grid .cte_preview{order:3;grid-column:1/span 2;padding:10px 10px 6px;border-top:1px solid var(--border)}.limit_height{overflow:hidden}.limit_toggler{width:100%;position:absolute;bottom:0;left:0;background:var(--content-bg);line-height:11px;text-align:center}.limit_toggler button{margin:0;padding:0;border:0;background:var(--content-bg);width:24px;line-height:8px;color:var(--gray);outline:0;border-top-left-radius:2px;border-top-right-radius:2px}.limit_toggler button span{position:relative;top:-4px}.tl_folder_top{padding:5px 6px;border:solid var(--tree-header-border);border-width:1px 0;background:var(--tree-header)}.tl_folder{padding:5px 6px;border-bottom:1px solid var(--border);background:var(--table-header)}.tl_folder.tl_folder_dropping,.tl_folder_top.tl_folder_dropping{background-color:var(--drag-bg)!important;color:var(--text)!important}.tl_folder.tl_folder_dropping a,.tl_folder_top.tl_folder_dropping a{color:inherit}.tl_listing .tl_left{flex-grow:1;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:normal}.tl_listing .tl_left.tl_left_dragging{position:absolute;background:var(--drag-bg);border-radius:10px;color:var(--text);padding:5px 10px!important;margin-left:0;text-indent:0;white-space:nowrap}.tl_listing .tl_left.tl_left_dragging .preview-image,.tl_listing .tl_left.tl_left_dragging a img{display:none}.tl_listing .tl_left.tl_left_dragging a,.tl_listing .tl_left.tl_left_dragging .tl_gray{color:inherit}.tl_listing_dragging .hover-div:not(.tl_folder):hover{background-color:transparent!important}.tl_listing .tl_left *{vertical-align:text-top}.tl_listing .tl_left a:hover{color:var(--text)}.tl_tree_xtnd .tl_file{padding-top:5px;padding-bottom:5px}.tl_tree_xtnd .tl_file .tl_left img{margin-right:2px}.tl_file_manager .preview-image{max-width:100px;max-height:75px;width:auto;height:auto;margin:0 0 2px 22px}.tl_file_manager .preview-important{max-width:80px;max-height:60px;width:auto;height:auto;margin:0 0 2px 0;vertical-align:bottom}.tl_listing .tl_right{padding:1px 0 0 9px;white-space:nowrap}@-moz-document url-prefix(){.tl_listing .tl_right{padding-top:0}}.tl_listing,.tl_listing ul{margin:0;padding:0}.tl_listing li{display:flex;margin:0;list-style-type:none}.tl_listing li.parent{display:inline;padding-left:0;padding-right:0}label.tl_change_selected{margin-right:2px;color:var(--gray);font-size:.75rem}#tl_breadcrumb{margin:0 0 12px;padding:4px 6px;overflow:hidden;background:var(--active-bg);border:1px solid var(--active-border);border-radius:2px;line-height:24px}#tl_breadcrumb li{margin:0;padding:0 3px;list-style-type:none;float:left}#tl_breadcrumb li a{display:inline-block}#tl_breadcrumb li img{width:16px;height:16px;vertical-align:-3px}.selector_container{margin-top:1px;position:relative}.selector_container>ul{margin:0 0 1px;padding:0;list-style-type:none;overflow:hidden}.selector_container>ul>li{margin:0 9px 0 0;padding:2px 0}.selector_container p{margin-bottom:1px}.selector_container ul:not(.sgallery) img{margin-right:1px;vertical-align:text-top}.selector_container img{max-width:320px;height:auto}.selector_container .limit_height{height:auto!important;max-height:190px}.selector_container .limit_toggler{display:none}.selector_container h1,.selector_container h2,.selector_container h3,.selector_container h4{margin:0;padding:0}.selector_container pre{white-space:pre-wrap}.selector_container table.showColumns{margin:2px 0 3px}.selector_container table.sortable td{cursor:move}ul.sgallery{overflow:hidden}ul.sgallery li{min-width:100px;min-height:75px;float:left;margin:2px 4px 2px 0;padding:0;background:var(--form-button);display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.popup #tl_soverview{margin-top:15px}#tl_soverview>div{padding:4px 15px;border-bottom:1px solid var(--border)}#tl_soverview>div:last-child{border-bottom:0}#tl_soverview table{width:100%;margin-bottom:14px}#tl_messages h2,#tl_shortcuts h2,#tl_versions h2{margin:14px 0 6px}#tl_messages p:not([class]){margin-top:6px}#tl_messages .tl_error,#tl_messages .tl_confirm,#tl_messages .tl_info,#tl_messages .tl_new{padding:3px 6px 3px 21px;background-position:left 4px;background-color:transparent}#tl_shortcuts p a{text-decoration:underline}#tl_versions{margin-bottom:0}#tl_versions td{padding:6px}#tl_versions td:first-child{white-space:nowrap}#tl_versions td:last-child{width:32px;white-space:nowrap;text-align:right}#tl_versions .pagination{margin-top:18px;margin-bottom:14px}.tl_chmod{width:100%}.tl_chmod th{height:18px;text-align:center;font-weight:400;background:var(--tree-header)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_chmod th{font-weight:300}}.tl_chmod td{text-align:center;background:var(--table-header)}.tl_chmod th,.tl_chmod td{width:14.2857%;padding:6px;border:1px solid var(--content-bg)}.tl_modulewizard button,.tl_optionwizard button,.tl_key_value_wizard button,.tl_tablewizard button,.tl_listwizard button,.tl_checkbox_wizard button,.tl_metawizard button,.tl_sectionwizard button{margin:0;padding:0;border:0;background:0 0}.tl_modulewizard{width:100%;max-width:800px;margin-top:2px}.tl_modulewizard td{position:relative;padding:0 3px 0 0}.tl_modulewizard th{font-size:.75rem;font-weight:400;padding:0 6px 1px 0}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_modulewizard th{font-weight:300}}.tl_modulewizard td:last-child{width:1%;white-space:nowrap}.tl_modulewizard img{position:relative;top:1px}.tl_modulewizard input.mw_enable+button,.js .tl_modulewizard input.mw_enable{display:none}.js .tl_modulewizard input.mw_enable+button{display:inline;width:16px;height:16px;background:url(icons/invisible.svg) 0 0 no-repeat}.js .tl_modulewizard input.mw_enable:checked+button{background-image:url(icons/visible.svg)}.tl_modulewizard img.mw_enable{display:none}.js .tl_modulewizard img.mw_enable{display:inline;margin-right:1px}.tl_optionwizard{width:100%;max-width:600px}.tl_key_value_wizard{width:100%;max-width:450px}.tl_optionwizard,.tl_key_value_wizard{margin-top:2px}.tl_optionwizard label,.tl_key_value_wizard label{margin-right:3px}.tl_optionwizard td,.tl_key_value_wizard td{padding:0 3px 0 0}.tl_optionwizard th,.tl_key_value_wizard th{font-size:.75rem;font-weight:400;padding:0 6px 1px 0}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_optionwizard th,.tl_key_value_wizard th{font-weight:300}}.tl_optionwizard td:nth-child(n+3),.tl_key_value_wizard td:nth-child(n+3){width:1%;white-space:nowrap}.tl_optionwizard img,.tl_key_value_wizard img{position:relative;top:1px}.tl_optionwizard .fw_checkbox,.tl_key_value_wizard .fw_checkbox{margin:0 1px}#ctrl_allowedAttributes{max-width:none}#ctrl_allowedAttributes td:first-child{width:100px}#tl_tablewizard{margin-top:2px;padding-bottom:2px;overflow:auto}.tl_tablewizard td{padding:0 3px 0 0}.tl_tablewizard thead td{padding-bottom:3px;text-align:center;white-space:nowrap}.tl_tablewizard tbody td:last-child{white-space:nowrap}.tl_tablewizard td.tcontainer{vertical-align:top}.tl_listwizard .tl_text{width:78%}.tl_checkbox_wizard .fixed{display:block;margin-top:1px}.tl_checkbox_wizard .sortable span{display:block}.tl_checkbox_wizard .sortable img{vertical-align:bottom}.tl_metawizard{margin:3px 0;padding:0;list-style:none}.tl_metawizard li{overflow:hidden;margin-bottom:2px;padding:9px}.tl_metawizard li:nth-child(odd){background:var(--table-header)}.tl_metawizard li:nth-child(even){background:var(--table-even)}.tl_metawizard label{float:left;width:18%;margin-top:9px}.tl_metawizard .tl_text,.tl_metawizard .tl_textarea{float:left;width:calc(82% - 20px);margin:1px 0}.tl_metawizard .tl_textarea{resize:vertical}.tl_metawizard .tl_text+a{position:relative;top:7px;margin-left:4px}.tl_metawizard br{clear:left}.tl_metawizard .lang{display:block;margin:3px 0 9px;font-weight:600;position:relative}.tl_metawizard .lang button{position:absolute;right:0;top:-1px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_metawizard .lang{font-weight:500}}.tl_sectionwizard{margin-top:2px;width:100%;max-width:680px}.tl_sectionwizard td{width:25%;position:relative;padding:0 3px 0 0}.tl_sectionwizard th{font-size:.75rem;font-weight:400;padding:0 4px 1px 0}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_sectionwizard th{font-weight:300}}.tl_sectionwizard td:last-child{white-space:nowrap}#paste_hint{position:relative;z-index:1}.tl_message+#paste_hint{margin-top:-12px}#paste_hint p{position:absolute;font-family:"Architects Daughter",cursive;font-size:1rem;color:var(--paste-hint);top:0;right:30px;padding:0 36px 24px 0;background:url(icons/arrow_right.svg) bottom right no-repeat;transform:rotate(-1deg)}.sort_hint{position:absolute;font-family:"Architects Daughter",cursive;font-size:1rem;color:var(--paste-hint);top:-50px;left:160px;padding:0 6px 24px 42px;background:url(icons/arrow_left.svg) 6px bottom no-repeat;transform:rotate(-2deg)}.widget+.subpal .sort_hint{left:260px}.widget+.widget .sort_hint{left:320px}.serp-preview{max-width:600px;margin:2px 0;padding:7px 7px 3px;font-family:Arial,sans-serif;font-weight:400;color:var(--serp-preview);background:var(--panel-bg);border-radius:3px}.serp-preview p{margin-bottom:4px;line-height:1.5}.serp-preview .title{font-size:18px;color:var(--serp-preview-title);line-height:normal}.serp-preview .description:empty{display:none}#tl_ajaxBox{width:300px;padding:2em;box-sizing:border-box;position:absolute;left:50%;margin-left:-150px;background:var(--white) url(icons/loading.svg) no-repeat right 2em center;border:2px solid var(--black);border-radius:2px;font-size:1rem;text-align:left}#tl_ajaxOverlay{width:100%;height:100%;position:absolute;top:0;left:0;background:var(--white);opacity:.5}.ce_gallery ul{overflow:hidden}.ce_gallery li{float:left;margin:0 6px 6px 0}.drag-handle{cursor:move}ul.sortable li{cursor:move;position:relative}ul.sortable li .dirname{display:none}ul.sortable li:hover .dirname{display:inline}ul.sortable button{position:absolute;top:0;right:0;border:0;border-radius:2px;background:var(--form-button);margin:0;padding:0 0 3px;font-size:22px;line-height:9px;cursor:pointer;transition:all .1s linear}ul.sortable button:hover{background:var(--form-button-hover)}ul.sortable button[disabled]{color:var(--gray);cursor:not-allowed}ul.sortable button[disabled]:hover{background:rgba(255,255,255,.7)}#picker-menu{padding:9px 6px 0;border-bottom:1px solid var(--content-border)}#picker-menu>ul{margin:0;padding:0;list-style:none}#picker-menu li{display:inline-block;padding:8px 0;background-color:var(--table-even);border:1px solid var(--content-border);border-radius:2px 2px 0 0;position:relative;top:1px}#picker-menu li:hover{background-color:var(--panel-bg)}#picker-menu li.current{background-color:var(--panel-bg);border-bottom-color:var(--panel-bg)}#picker-menu a{padding:3px 12px 3px 32px;background:url(icons/manager.svg) 12px center no-repeat}#picker-menu a:hover{color:var(--text)}#picker-menu a.pagePicker{background-image:url(icons/pagemounts.svg);background-size:16px}#picker-menu a.filePicker{background-image:url(icons/filemounts.svg);background-size:14px}#picker-menu a.articlePicker{background-image:url(icons/articles.svg);background-size:16px}#picker-menu a.close{background-image:url(icons/back.svg)}.ace_editor{padding:3px;z-index:0}.ace_editor,.ace_editor *{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important;font-size:.75rem!important;color:var(--text)}.ace-fullsize{overflow:hidden!important}.ace-fullsize .ace_editor{position:fixed!important;top:0;right:0;bottom:0;left:0;width:auto!important;height:auto!important;margin:0;border:0;z-index:10000}div.mce-edit-area{width:99.9%}time[title]{cursor:help}.float_left{float:left}.float_right{float:right}.header_icon,.header_clipboard,.header_back,.header_new,.header_rss,.header_edit_all,.header_delete_all,.header_new_folder,.header_css_import,.header_theme_import,.header_store,.header_toggle,.header_sync{padding:3px 0 3px 21px;background-position:left center;background-repeat:no-repeat;margin-left:15px}.list_icon{margin-left:-3px;padding-left:20px;background-position:left center;background-repeat:no-repeat}.list_icon_new{width:16px;background-position:1px center;background-repeat:no-repeat}.header_clipboard{background-image:url(icons/clipboard.svg)}.header_back{background-image:url(icons/back.svg)}.header_new{background-image:url(icons/new.svg)}.header_rss{background-image:url(icons/rss.svg)}.header_edit_all{background-image:url(icons/all.svg)}.header_new_folder{padding-left:24px;background-image:url(icons/newfolder.svg)}.header_css_import{background-image:url(icons/cssimport.svg)}.header_theme_import{background-image:url(icons/theme_import.svg)}.header_store{padding-left:18px;background-image:url(icons/store.svg)}.header_toggle{background-image:url(icons/folPlus.svg)}.header_sync{background-image:url(icons/sync.svg)}.tl_text_trbl,.tl_imageSize_0,.tl_imageSize_1,#ctrl_playerSize input{background:var(--form-bg) url(icons/hints.svg) no-repeat right 1px top 2px}#ctrl_playerSize_1,.tl_imageSize_1{background-position:right 1px top -28px!important}.trbl_top{background-position:right 1px top -59px!important}.trbl_right{background-position:right 1px top -89px!important}.trbl_bottom{background-position:right 1px top -119px!important}.trbl_left{background-position:right 1px top -149px!important}#ctrl_shadowsize_top{background-position:right 1px top -179px!important}#ctrl_shadowsize_right{background-position:right 1px top -209px!important}#ctrl_shadowsize_bottom{background-position:right 1px top -238px!important}#ctrl_shadowsize_left{background-position:right 1px top -269px!important}#ctrl_borderradius_top{background-position:left -299px!important}#ctrl_borderradius_right{background-position:right 1px top -329px!important}#ctrl_borderradius_bottom{background-position:right 1px top -352px!important}#ctrl_borderradius_left{background-position:left -382px!important}label.error,legend.error,.tl_checkbox_container.error legend{color:var(--red)}.tl_tbox .tl_error,.tl_box .tl_error{background:0 0;padding:0;margin-bottom:0;font-size:.75rem}.tl_formbody_edit>.tl_error{margin-top:9px}.broken-image{display:inline-block;padding:12px 12px 12px 30px;background:var(--error-bg) url(icons/error.svg) no-repeat 9px center;color:var(--red);text-indent:0}fieldset.tl_tbox,fieldset.tl_box{margin-top:5px;padding-top:0;border-top:none;border-left:0;border-right:0}fieldset.tl_tbox.nolegend,fieldset.tl_box.nolegend{border-top:0}fieldset.tl_tbox>legend,fieldset.tl_box>legend{box-sizing:border-box;color:var(--legend);padding:9px 12px 9px 28px;background:url(icons/navcol.svg) 13px 10px no-repeat;cursor:pointer}fieldset.collapsed{margin-bottom:0;padding-bottom:5px}fieldset.collapsed div{display:none!important}fieldset.collapsed>legend{background:url(icons/navexp.svg) 13px 10px no-repeat}#tl_maintenance_cache table{width:100%}#tl_maintenance_cache td{line-height:1.2}#tl_maintenance_cache td span{color:var(--gray)}#tl_maintenance_cache td:first-child{width:16px}.mac #tl_maintenance_cache td:first-child .tl_checkbox{top:-2px}#tl_maintenance_cache .nw{white-space:nowrap}#tl_maintenance_cache .tl_checkbox_container{margin-top:12px}#tl_maintenance_cache .tl_checkbox_container label{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tl_maintenance_cache .tl_checkbox_container label{font-weight:500}}.pagination{overflow:hidden;background:var(--panel-bg);margin-bottom:18px;border:solid var(--border);border-width:1px 0;padding:12px 15px}.pagination ul{width:60%;float:right;text-align:right}.pagination p{width:30%;float:left;margin-bottom:0}.pagination li{display:inline;padding-left:3px}.pagination .active{color:var(--gray)}.pagination-lp{margin-bottom:0;border-bottom:0;padding:15px 12px}#sync-results{overflow:hidden;margin:18px 15px 0}#sync-results p{margin-bottom:0}#sync-results .left{float:left;padding:2px 0}#sync-results .right{float:right}#result-list{margin:15px}#result-list .tl_error,#result-list .tl_confirm,#result-list .tl_info,#result-list .tl_new{padding:3px 0;background:0 0}.dropzone{margin:2px 0;min-height:auto!important;border:3px dashed var(--border)!important;border-radius:2px;background:var(--form-bg)!important}.dropzone-filetree{display:none;position:absolute;top:0;left:0;width:100%;height:100%;opacity:.8;z-index:1}.dropzone-filetree-enabled{display:block}.dz-message span{font-size:1.3125rem;color:var(--gray)}.tox-tinymce{margin:3px 0;border-radius:2px!important}.tl_undo_header{max-width:880px;display:grid;grid-template-columns:2fr 2fr 3fr 3fr;grid-column-gap:24px}.hover-row:hover .tl_undo_header{background-color:var(--hover-row)!important}.tl_undo_preview{position:relative;padding:22px 0 10px}.tl_undo_preview td{padding-left:0!important;padding-right:32px!important}.tl_undo_preview img{max-width:320px;height:auto}.tl_listing .odd .tl_undo_preview .limit_toggler{background-color:var(--table-odd)}@media (max-width:991px){#header{width:100%;padding:0;position:fixed;top:0;z-index:2;transition:transform .2s ease;-webkit-transform:none;transform:none;will-change:transform}#container{display:block;padding-top:40px;overflow:hidden}#main,#left{float:none;overflow:hidden}#main{width:100%!important;position:relative;transition:transform .2s ease;-webkit-transform:none;transform:none;will-change:transform}.show-navigation #main{-webkit-transform:translateX(240px);transform:translateX(240px)}#left{visibility:hidden;position:absolute;top:40px;width:240px;transition:transform .2s ease,visibility .2s ease;-webkit-transform:translateX(-240px);transform:translateX(-240px);will-change:transform,visibility}.show-navigation #left{visibility:visible;-webkit-transform:none;transform:none}#tmenu .burger{display:inline}}@media (max-width:767px){#header.down{-webkit-transform:translateY(-40px);transform:translateY(-40px)}#header h1 a{min-width:22px;padding:12px}#header h1 a .app-title{display:none}#header h1 a .badge-title{margin-left:32px}#tmenu>li>a{width:16px;margin-bottom:-2px;position:relative;overflow:hidden;white-space:nowrap;text-indent:28px;background-size:18px!important}#tmenu sup{top:6px;font-size:.5rem}#tmenu .icon-debug{background:url(icons/debug.svg) center center no-repeat}#tmenu .icon-preview{background:url(icons/preview.svg) center center no-repeat}#tmenu .profile button{width:40px;margin:0 0 -2px;padding-right:12px;overflow:hidden;white-space:nowrap;text-indent:28px;background:url(icons/profile.svg) center center no-repeat;background-size:18px}#main .content{margin:15px 10px}#main_headline{margin:13px 0;padding:0 11px}div.tl_tbox,div.tl_box{position:relative}.tl_content_left{width:100%;float:none}.showColumns th,.showColumns td{display:block}.showColumns th:empty{display:none}.tl_label{white-space:normal}.list_view .tl_listing img.theme_preview{display:none}.tl_filter{box-sizing:border-box;padding:0 3px 0 7px}.tl_filter strong{display:none}.tl_filter .tl_select{display:block;max-width:100%}.tl_search{width:76%;max-width:283px}.tl_search .tl_select{width:36%}.tl_search .tl_text{width:26%}.tl_sorting{width:60%;max-width:212px}.tl_limit{width:50%;max-width:177px}.tl_submit_panel{float:right;z-index:1}input.tl_submit{margin-top:3px;margin-bottom:3px;padding-left:6px!important;padding-right:7px!important}.tl_listing .tl_left,.tl_show td{word-break:break-word}#tl_breadcrumb li{padding:3px}#tl_versions{display:none}.tl_version_panel .tl_select{width:44%}.tl_modulewizard td:first-child{width:1%}.tl_modulewizard td:first-child .tl_select{max-width:52vw}#paste_hint,.sort_hint{display:none}#tl_maintenance_cache table{width:100%}#tl_maintenance_cache tr th:last-child,#tl_maintenance_cache tr td:last-child{display:none}.tl_file_list .ellipsis{padding-right:10px}.tl_undo_header{grid-template-columns:2fr 3fr}.tl_undo_header div:not(.tstamp):not(.source){display:none}}@media (max-width:599px){.tl_metawizard label{width:auto;float:none;font-size:.9em;display:block;margin-top:3px}.tl_metawizard .tl_text{width:100%}}@media (max-width:479px){.tl_modulewizard td:first-child .tl_select{max-width:48vw}} \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/popup.css b/core-bundle/contao/themes/flexible/popup.css index 6f8ace8b395..294541e64d1 100644 --- a/core-bundle/contao/themes/flexible/popup.css +++ b/core-bundle/contao/themes/flexible/popup.css @@ -19,7 +19,6 @@ body { } .tl_show td { - padding: 4px 6px; line-height: 18px; white-space: pre-line; } @@ -29,10 +28,6 @@ body { white-space: normal; } -.tl_show tr:nth-child(even) td { - background: var(--table-odd); -} - .tl_label { margin-right: 12px; font-weight: 600; @@ -62,7 +57,7 @@ body { #preview .checkerbox { background-size: 30px 30px; - background-color: var(--white); + background-color: var(--content-bg); background-image: linear-gradient(45deg, var(--checkerbox-bg) 25%, transparent 25%, transparent 75%, var(--checkerbox-bg) 75%, var(--checkerbox-bg)), linear-gradient(45deg, var(--checkerbox-bg) 25%, transparent 25%, transparent 75%, var(--checkerbox-bg) 75%, var(--checkerbox-bg)); background-position: 0 0, 15px 15px; } diff --git a/core-bundle/contao/themes/flexible/popup.min.css b/core-bundle/contao/themes/flexible/popup.min.css index e56bbe129ca..586dad246ec 100644 --- a/core-bundle/contao/themes/flexible/popup.min.css +++ b/core-bundle/contao/themes/flexible/popup.min.css @@ -1 +1 @@ -body{background:var(--content-bg)}.tl_show{width:96%;margin:18px 2%;padding:9px 0 18px}.tl_show td{padding:4px 6px;line-height:18px;white-space:pre-line}.tl_show td:first-child{width:34%;white-space:normal}.tl_show tr:nth-child(even) td{background:var(--table-odd)}.tl_label{margin-right:12px;font-weight:600;white-space:nowrap}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_label{font-weight:500}}.meta p{margin:.5em 0 0}.meta p:first-child{margin-top:0}#preview{margin:18px;display:flex;flex-wrap:wrap;align-items:flex-start}#preview .checkerbox{background-size:30px 30px;background-color:var(--white);background-image:linear-gradient(45deg,var(--checkerbox-bg) 25%,transparent 25%,transparent 75%,var(--checkerbox-bg) 75%,var(--checkerbox-bg)),linear-gradient(45deg,var(--checkerbox-bg) 25%,transparent 25%,transparent 75%,var(--checkerbox-bg) 75%,var(--checkerbox-bg));background-position:0 0,15px 15px}#preview .checkerbox,#preview .checkerbox img{max-width:100%;height:auto!important}#download{margin:24px 18px 12px}#download a{padding-top:6px}#download img{position:relative;top:-1px}.tl_submit{padding:8px 12px 4px 10px}@media (max-width:767px){.tl_show td{word-break:break-word}}@media (max-width:459px){.meta{display:none}#preview{margin-left:12px;margin-right:12px}} \ No newline at end of file +body{background:var(--content-bg)}.tl_show{width:96%;margin:18px 2%;padding:9px 0 18px}.tl_show td{line-height:18px;white-space:pre-line}.tl_show td:first-child{width:34%;white-space:normal}.tl_label{margin-right:12px;font-weight:600;white-space:nowrap}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_label{font-weight:500}}.meta p{margin:.5em 0 0}.meta p:first-child{margin-top:0}#preview{margin:18px;display:flex;flex-wrap:wrap;align-items:flex-start}#preview .checkerbox{background-size:30px 30px;background-color:var(--content-bg);background-image:linear-gradient(45deg,var(--checkerbox-bg) 25%,transparent 25%,transparent 75%,var(--checkerbox-bg) 75%,var(--checkerbox-bg)),linear-gradient(45deg,var(--checkerbox-bg) 25%,transparent 25%,transparent 75%,var(--checkerbox-bg) 75%,var(--checkerbox-bg));background-position:0 0,15px 15px}#preview .checkerbox,#preview .checkerbox img{max-width:100%;height:auto!important}#download{margin:24px 18px 12px}#download a{padding-top:6px}#download img{position:relative;top:-1px}.tl_submit{padding:8px 12px 4px 10px}@media (max-width:767px){.tl_show td{word-break:break-word}}@media (max-width:459px){.meta{display:none}#preview{margin-left:12px;margin-right:12px}} \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/tinymce-dark.css b/core-bundle/contao/themes/flexible/tinymce-dark.css new file mode 100644 index 00000000000..8ab146ef15d --- /dev/null +++ b/core-bundle/contao/themes/flexible/tinymce-dark.css @@ -0,0 +1,37 @@ +/*! + * This file is part of Contao. + * + * (c) Leo Feyer + * + * @license LGPL-3.0-or-later + */ + +html { + color-scheme: dark; +} + +body { + background: #151619; +} + +body, th, td { + font-family: -apple-system, system-ui, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-weight: 400; + font-size: .875rem; + line-height: 1.2; + color: #ddd; +} + +h1, h2, h3, h4, h5, h6, strong, b, th { + font-weight: 600; +} + +@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { + body, th, td { + font-weight: 300; + } + + h1, h2, h3, h4, h5, h6, strong, b, th { + font-weight: 500; + } +} diff --git a/core-bundle/contao/themes/flexible/tinymce-dark.min.css b/core-bundle/contao/themes/flexible/tinymce-dark.min.css new file mode 100644 index 00000000000..2f228f4bca0 --- /dev/null +++ b/core-bundle/contao/themes/flexible/tinymce-dark.min.css @@ -0,0 +1 @@ +html{color-scheme:dark}body{background:#151619}body,th,td{font-family:-apple-system,system-ui,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:400;font-size:.875rem;line-height:1.2;color:#ddd}h1,h2,h3,h4,h5,h6,strong,b,th{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body,th,td{font-weight:300}h1,h2,h3,h4,h5,h6,strong,b,th{font-weight:500}} \ No newline at end of file diff --git a/core-bundle/contao/themes/flexible/tinymce.css b/core-bundle/contao/themes/flexible/tinymce.css index db56a87cd7f..f3b51db973b 100644 --- a/core-bundle/contao/themes/flexible/tinymce.css +++ b/core-bundle/contao/themes/flexible/tinymce.css @@ -6,12 +6,16 @@ * @license LGPL-3.0-or-later */ +body { + background: #fff; +} + body, th, td { font-family: -apple-system, system-ui, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-weight: 400; font-size: .875rem; line-height: 1.2; - color: var(--text); + color: #222; } h1, h2, h3, h4, h5, h6, strong, b, th { diff --git a/core-bundle/contao/themes/flexible/tinymce.min.css b/core-bundle/contao/themes/flexible/tinymce.min.css index a769b545f1e..e7b695783af 100644 --- a/core-bundle/contao/themes/flexible/tinymce.min.css +++ b/core-bundle/contao/themes/flexible/tinymce.min.css @@ -1 +1 @@ -body,th,td{font-family:-apple-system,system-ui,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:400;font-size:.875rem;line-height:1.2;color:var(--text)}h1,h2,h3,h4,h5,h6,strong,b,th{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body,th,td{font-weight:300}h1,h2,h3,h4,h5,h6,strong,b,th{font-weight:500}} \ No newline at end of file +body{background:#fff}body,th,td{font-family:-apple-system,system-ui,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:400;font-size:.875rem;line-height:1.2;color:#222}h1,h2,h3,h4,h5,h6,strong,b,th{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body,th,td{font-weight:300}h1,h2,h3,h4,h5,h6,strong,b,th{font-weight:500}} \ No newline at end of file diff --git a/core-bundle/contao/widgets/ModuleWizard.php b/core-bundle/contao/widgets/ModuleWizard.php index a84a866a957..c2e8f586ad7 100644 --- a/core-bundle/contao/widgets/ModuleWizard.php +++ b/core-bundle/contao/widgets/ModuleWizard.php @@ -210,8 +210,15 @@ public function generate() { if ($button == 'edit') { - $href = StringUtil::specialcharsUrl(System::getContainer()->get('router')->generate('contao_backend', array('do'=>'themes', 'table'=>'tl_module', 'act'=>'edit', 'id'=>($this->varValue[$i]['mod'] ?? null), 'popup'=>'1', 'rt'=>System::getContainer()->get('contao.csrf.token_manager')->getDefaultTokenValue()))); - $return .= ' varValue[$i]['mod'] ?? null) > 0 ? '' : ' style="display:none"') . ' onclick="Backend.openModalIframe({\'title\':\'' . StringUtil::specialchars(str_replace("'", "\\'", $GLOBALS['TL_LANG']['tl_layout']['edit_module'])) . '\',\'url\':this.href});return false">' . Image::getHtml('edit.svg') . '' . Image::getHtml('edit_.svg', '', 'class="module_image"' . (($this->varValue[$i]['mod'] ?? null) > 0 ? ' style="display:none"' : '')); + if (($this->varValue[$i]['mod'] ?? null) > 0) + { + $href = StringUtil::specialcharsUrl(System::getContainer()->get('router')->generate('contao_backend', array('do'=>'themes', 'table'=>'tl_module', 'act'=>'edit', 'id'=>($this->varValue[$i]['mod'] ?? null), 'popup'=>'1', 'rt'=>System::getContainer()->get('contao.csrf.token_manager')->getDefaultTokenValue()))); + $return .= ' ' . Image::getHtml('edit.svg') . ''; + } + else + { + $return .= ' ' . Image::getHtml('edit_.svg'); + } } elseif ($button == 'drag') { diff --git a/core-bundle/contao/widgets/PageTree.php b/core-bundle/contao/widgets/PageTree.php index e929f9dbd6d..d2437bc2d29 100644 --- a/core-bundle/contao/widgets/PageTree.php +++ b/core-bundle/contao/widgets/PageTree.php @@ -174,7 +174,7 @@ public function generate() e.preventDefault(); Backend.openModalSelector({ "id": "tl_listing", - "title": ' . json_encode($GLOBALS['TL_DCA'][$this->strTable]['fields'][$this->strField]['label'][0]) . ', + "title": ' . json_encode($GLOBALS['TL_DCA'][$this->strTable]['fields'][$this->strField]['label'][0] ?? '') . ', "url": this.href + document.getElementById("ctrl_' . $this->strId . '").value, "callback": function(table, value) { new Request.Contao({ diff --git a/core-bundle/public/ajax-form.8d9f14a4.js b/core-bundle/public/ajax-form.8d9f14a4.js new file mode 100644 index 00000000000..0587560a05b --- /dev/null +++ b/core-bundle/public/ajax-form.8d9f14a4.js @@ -0,0 +1,2 @@ +window.addEventListener("DOMContentLoaded",(()=>{document.querySelectorAll("[data-ajax-form]").forEach((e=>{!function e(t){t.addEventListener("submit",(a=>{a.preventDefault();const n=new FormData(t);a.submitter&&n.append(a.submitter.name,a.submitter.value),function(e,t,a){const n=new XMLHttpRequest;n.open("POST",e.action,!0),n.setRequestHeader("Accept","text/html"),n.setRequestHeader("X-Requested-With","XMLHttpRequest"),n.setRequestHeader("X-Contao-Ajax-Form",e.querySelector('[name="FORM_SUBMIT"]').value),e.ariaBusy="true",e.dataset.ajaxForm="loading",n.onload=()=>{e.dispatchEvent(new CustomEvent("ajax-form-onload",{bubbles:!0,detail:{body:t,form:e,xhr:n}})),e.ariaBusy="false",e.dataset.ajaxForm="",a(n)},n.send(t||null)}(t,n,(a=>{const n=a.getResponseHeader("X-Ajax-Location");if(n)return void(window.location.href=n);const o=document.createElement("template");o.innerHTML=a.responseText.trim();const r=o.content.firstElementChild;t.replaceWith(r),e(r)}))}))}(e)}))})); +//# sourceMappingURL=ajax-form.8d9f14a4.js.map \ No newline at end of file diff --git a/core-bundle/public/ajax-form.8d9f14a4.js.map b/core-bundle/public/ajax-form.8d9f14a4.js.map new file mode 100644 index 00000000000..172b782b8b2 --- /dev/null +++ b/core-bundle/public/ajax-form.8d9f14a4.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ajax-form.8d9f14a4.js","mappings":"AAAAA,OAAOC,iBAAiB,oBAAoB,KACxCC,SAASC,iBAAiB,oBAAoBC,SAAQC,KA2BlD,SAASC,EAASC,GACdA,EAAKN,iBAAiB,UAAUO,IAC5BA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASJ,GAG1BC,EAAEI,WACFF,EAASG,OAAOL,EAAEI,UAAUE,KAAMN,EAAEI,UAAUG,OAlC1D,SAAiBR,EAAMS,EAAMC,GACzB,MAAMC,EAAM,IAAIC,eAEhBD,EAAIE,KAAK,OAAQb,EAAKc,QAAQ,GAC9BH,EAAII,iBAAiB,SAAU,aAC/BJ,EAAII,iBAAiB,mBAAoB,kBACzCJ,EAAII,iBAAiB,qBAAsBf,EAAKgB,cAAc,wBAAwBR,OAEtFR,EAAKiB,SAAW,OAChBjB,EAAKkB,QAAQC,SAAW,UAExBR,EAAIS,OAAS,KACTpB,EAAKqB,cAAc,IAAIC,YAAY,mBAAoB,CACnDC,SAAS,EACTC,OAAQ,CAAEf,OAAMT,OAAMW,UAG1BX,EAAKiB,SAAW,QAChBjB,EAAKkB,QAAQC,SAAW,GAExBT,EAASC,EAAI,EAGjBA,EAAIc,KAAKhB,GAAQ,KACrB,CAaQiB,CAAQ1B,EAAMG,GAAUQ,IACpB,MAAMgB,EAAWhB,EAAIiB,kBAAkB,mBAGvC,GAAID,EAEA,YADAlC,OAAOkC,SAASE,KAAOF,GAI3B,MAAMG,EAAWnC,SAASoC,cAAc,YACxCD,EAASE,UAAYrB,EAAIsB,aAAaC,OAEtC,MAAMC,EAAUL,EAASM,QAAQC,kBACjCrC,EAAKsC,YAAYH,GACjBpC,EAASoC,EAAQ,GACnB,GAEV,CAEApC,CAASD,EAAG,GACd","sources":["webpack:///./core-bundle/assets/ajax-form.js"],"sourcesContent":["window.addEventListener('DOMContentLoaded', () => {\n document.querySelectorAll('[data-ajax-form]').forEach(el => {\n function request(form, body, callback) {\n const xhr = new XMLHttpRequest();\n\n xhr.open('POST', form.action, true);\n xhr.setRequestHeader('Accept', 'text/html');\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n xhr.setRequestHeader('X-Contao-Ajax-Form', form.querySelector('[name=\"FORM_SUBMIT\"]').value);\n\n form.ariaBusy = 'true';\n form.dataset.ajaxForm = 'loading';\n\n xhr.onload = () => {\n form.dispatchEvent(new CustomEvent('ajax-form-onload', {\n bubbles: true,\n detail: { body, form, xhr },\n }));\n\n form.ariaBusy = 'false';\n form.dataset.ajaxForm = '';\n\n callback(xhr);\n };\n\n xhr.send(body || null)\n }\n\n function initForm(form) {\n form.addEventListener('submit', e => {\n e.preventDefault();\n\n const formData = new FormData(form);\n\n // Send the triggered button data as well\n if (e.submitter) {\n formData.append(e.submitter.name, e.submitter.value);\n }\n\n request(form, formData, xhr => {\n const location = xhr.getResponseHeader('X-Ajax-Location');\n\n // Handle the redirect header\n if (location) {\n window.location.href = location;\n return;\n }\n\n const template = document.createElement('template');\n template.innerHTML = xhr.responseText.trim();\n\n const newForm = template.content.firstElementChild;\n form.replaceWith(newForm);\n initForm(newForm);\n });\n });\n }\n\n initForm(el);\n });\n});\n"],"names":["window","addEventListener","document","querySelectorAll","forEach","el","initForm","form","e","preventDefault","formData","FormData","submitter","append","name","value","body","callback","xhr","XMLHttpRequest","open","action","setRequestHeader","querySelector","ariaBusy","dataset","ajaxForm","onload","dispatchEvent","CustomEvent","bubbles","detail","send","request","location","getResponseHeader","href","template","createElement","innerHTML","responseText","trim","newForm","content","firstElementChild","replaceWith"],"sourceRoot":""} \ No newline at end of file diff --git a/core-bundle/public/backend.f14d0695.js b/core-bundle/public/backend.f14d0695.js new file mode 100644 index 00000000000..edbc623058e --- /dev/null +++ b/core-bundle/public/backend.f14d0695.js @@ -0,0 +1,2 @@ +!function(){var e={483:function(e,t,n){var i={"./clipboard-controller.js":555,"./color-scheme-controller.js":563,"./metawizard-controller.js":338,"./toggle-navigation-controller.js":475};function r(e){var t=s(e);return n(t)}function s(e){if(!n.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=s,e.exports=r,r.id=483},599:function(e,t,n){"use strict";n.d(t,{Mx:function(){return X},Qr:function(){return re}});class i{constructor(e,t,n){this.eventTarget=e,this.eventName=t,this.eventOptions=n,this.unorderedBindings=new Set}connect(){this.eventTarget.addEventListener(this.eventName,this,this.eventOptions)}disconnect(){this.eventTarget.removeEventListener(this.eventName,this,this.eventOptions)}bindingConnected(e){this.unorderedBindings.add(e)}bindingDisconnected(e){this.unorderedBindings.delete(e)}handleEvent(e){const t=function(e){if("immediatePropagationStopped"in e)return e;{const{stopImmediatePropagation:t}=e;return Object.assign(e,{immediatePropagationStopped:!1,stopImmediatePropagation(){this.immediatePropagationStopped=!0,t.call(this)}})}}(e);for(const e of this.bindings){if(t.immediatePropagationStopped)break;e.handleEvent(t)}}hasBindings(){return this.unorderedBindings.size>0}get bindings(){return Array.from(this.unorderedBindings).sort(((e,t)=>{const n=e.index,i=t.index;return ni?1:0}))}}class r{constructor(e){this.application=e,this.eventListenerMaps=new Map,this.started=!1}start(){this.started||(this.started=!0,this.eventListeners.forEach((e=>e.connect())))}stop(){this.started&&(this.started=!1,this.eventListeners.forEach((e=>e.disconnect())))}get eventListeners(){return Array.from(this.eventListenerMaps.values()).reduce(((e,t)=>e.concat(Array.from(t.values()))),[])}bindingConnected(e){this.fetchEventListenerForBinding(e).bindingConnected(e)}bindingDisconnected(e,t=!1){this.fetchEventListenerForBinding(e).bindingDisconnected(e),t&&this.clearEventListenersForBinding(e)}handleError(e,t,n={}){this.application.handleError(e,`Error ${t}`,n)}clearEventListenersForBinding(e){const t=this.fetchEventListenerForBinding(e);t.hasBindings()||(t.disconnect(),this.removeMappedEventListenerFor(e))}removeMappedEventListenerFor(e){const{eventTarget:t,eventName:n,eventOptions:i}=e,r=this.fetchEventListenerMapForEventTarget(t),s=this.cacheKey(n,i);r.delete(s),0==r.size&&this.eventListenerMaps.delete(t)}fetchEventListenerForBinding(e){const{eventTarget:t,eventName:n,eventOptions:i}=e;return this.fetchEventListener(t,n,i)}fetchEventListener(e,t,n){const i=this.fetchEventListenerMapForEventTarget(e),r=this.cacheKey(t,n);let s=i.get(r);return s||(s=this.createEventListener(e,t,n),i.set(r,s)),s}createEventListener(e,t,n){const r=new i(e,t,n);return this.started&&r.connect(),r}fetchEventListenerMapForEventTarget(e){let t=this.eventListenerMaps.get(e);return t||(t=new Map,this.eventListenerMaps.set(e,t)),t}cacheKey(e,t){const n=[e];return Object.keys(t).sort().forEach((e=>{n.push(`${t[e]?"":"!"}${e}`)})),n.join(":")}}const s={stop({event:e,value:t}){return t&&e.stopPropagation(),!0},prevent({event:e,value:t}){return t&&e.preventDefault(),!0},self({event:e,value:t,element:n}){return!t||n===e.target}},o=/^(?:(.+?)(?:\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;function a(e){return"window"==e?window:"document"==e?document:void 0}function l(e){return e.replace(/(?:[_-])([a-z0-9])/g,((e,t)=>t.toUpperCase()))}function c(e){return l(e.replace(/--/g,"-").replace(/__/g,"_"))}function d(e){return e.charAt(0).toUpperCase()+e.slice(1)}function u(e){return e.replace(/([A-Z])/g,((e,t)=>`-${t.toLowerCase()}`))}class h{constructor(e,t,n,i){this.element=e,this.index=t,this.eventTarget=n.eventTarget||e,this.eventName=n.eventName||function(e){const t=e.tagName.toLowerCase();if(t in g)return g[t](e)}(e)||f("missing event name"),this.eventOptions=n.eventOptions||{},this.identifier=n.identifier||f("missing identifier"),this.methodName=n.methodName||f("missing method name"),this.keyFilter=n.keyFilter||"",this.schema=i}static forToken(e,t){return new this(e.element,e.index,function(e){const t=e.trim().match(o)||[];let n=t[1],i=t[2];return i&&!["keydown","keyup","keypress"].includes(n)&&(n+=`.${i}`,i=""),{eventTarget:a(t[3]),eventName:n,eventOptions:t[6]?(r=t[6],r.split(":").reduce(((e,t)=>Object.assign(e,{[t.replace(/^!/,"")]:!/^!/.test(t)})),{})):{},identifier:t[4],methodName:t[5],keyFilter:i};var r}(e.content),t)}toString(){const e=this.keyFilter?`.${this.keyFilter}`:"",t=this.eventTargetName?`@${this.eventTargetName}`:"";return`${this.eventName}${e}${t}->${this.identifier}#${this.methodName}`}isFilterTarget(e){if(!this.keyFilter)return!1;const t=this.keyFilter.split("+"),n=["meta","ctrl","alt","shift"],[i,r,s,o]=n.map((e=>t.includes(e)));if(e.metaKey!==i||e.ctrlKey!==r||e.altKey!==s||e.shiftKey!==o)return!0;const a=t.filter((e=>!n.includes(e)))[0];return!!a&&(Object.prototype.hasOwnProperty.call(this.keyMappings,a)||f(`contains unknown key filter: ${this.keyFilter}`),this.keyMappings[a].toLowerCase()!==e.key.toLowerCase())}get params(){const e={},t=new RegExp(`^data-${this.identifier}-(.+)-param$`,"i");for(const{name:n,value:i}of Array.from(this.element.attributes)){const r=n.match(t),s=r&&r[1];s&&(e[l(s)]=p(i))}return e}get eventTargetName(){return(e=this.eventTarget)==window?"window":e==document?"document":void 0;var e}get keyMappings(){return this.schema.keyMappings}}const g={a:()=>"click",button:()=>"click",form:()=>"submit",details:()=>"toggle",input:e=>"submit"==e.getAttribute("type")?"click":"input",select:()=>"change",textarea:()=>"input"};function f(e){throw new Error(e)}function p(e){try{return JSON.parse(e)}catch(t){return e}}class m{constructor(e,t){this.context=e,this.action=t}get index(){return this.action.index}get eventTarget(){return this.action.eventTarget}get eventOptions(){return this.action.eventOptions}get identifier(){return this.context.identifier}handleEvent(e){this.willBeInvokedByEvent(e)&&this.applyEventModifiers(e)&&this.invokeWithEvent(e)}get eventName(){return this.action.eventName}get method(){const e=this.controller[this.methodName];if("function"==typeof e)return e;throw new Error(`Action "${this.action}" references undefined method "${this.methodName}"`)}applyEventModifiers(e){const{element:t}=this.action,{actionDescriptorFilters:n}=this.context.application;let i=!0;for(const[r,s]of Object.entries(this.eventOptions))if(r in n){const o=n[r];i=i&&o({name:r,value:s,event:e,element:t})}return i}invokeWithEvent(e){const{target:t,currentTarget:n}=e;try{const{params:i}=this.action,r=Object.assign(e,{params:i});this.method.call(this.controller,r),this.context.logDebugActivity(this.methodName,{event:e,target:t,currentTarget:n,action:this.methodName})}catch(t){const{identifier:n,controller:i,element:r,index:s}=this,o={identifier:n,controller:i,element:r,index:s,event:e};this.context.handleError(t,`invoking action "${this.action}"`,o)}}willBeInvokedByEvent(e){const t=e.target;return!(e instanceof KeyboardEvent&&this.action.isFilterTarget(e))&&(this.element===t||(t instanceof Element&&this.element.contains(t)?this.scope.containsElement(t):this.scope.containsElement(this.action.element)))}get controller(){return this.context.controller}get methodName(){return this.action.methodName}get element(){return this.scope.element}get scope(){return this.context.scope}}class v{constructor(e,t){this.mutationObserverInit={attributes:!0,childList:!0,subtree:!0},this.element=e,this.started=!1,this.delegate=t,this.elements=new Set,this.mutationObserver=new MutationObserver((e=>this.processMutations(e)))}start(){this.started||(this.started=!0,this.mutationObserver.observe(this.element,this.mutationObserverInit),this.refresh())}pause(e){this.started&&(this.mutationObserver.disconnect(),this.started=!1),e(),this.started||(this.mutationObserver.observe(this.element,this.mutationObserverInit),this.started=!0)}stop(){this.started&&(this.mutationObserver.takeRecords(),this.mutationObserver.disconnect(),this.started=!1)}refresh(){if(this.started){const e=new Set(this.matchElementsInTree());for(const t of Array.from(this.elements))e.has(t)||this.removeElement(t);for(const t of Array.from(e))this.addElement(t)}}processMutations(e){if(this.started)for(const t of e)this.processMutation(t)}processMutation(e){"attributes"==e.type?this.processAttributeChange(e.target,e.attributeName):"childList"==e.type&&(this.processRemovedNodes(e.removedNodes),this.processAddedNodes(e.addedNodes))}processAttributeChange(e,t){const n=e;this.elements.has(n)?this.delegate.elementAttributeChanged&&this.matchElement(n)?this.delegate.elementAttributeChanged(n,t):this.removeElement(n):this.matchElement(n)&&this.addElement(n)}processRemovedNodes(e){for(const t of Array.from(e)){const e=this.elementFromNode(t);e&&this.processTree(e,this.removeElement)}}processAddedNodes(e){for(const t of Array.from(e)){const e=this.elementFromNode(t);e&&this.elementIsActive(e)&&this.processTree(e,this.addElement)}}matchElement(e){return this.delegate.matchElement(e)}matchElementsInTree(e=this.element){return this.delegate.matchElementsInTree(e)}processTree(e,t){for(const n of this.matchElementsInTree(e))t.call(this,n)}elementFromNode(e){if(e.nodeType==Node.ELEMENT_NODE)return e}elementIsActive(e){return e.isConnected==this.element.isConnected&&this.element.contains(e)}addElement(e){this.elements.has(e)||this.elementIsActive(e)&&(this.elements.add(e),this.delegate.elementMatched&&this.delegate.elementMatched(e))}removeElement(e){this.elements.has(e)&&(this.elements.delete(e),this.delegate.elementUnmatched&&this.delegate.elementUnmatched(e))}}class b{constructor(e,t,n){this.attributeName=t,this.delegate=n,this.elementObserver=new v(e,this)}get element(){return this.elementObserver.element}get selector(){return`[${this.attributeName}]`}start(){this.elementObserver.start()}pause(e){this.elementObserver.pause(e)}stop(){this.elementObserver.stop()}refresh(){this.elementObserver.refresh()}get started(){return this.elementObserver.started}matchElement(e){return e.hasAttribute(this.attributeName)}matchElementsInTree(e){const t=this.matchElement(e)?[e]:[],n=Array.from(e.querySelectorAll(this.selector));return t.concat(n)}elementMatched(e){this.delegate.elementMatchedAttribute&&this.delegate.elementMatchedAttribute(e,this.attributeName)}elementUnmatched(e){this.delegate.elementUnmatchedAttribute&&this.delegate.elementUnmatchedAttribute(e,this.attributeName)}elementAttributeChanged(e,t){this.delegate.elementAttributeValueChanged&&this.attributeName==t&&this.delegate.elementAttributeValueChanged(e,t)}}function y(e,t,n){w(e,t).add(n)}function E(e,t,n){w(e,t).delete(n),function(e,t){const n=e.get(t);null!=n&&0==n.size&&e.delete(t)}(e,t)}function w(e,t){let n=e.get(t);return n||(n=new Set,e.set(t,n)),n}class k{constructor(){this.valuesByKey=new Map}get keys(){return Array.from(this.valuesByKey.keys())}get values(){return Array.from(this.valuesByKey.values()).reduce(((e,t)=>e.concat(Array.from(t))),[])}get size(){return Array.from(this.valuesByKey.values()).reduce(((e,t)=>e+t.size),0)}add(e,t){y(this.valuesByKey,e,t)}delete(e,t){E(this.valuesByKey,e,t)}has(e,t){const n=this.valuesByKey.get(e);return null!=n&&n.has(t)}hasKey(e){return this.valuesByKey.has(e)}hasValue(e){return Array.from(this.valuesByKey.values()).some((t=>t.has(e)))}getValuesForKey(e){const t=this.valuesByKey.get(e);return t?Array.from(t):[]}getKeysForValue(e){return Array.from(this.valuesByKey).filter((([t,n])=>n.has(e))).map((([e,t])=>e))}}class S{constructor(e,t,n,i={}){this.selector=t,this.details=i,this.elementObserver=new v(e,this),this.delegate=n,this.matchesByElement=new k}get started(){return this.elementObserver.started}start(){this.elementObserver.start()}pause(e){this.elementObserver.pause(e)}stop(){this.elementObserver.stop()}refresh(){this.elementObserver.refresh()}get element(){return this.elementObserver.element}matchElement(e){const t=e.matches(this.selector);return this.delegate.selectorMatchElement?t&&this.delegate.selectorMatchElement(e,this.details):t}matchElementsInTree(e){const t=this.matchElement(e)?[e]:[],n=Array.from(e.querySelectorAll(this.selector)).filter((e=>this.matchElement(e)));return t.concat(n)}elementMatched(e){this.selectorMatched(e)}elementUnmatched(e){this.selectorUnmatched(e)}elementAttributeChanged(e,t){const n=this.matchElement(e),i=this.matchesByElement.has(this.selector,e);!n&&i&&this.selectorUnmatched(e)}selectorMatched(e){this.delegate.selectorMatched&&(this.delegate.selectorMatched(e,this.selector,this.details),this.matchesByElement.add(this.selector,e))}selectorUnmatched(e){this.delegate.selectorUnmatched(e,this.selector,this.details),this.matchesByElement.delete(this.selector,e)}}class C{constructor(e,t){this.element=e,this.delegate=t,this.started=!1,this.stringMap=new Map,this.mutationObserver=new MutationObserver((e=>this.processMutations(e)))}start(){this.started||(this.started=!0,this.mutationObserver.observe(this.element,{attributes:!0,attributeOldValue:!0}),this.refresh())}stop(){this.started&&(this.mutationObserver.takeRecords(),this.mutationObserver.disconnect(),this.started=!1)}refresh(){if(this.started)for(const e of this.knownAttributeNames)this.refreshAttribute(e,null)}processMutations(e){if(this.started)for(const t of e)this.processMutation(t)}processMutation(e){const t=e.attributeName;t&&this.refreshAttribute(t,e.oldValue)}refreshAttribute(e,t){const n=this.delegate.getStringMapKeyForAttribute(e);if(null!=n){this.stringMap.has(e)||this.stringMapKeyAdded(n,e);const i=this.element.getAttribute(e);if(this.stringMap.get(e)!=i&&this.stringMapValueChanged(i,n,t),null==i){const t=this.stringMap.get(e);this.stringMap.delete(e),t&&this.stringMapKeyRemoved(n,e,t)}else this.stringMap.set(e,i)}}stringMapKeyAdded(e,t){this.delegate.stringMapKeyAdded&&this.delegate.stringMapKeyAdded(e,t)}stringMapValueChanged(e,t,n){this.delegate.stringMapValueChanged&&this.delegate.stringMapValueChanged(e,t,n)}stringMapKeyRemoved(e,t,n){this.delegate.stringMapKeyRemoved&&this.delegate.stringMapKeyRemoved(e,t,n)}get knownAttributeNames(){return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)))}get currentAttributeNames(){return Array.from(this.element.attributes).map((e=>e.name))}get recordedAttributeNames(){return Array.from(this.stringMap.keys())}}class O{constructor(e,t,n){this.attributeObserver=new b(e,t,this),this.delegate=n,this.tokensByElement=new k}get started(){return this.attributeObserver.started}start(){this.attributeObserver.start()}pause(e){this.attributeObserver.pause(e)}stop(){this.attributeObserver.stop()}refresh(){this.attributeObserver.refresh()}get element(){return this.attributeObserver.element}get attributeName(){return this.attributeObserver.attributeName}elementMatchedAttribute(e){this.tokensMatched(this.readTokensForElement(e))}elementAttributeValueChanged(e){const[t,n]=this.refreshTokensForElement(e);this.tokensUnmatched(t),this.tokensMatched(n)}elementUnmatchedAttribute(e){this.tokensUnmatched(this.tokensByElement.getValuesForKey(e))}tokensMatched(e){e.forEach((e=>this.tokenMatched(e)))}tokensUnmatched(e){e.forEach((e=>this.tokenUnmatched(e)))}tokenMatched(e){this.delegate.tokenMatched(e),this.tokensByElement.add(e.element,e)}tokenUnmatched(e){this.delegate.tokenUnmatched(e),this.tokensByElement.delete(e.element,e)}refreshTokensForElement(e){const t=this.tokensByElement.getValuesForKey(e),n=this.readTokensForElement(e),i=function(e,t){const n=Math.max(e.length,t.length);return Array.from({length:n},((n,i)=>[e[i],t[i]]))}(t,n).findIndex((([e,t])=>{return i=t,!((n=e)&&i&&n.index==i.index&&n.content==i.content);var n,i}));return-1==i?[[],[]]:[t.slice(i),n.slice(i)]}readTokensForElement(e){const t=this.attributeName;return function(e,t,n){return e.trim().split(/\s+/).filter((e=>e.length)).map(((e,i)=>({element:t,attributeName:n,content:e,index:i})))}(e.getAttribute(t)||"",e,t)}}class x{constructor(e,t,n){this.tokenListObserver=new O(e,t,this),this.delegate=n,this.parseResultsByToken=new WeakMap,this.valuesByTokenByElement=new WeakMap}get started(){return this.tokenListObserver.started}start(){this.tokenListObserver.start()}stop(){this.tokenListObserver.stop()}refresh(){this.tokenListObserver.refresh()}get element(){return this.tokenListObserver.element}get attributeName(){return this.tokenListObserver.attributeName}tokenMatched(e){const{element:t}=e,{value:n}=this.fetchParseResultForToken(e);n&&(this.fetchValuesByTokenForElement(t).set(e,n),this.delegate.elementMatchedValue(t,n))}tokenUnmatched(e){const{element:t}=e,{value:n}=this.fetchParseResultForToken(e);n&&(this.fetchValuesByTokenForElement(t).delete(e),this.delegate.elementUnmatchedValue(t,n))}fetchParseResultForToken(e){let t=this.parseResultsByToken.get(e);return t||(t=this.parseToken(e),this.parseResultsByToken.set(e,t)),t}fetchValuesByTokenForElement(e){let t=this.valuesByTokenByElement.get(e);return t||(t=new Map,this.valuesByTokenByElement.set(e,t)),t}parseToken(e){try{return{value:this.delegate.parseValueForToken(e)}}catch(e){return{error:e}}}}class A{constructor(e,t){this.context=e,this.delegate=t,this.bindingsByAction=new Map}start(){this.valueListObserver||(this.valueListObserver=new x(this.element,this.actionAttribute,this),this.valueListObserver.start())}stop(){this.valueListObserver&&(this.valueListObserver.stop(),delete this.valueListObserver,this.disconnectAllActions())}get element(){return this.context.element}get identifier(){return this.context.identifier}get actionAttribute(){return this.schema.actionAttribute}get schema(){return this.context.schema}get bindings(){return Array.from(this.bindingsByAction.values())}connectAction(e){const t=new m(this.context,e);this.bindingsByAction.set(e,t),this.delegate.bindingConnected(t)}disconnectAction(e){const t=this.bindingsByAction.get(e);t&&(this.bindingsByAction.delete(e),this.delegate.bindingDisconnected(t))}disconnectAllActions(){this.bindings.forEach((e=>this.delegate.bindingDisconnected(e,!0))),this.bindingsByAction.clear()}parseValueForToken(e){const t=h.forToken(e,this.schema);if(t.identifier==this.identifier)return t}elementMatchedValue(e,t){this.connectAction(t)}elementUnmatchedValue(e,t){this.disconnectAction(t)}}class M{constructor(e,t){this.context=e,this.receiver=t,this.stringMapObserver=new C(this.element,this),this.valueDescriptorMap=this.controller.valueDescriptorMap}start(){this.stringMapObserver.start(),this.invokeChangedCallbacksForDefaultValues()}stop(){this.stringMapObserver.stop()}get element(){return this.context.element}get controller(){return this.context.controller}getStringMapKeyForAttribute(e){if(e in this.valueDescriptorMap)return this.valueDescriptorMap[e].name}stringMapKeyAdded(e,t){const n=this.valueDescriptorMap[t];this.hasValue(e)||this.invokeChangedCallback(e,n.writer(this.receiver[e]),n.writer(n.defaultValue))}stringMapValueChanged(e,t,n){const i=this.valueDescriptorNameMap[t];null!==e&&(null===n&&(n=i.writer(i.defaultValue)),this.invokeChangedCallback(t,e,n))}stringMapKeyRemoved(e,t,n){const i=this.valueDescriptorNameMap[e];this.hasValue(e)?this.invokeChangedCallback(e,i.writer(this.receiver[e]),n):this.invokeChangedCallback(e,i.writer(i.defaultValue),n)}invokeChangedCallbacksForDefaultValues(){for(const{key:e,name:t,defaultValue:n,writer:i}of this.valueDescriptors)null==n||this.controller.data.has(e)||this.invokeChangedCallback(t,i(n),void 0)}invokeChangedCallback(e,t,n){const i=`${e}Changed`,r=this.receiver[i];if("function"==typeof r){const i=this.valueDescriptorNameMap[e];try{const e=i.reader(t);let s=n;n&&(s=i.reader(n)),r.call(this.receiver,e,s)}catch(e){throw e instanceof TypeError&&(e.message=`Stimulus Value "${this.context.identifier}.${i.name}" - ${e.message}`),e}}}get valueDescriptors(){const{valueDescriptorMap:e}=this;return Object.keys(e).map((t=>e[t]))}get valueDescriptorNameMap(){const e={};return Object.keys(this.valueDescriptorMap).forEach((t=>{const n=this.valueDescriptorMap[t];e[n.name]=n})),e}hasValue(e){const t=`has${d(this.valueDescriptorNameMap[e].name)}`;return this.receiver[t]}}class _{constructor(e,t){this.context=e,this.delegate=t,this.targetsByName=new k}start(){this.tokenListObserver||(this.tokenListObserver=new O(this.element,this.attributeName,this),this.tokenListObserver.start())}stop(){this.tokenListObserver&&(this.disconnectAllTargets(),this.tokenListObserver.stop(),delete this.tokenListObserver)}tokenMatched({element:e,content:t}){this.scope.containsElement(e)&&this.connectTarget(e,t)}tokenUnmatched({element:e,content:t}){this.disconnectTarget(e,t)}connectTarget(e,t){var n;this.targetsByName.has(t,e)||(this.targetsByName.add(t,e),null===(n=this.tokenListObserver)||void 0===n||n.pause((()=>this.delegate.targetConnected(e,t))))}disconnectTarget(e,t){var n;this.targetsByName.has(t,e)&&(this.targetsByName.delete(t,e),null===(n=this.tokenListObserver)||void 0===n||n.pause((()=>this.delegate.targetDisconnected(e,t))))}disconnectAllTargets(){for(const e of this.targetsByName.keys)for(const t of this.targetsByName.getValuesForKey(e))this.disconnectTarget(t,e)}get attributeName(){return`data-${this.context.identifier}-target`}get element(){return this.context.element}get scope(){return this.context.scope}}function $(e,t){const n=j(e);return Array.from(n.reduce(((e,n)=>(function(e,t){const n=e[t];return Array.isArray(n)?n:[]}(n,t).forEach((t=>e.add(t))),e)),new Set))}function T(e,t){return j(e).reduce(((e,n)=>(e.push(...function(e,t){const n=e[t];return n?Object.keys(n).map((e=>[e,n[e]])):[]}(n,t)),e)),[])}function j(e){const t=[];for(;e;)t.push(e),e=Object.getPrototypeOf(e);return t.reverse()}class N{constructor(e,t){this.context=e,this.delegate=t,this.outletsByName=new k,this.outletElementsByName=new k,this.selectorObserverMap=new Map}start(){0===this.selectorObserverMap.size&&(this.outletDefinitions.forEach((e=>{const t=this.selector(e),n={outletName:e};t&&this.selectorObserverMap.set(e,new S(document.body,t,this,n))})),this.selectorObserverMap.forEach((e=>e.start()))),this.dependentContexts.forEach((e=>e.refresh()))}stop(){this.selectorObserverMap.size>0&&(this.disconnectAllOutlets(),this.selectorObserverMap.forEach((e=>e.stop())),this.selectorObserverMap.clear())}refresh(){this.selectorObserverMap.forEach((e=>e.refresh()))}selectorMatched(e,t,{outletName:n}){const i=this.getOutlet(e,n);i&&this.connectOutlet(i,e,n)}selectorUnmatched(e,t,{outletName:n}){const i=this.getOutletFromMap(e,n);i&&this.disconnectOutlet(i,e,n)}selectorMatchElement(e,{outletName:t}){return this.hasOutlet(e,t)&&e.matches(`[${this.context.application.schema.controllerAttribute}~=${t}]`)}connectOutlet(e,t,n){var i;this.outletElementsByName.has(n,t)||(this.outletsByName.add(n,e),this.outletElementsByName.add(n,t),null===(i=this.selectorObserverMap.get(n))||void 0===i||i.pause((()=>this.delegate.outletConnected(e,t,n))))}disconnectOutlet(e,t,n){var i;this.outletElementsByName.has(n,t)&&(this.outletsByName.delete(n,e),this.outletElementsByName.delete(n,t),null===(i=this.selectorObserverMap.get(n))||void 0===i||i.pause((()=>this.delegate.outletDisconnected(e,t,n))))}disconnectAllOutlets(){for(const e of this.outletElementsByName.keys)for(const t of this.outletElementsByName.getValuesForKey(e))for(const n of this.outletsByName.getValuesForKey(e))this.disconnectOutlet(n,t,e)}selector(e){return this.scope.outlets.getSelectorForOutletName(e)}get outletDependencies(){const e=new k;return this.router.modules.forEach((t=>{$(t.definition.controllerConstructor,"outlets").forEach((n=>e.add(n,t.identifier)))})),e}get outletDefinitions(){return this.outletDependencies.getKeysForValue(this.identifier)}get dependentControllerIdentifiers(){return this.outletDependencies.getValuesForKey(this.identifier)}get dependentContexts(){const e=this.dependentControllerIdentifiers;return this.router.contexts.filter((t=>e.includes(t.identifier)))}hasOutlet(e,t){return!!this.getOutlet(e,t)||!!this.getOutletFromMap(e,t)}getOutlet(e,t){return this.application.getControllerForElementAndIdentifier(e,t)}getOutletFromMap(e,t){return this.outletsByName.getValuesForKey(t).find((t=>t.element===e))}get scope(){return this.context.scope}get identifier(){return this.context.identifier}get application(){return this.context.application}get router(){return this.application.router}}class F{constructor(e,t){this.logDebugActivity=(e,t={})=>{const{identifier:n,controller:i,element:r}=this;t=Object.assign({identifier:n,controller:i,element:r},t),this.application.logDebugActivity(this.identifier,e,t)},this.module=e,this.scope=t,this.controller=new e.controllerConstructor(this),this.bindingObserver=new A(this,this.dispatcher),this.valueObserver=new M(this,this.controller),this.targetObserver=new _(this,this),this.outletObserver=new N(this,this);try{this.controller.initialize(),this.logDebugActivity("initialize")}catch(e){this.handleError(e,"initializing controller")}}connect(){this.bindingObserver.start(),this.valueObserver.start(),this.targetObserver.start(),this.outletObserver.start();try{this.controller.connect(),this.logDebugActivity("connect")}catch(e){this.handleError(e,"connecting controller")}}refresh(){this.outletObserver.refresh()}disconnect(){try{this.controller.disconnect(),this.logDebugActivity("disconnect")}catch(e){this.handleError(e,"disconnecting controller")}this.outletObserver.stop(),this.targetObserver.stop(),this.valueObserver.stop(),this.bindingObserver.stop()}get application(){return this.module.application}get identifier(){return this.module.identifier}get schema(){return this.application.schema}get dispatcher(){return this.application.dispatcher}get element(){return this.scope.element}get parentElement(){return this.element.parentElement}handleError(e,t,n={}){const{identifier:i,controller:r,element:s}=this;n=Object.assign({identifier:i,controller:r,element:s},n),this.application.handleError(e,`Error ${t}`,n)}targetConnected(e,t){this.invokeControllerMethod(`${t}TargetConnected`,e)}targetDisconnected(e,t){this.invokeControllerMethod(`${t}TargetDisconnected`,e)}outletConnected(e,t,n){this.invokeControllerMethod(`${c(n)}OutletConnected`,e,t)}outletDisconnected(e,t,n){this.invokeControllerMethod(`${c(n)}OutletDisconnected`,e,t)}invokeControllerMethod(e,...t){const n=this.controller;"function"==typeof n[e]&&n[e](...t)}}function B(e){return function(e,t){const n=P(e),i=function(e,t){return L(t).reduce(((n,i)=>{const r=function(e,t,n){const i=Object.getOwnPropertyDescriptor(e,n);if(!i||!("value"in i)){const e=Object.getOwnPropertyDescriptor(t,n).value;return i&&(e.get=i.get||e.get,e.set=i.set||e.set),e}}(e,t,i);return r&&Object.assign(n,{[i]:r}),n}),{})}(e.prototype,t);return Object.defineProperties(n.prototype,i),n}(e,function(e){const t=$(e,"blessings");return t.reduce(((t,n)=>{const i=n(e);for(const e in i){const n=t[e]||{};t[e]=Object.assign(n,i[e])}return t}),{})}(e))}const L="function"==typeof Object.getOwnPropertySymbols?e=>[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)]:Object.getOwnPropertyNames,P=(()=>{function e(e){function t(){return Reflect.construct(e,arguments,new.target)}return t.prototype=Object.create(e.prototype,{constructor:{value:t}}),Reflect.setPrototypeOf(t,e),t}try{return function(){const t=e((function(){this.a.call(this)}));t.prototype.a=function(){},new t}(),e}catch(e){return e=>class extends e{}}})();class D{constructor(e,t){this.application=e,this.definition=function(e){return{identifier:e.identifier,controllerConstructor:B(e.controllerConstructor)}}(t),this.contextsByScope=new WeakMap,this.connectedContexts=new Set}get identifier(){return this.definition.identifier}get controllerConstructor(){return this.definition.controllerConstructor}get contexts(){return Array.from(this.connectedContexts)}connectContextForScope(e){const t=this.fetchContextForScope(e);this.connectedContexts.add(t),t.connect()}disconnectContextForScope(e){const t=this.contextsByScope.get(e);t&&(this.connectedContexts.delete(t),t.disconnect())}fetchContextForScope(e){let t=this.contextsByScope.get(e);return t||(t=new F(this,e),this.contextsByScope.set(e,t)),t}}class q{constructor(e){this.scope=e}has(e){return this.data.has(this.getDataKey(e))}get(e){return this.getAll(e)[0]}getAll(e){const t=this.data.get(this.getDataKey(e))||"";return t.match(/[^\s]+/g)||[]}getAttributeName(e){return this.data.getAttributeNameForKey(this.getDataKey(e))}getDataKey(e){return`${e}-class`}get data(){return this.scope.data}}class R{constructor(e){this.scope=e}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get(e){const t=this.getAttributeNameForKey(e);return this.element.getAttribute(t)}set(e,t){const n=this.getAttributeNameForKey(e);return this.element.setAttribute(n,t),this.get(e)}has(e){const t=this.getAttributeNameForKey(e);return this.element.hasAttribute(t)}delete(e){if(this.has(e)){const t=this.getAttributeNameForKey(e);return this.element.removeAttribute(t),!0}return!1}getAttributeNameForKey(e){return`data-${this.identifier}-${u(e)}`}}class I{constructor(e){this.warnedKeysByObject=new WeakMap,this.logger=e}warn(e,t,n){let i=this.warnedKeysByObject.get(e);i||(i=new Set,this.warnedKeysByObject.set(e,i)),i.has(t)||(i.add(t),this.logger.warn(n,e))}}function z(e,t){return`[${e}~="${t}"]`}class K{constructor(e){this.scope=e}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get schema(){return this.scope.schema}has(e){return null!=this.find(e)}find(...e){return e.reduce(((e,t)=>e||this.findTarget(t)||this.findLegacyTarget(t)),void 0)}findAll(...e){return e.reduce(((e,t)=>[...e,...this.findAllTargets(t),...this.findAllLegacyTargets(t)]),[])}findTarget(e){const t=this.getSelectorForTargetName(e);return this.scope.findElement(t)}findAllTargets(e){const t=this.getSelectorForTargetName(e);return this.scope.findAllElements(t)}getSelectorForTargetName(e){return z(this.schema.targetAttributeForScope(this.identifier),e)}findLegacyTarget(e){const t=this.getLegacySelectorForTargetName(e);return this.deprecate(this.scope.findElement(t),e)}findAllLegacyTargets(e){const t=this.getLegacySelectorForTargetName(e);return this.scope.findAllElements(t).map((t=>this.deprecate(t,e)))}getLegacySelectorForTargetName(e){const t=`${this.identifier}.${e}`;return z(this.schema.targetAttribute,t)}deprecate(e,t){if(e){const{identifier:n}=this,i=this.schema.targetAttribute,r=this.schema.targetAttributeForScope(n);this.guide.warn(e,`target:${t}`,`Please replace ${i}="${n}.${t}" with ${r}="${t}". The ${i} attribute is deprecated and will be removed in a future version of Stimulus.`)}return e}get guide(){return this.scope.guide}}class V{constructor(e,t){this.scope=e,this.controllerElement=t}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get schema(){return this.scope.schema}has(e){return null!=this.find(e)}find(...e){return e.reduce(((e,t)=>e||this.findOutlet(t)),void 0)}findAll(...e){return e.reduce(((e,t)=>[...e,...this.findAllOutlets(t)]),[])}getSelectorForOutletName(e){const t=this.schema.outletAttributeForScope(this.identifier,e);return this.controllerElement.getAttribute(t)}findOutlet(e){const t=this.getSelectorForOutletName(e);if(t)return this.findElement(t,e)}findAllOutlets(e){const t=this.getSelectorForOutletName(e);return t?this.findAllElements(t,e):[]}findElement(e,t){return this.scope.queryElements(e).filter((n=>this.matchesElement(n,e,t)))[0]}findAllElements(e,t){return this.scope.queryElements(e).filter((n=>this.matchesElement(n,e,t)))}matchesElement(e,t,n){const i=e.getAttribute(this.scope.schema.controllerAttribute)||"";return e.matches(t)&&i.split(" ").includes(n)}}class U{constructor(e,t,n,i){this.targets=new K(this),this.classes=new q(this),this.data=new R(this),this.containsElement=e=>e.closest(this.controllerSelector)===this.element,this.schema=e,this.element=t,this.identifier=n,this.guide=new I(i),this.outlets=new V(this.documentScope,t)}findElement(e){return this.element.matches(e)?this.element:this.queryElements(e).find(this.containsElement)}findAllElements(e){return[...this.element.matches(e)?[this.element]:[],...this.queryElements(e).filter(this.containsElement)]}queryElements(e){return Array.from(this.element.querySelectorAll(e))}get controllerSelector(){return z(this.schema.controllerAttribute,this.identifier)}get isDocumentScope(){return this.element===document.documentElement}get documentScope(){return this.isDocumentScope?this:new U(this.schema,document.documentElement,this.identifier,this.guide.logger)}}class W{constructor(e,t,n){this.element=e,this.schema=t,this.delegate=n,this.valueListObserver=new x(this.element,this.controllerAttribute,this),this.scopesByIdentifierByElement=new WeakMap,this.scopeReferenceCounts=new WeakMap}start(){this.valueListObserver.start()}stop(){this.valueListObserver.stop()}get controllerAttribute(){return this.schema.controllerAttribute}parseValueForToken(e){const{element:t,content:n}=e,i=this.fetchScopesByIdentifierForElement(t);let r=i.get(n);return r||(r=this.delegate.createScopeForElementAndIdentifier(t,n),i.set(n,r)),r}elementMatchedValue(e,t){const n=(this.scopeReferenceCounts.get(t)||0)+1;this.scopeReferenceCounts.set(t,n),1==n&&this.delegate.scopeConnected(t)}elementUnmatchedValue(e,t){const n=this.scopeReferenceCounts.get(t);n&&(this.scopeReferenceCounts.set(t,n-1),1==n&&this.delegate.scopeDisconnected(t))}fetchScopesByIdentifierForElement(e){let t=this.scopesByIdentifierByElement.get(e);return t||(t=new Map,this.scopesByIdentifierByElement.set(e,t)),t}}class Q{constructor(e){this.application=e,this.scopeObserver=new W(this.element,this.schema,this),this.scopesByIdentifier=new k,this.modulesByIdentifier=new Map}get element(){return this.application.element}get schema(){return this.application.schema}get logger(){return this.application.logger}get controllerAttribute(){return this.schema.controllerAttribute}get modules(){return Array.from(this.modulesByIdentifier.values())}get contexts(){return this.modules.reduce(((e,t)=>e.concat(t.contexts)),[])}start(){this.scopeObserver.start()}stop(){this.scopeObserver.stop()}loadDefinition(e){this.unloadIdentifier(e.identifier);const t=new D(this.application,e);this.connectModule(t);const n=e.controllerConstructor.afterLoad;n&&n(e.identifier,this.application)}unloadIdentifier(e){const t=this.modulesByIdentifier.get(e);t&&this.disconnectModule(t)}getContextForElementAndIdentifier(e,t){const n=this.modulesByIdentifier.get(t);if(n)return n.contexts.find((t=>t.element==e))}handleError(e,t,n){this.application.handleError(e,t,n)}createScopeForElementAndIdentifier(e,t){return new U(this.schema,e,t,this.logger)}scopeConnected(e){this.scopesByIdentifier.add(e.identifier,e);const t=this.modulesByIdentifier.get(e.identifier);t&&t.connectContextForScope(e)}scopeDisconnected(e){this.scopesByIdentifier.delete(e.identifier,e);const t=this.modulesByIdentifier.get(e.identifier);t&&t.disconnectContextForScope(e)}connectModule(e){this.modulesByIdentifier.set(e.identifier,e);this.scopesByIdentifier.getValuesForKey(e.identifier).forEach((t=>e.connectContextForScope(t)))}disconnectModule(e){this.modulesByIdentifier.delete(e.identifier);this.scopesByIdentifier.getValuesForKey(e.identifier).forEach((t=>e.disconnectContextForScope(t)))}}const H={controllerAttribute:"data-controller",actionAttribute:"data-action",targetAttribute:"data-target",targetAttributeForScope:e=>`data-${e}-target`,outletAttributeForScope:(e,t)=>`data-${e}-${t}-outlet`,keyMappings:Object.assign(Object.assign({enter:"Enter",tab:"Tab",esc:"Escape",space:" ",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight",home:"Home",end:"End"},J("abcdefghijklmnopqrstuvwxyz".split("").map((e=>[e,e])))),J("0123456789".split("").map((e=>[e,e]))))};function J(e){return e.reduce(((e,[t,n])=>Object.assign(Object.assign({},e),{[t]:n})),{})}class X{constructor(e=document.documentElement,t=H){this.logger=console,this.debug=!1,this.logDebugActivity=(e,t,n={})=>{this.debug&&this.logFormattedMessage(e,t,n)},this.element=e,this.schema=t,this.dispatcher=new r(this),this.router=new Q(this),this.actionDescriptorFilters=Object.assign({},s)}static start(e,t){const n=new this(e,t);return n.start(),n}async start(){await new Promise((e=>{"loading"==document.readyState?document.addEventListener("DOMContentLoaded",(()=>e())):e()})),this.logDebugActivity("application","starting"),this.dispatcher.start(),this.router.start(),this.logDebugActivity("application","start")}stop(){this.logDebugActivity("application","stopping"),this.dispatcher.stop(),this.router.stop(),this.logDebugActivity("application","stop")}register(e,t){this.load({identifier:e,controllerConstructor:t})}registerActionOption(e,t){this.actionDescriptorFilters[e]=t}load(e,...t){(Array.isArray(e)?e:[e,...t]).forEach((e=>{e.controllerConstructor.shouldLoad&&this.router.loadDefinition(e)}))}unload(e,...t){(Array.isArray(e)?e:[e,...t]).forEach((e=>this.router.unloadIdentifier(e)))}get controllers(){return this.router.contexts.map((e=>e.controller))}getControllerForElementAndIdentifier(e,t){const n=this.router.getContextForElementAndIdentifier(e,t);return n?n.controller:null}handleError(e,t,n){var i;this.logger.error("%s\n\n%o\n\n%o",t,e,n),null===(i=window.onerror)||void 0===i||i.call(window,t,"",0,0,e)}logFormattedMessage(e,t,n={}){n=Object.assign({application:this},n),this.logger.groupCollapsed(`${e} #${t}`),this.logger.log("details:",Object.assign({},n)),this.logger.groupEnd()}}function G([e,t],n){return function(e){const t=`${u(e.token)}-value`,n=function(e){const t=function(e){const t=Y(e.typeObject.type);if(!t)return;const n=Z(e.typeObject.default);if(t!==n){const i=e.controller?`${e.controller}.${e.token}`:e.token;throw new Error(`The specified default value for the Stimulus Value "${i}" must match the defined type "${t}". The provided default value of "${e.typeObject.default}" is of type "${n}".`)}return t}({controller:e.controller,token:e.token,typeObject:e.typeDefinition}),n=Z(e.typeDefinition),i=Y(e.typeDefinition),r=t||n||i;if(r)return r;const s=e.controller?`${e.controller}.${e.typeDefinition}`:e.token;throw new Error(`Unknown value type "${s}" for "${e.token}" value`)}(e);return{type:n,key:t,name:l(t),get defaultValue(){return function(e){const t=Y(e);if(t)return ee[t];const n=e.default;return void 0!==n?n:e}(e.typeDefinition)},get hasCustomDefaultValue(){return void 0!==Z(e.typeDefinition)},reader:te[n],writer:ne[n]||ne.default}}({controller:n,token:e,typeDefinition:t})}function Y(e){switch(e){case Array:return"array";case Boolean:return"boolean";case Number:return"number";case Object:return"object";case String:return"string"}}function Z(e){switch(typeof e){case"boolean":return"boolean";case"number":return"number";case"string":return"string"}return Array.isArray(e)?"array":"[object Object]"===Object.prototype.toString.call(e)?"object":void 0}const ee={get array(){return[]},boolean:!1,number:0,get object(){return{}},string:""},te={array(e){const t=JSON.parse(e);if(!Array.isArray(t))throw new TypeError(`expected value of type "array" but instead got value "${e}" of type "${Z(t)}"`);return t},boolean(e){return!("0"==e||"false"==String(e).toLowerCase())},number(e){return Number(e)},object(e){const t=JSON.parse(e);if(null===t||"object"!=typeof t||Array.isArray(t))throw new TypeError(`expected value of type "object" but instead got value "${e}" of type "${Z(t)}"`);return t},string(e){return e}},ne={default:function(e){return`${e}`},array:ie,object:ie};function ie(e){return JSON.stringify(e)}class re{constructor(e){this.context=e}static get shouldLoad(){return!0}static afterLoad(e,t){}get application(){return this.context.application}get scope(){return this.context.scope}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get targets(){return this.scope.targets}get outlets(){return this.scope.outlets}get classes(){return this.scope.classes}get data(){return this.scope.data}initialize(){}connect(){}disconnect(){}dispatch(e,{target:t=this.element,detail:n={},prefix:i=this.identifier,bubbles:r=!0,cancelable:s=!0}={}){const o=new CustomEvent(i?`${i}:${e}`:e,{detail:n,bubbles:r,cancelable:s});return t.dispatchEvent(o),o}}re.blessings=[function(e){return $(e,"classes").reduce(((e,t)=>{return Object.assign(e,{[`${n=t}Class`]:{get(){const{classes:e}=this;if(e.has(n))return e.get(n);{const t=e.getAttributeName(n);throw new Error(`Missing attribute "${t}"`)}}},[`${n}Classes`]:{get(){return this.classes.getAll(n)}},[`has${d(n)}Class`]:{get(){return this.classes.has(n)}}});var n}),{})},function(e){return $(e,"targets").reduce(((e,t)=>{return Object.assign(e,{[`${n=t}Target`]:{get(){const e=this.targets.find(n);if(e)return e;throw new Error(`Missing target element "${n}" for "${this.identifier}" controller`)}},[`${n}Targets`]:{get(){return this.targets.findAll(n)}},[`has${d(n)}Target`]:{get(){return this.targets.has(n)}}});var n}),{})},function(e){const t=T(e,"values"),n={valueDescriptorMap:{get(){return t.reduce(((e,t)=>{const n=G(t,this.identifier),i=this.data.getAttributeNameForKey(n.key);return Object.assign(e,{[i]:n})}),{})}}};return t.reduce(((e,t)=>Object.assign(e,function(e,t){const n=G(e,t),{key:i,name:r,reader:s,writer:o}=n;return{[r]:{get(){const e=this.data.get(i);return null!==e?s(e):n.defaultValue},set(e){void 0===e?this.data.delete(i):this.data.set(i,o(e))}},[`has${d(r)}`]:{get(){return this.data.has(i)||n.hasCustomDefaultValue}}}}(t))),n)},function(e){return $(e,"outlets").reduce(((e,t)=>Object.assign(e,function(e){const t=c(e);return{[`${t}Outlet`]:{get(){const t=this.outlets.find(e);if(t){const n=this.application.getControllerForElementAndIdentifier(t,e);if(n)return n;throw new Error(`Missing "data-controller=${e}" attribute on outlet element for "${this.identifier}" controller`)}throw new Error(`Missing outlet element "${e}" for "${this.identifier}" controller`)}},[`${t}Outlets`]:{get(){const t=this.outlets.findAll(e);return t.length>0?t.map((t=>{const n=this.application.getControllerForElementAndIdentifier(t,e);if(n)return n;console.warn(`The provided outlet element is missing the outlet controller "${e}" for "${this.identifier}"`,t)})).filter((e=>e)):[]}},[`${t}OutletElement`]:{get(){const t=this.outlets.find(e);if(t)return t;throw new Error(`Missing outlet element "${e}" for "${this.identifier}" controller`)}},[`${t}OutletElements`]:{get(){return this.outlets.findAll(e)}},[`has${d(t)}Outlet`]:{get(){return this.outlets.has(e)}}}}(t))),{})}],re.targets=[],re.outlets=[],re.values={}},555:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return a}});var i,r,s,o=n(599);class a extends o.Qr{write(){navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(this.contentValue).catch(this.clipboardFallback.bind(this)):this.clipboardFallback()}clipboardFallback(){const e=document.createElement("input");e.value=this.contentValue,document.body.appendChild(e),e.select(),e.setSelectionRange(0,99999),document.execCommand("copy"),document.body.removeChild(e)}}i=a,r="values",s={content:String},(r=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(r))in i?Object.defineProperty(i,r,{value:s,enumerable:!0,configurable:!0,writable:!0}):i[r]=s},563:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return a}});var i=n(599);function r(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const s=()=>{const e=localStorage.getItem("contao--prefers-dark");return null===e?!!window.matchMedia("(prefers-color-scheme: dark)").matches:"true"===e},o=()=>{document.documentElement.dataset.colorScheme=s()?"dark":"light"};window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",o),o();class a extends i.Qr{initialize(){this.toggle=this.toggle.bind(this),this.setLabel=this.setLabel.bind(this)}connect(){this.element.addEventListener("click",this.toggle),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",this.setLabel),this.setLabel()}disconnect(){this.element.removeEventListener("click",this.toggle)}toggle(e){e.preventDefault();const t=!s();t===window.matchMedia("(prefers-color-scheme: dark)").matches?localStorage.removeItem("contao--prefers-dark"):localStorage.setItem("contao--prefers-dark",String(t)),o(),setTimeout(this.setLabel,300)}setLabel(){this.hasLabelTarget&&(this.labelTarget.innerText=this.i18nValue[s()?"light":"dark"])}}r(a,"targets",["label"]),r(a,"values",{i18n:{type:Object,default:{light:"Disable dark mode",dark:"Enable dark mode"}}})},338:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return a}});var i,r,s,o=n(599);class a extends o.Qr{delete(){this.inputTargets.forEach((e=>{e.value=""}))}}i=a,s=["input"],(r=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(r="targets"))in i?Object.defineProperty(i,r,{value:s,enumerable:!0,configurable:!0,writable:!0}):i[r]=s},475:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return s}});var i=n(599);function r(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class s extends i.Qr{toggle(e){let{currentTarget:t,params:{category:n}}=e;const i=t.parentNode.classList.toggle(this.collapsedClass);t.setAttribute("aria-expanded",i?"false":"true"),t.setAttribute("title",i?this.expandTitleValue:this.collapseTitleValue),this.sendRequest(n,i)}sendRequest(e,t){fetch(this.urlValue,{method:"POST",headers:{"X-Requested-With":"XMLHttpRequest"},body:new URLSearchParams({action:"toggleNavigation",id:e,state:t?0:1,REQUEST_TOKEN:this.requestTokenValue})})}}r(s,"classes",["collapsed"]),r(s,"values",{url:String,requestToken:String,expandTitle:String,collapseTitle:String})},290:function(){window.addEventListener("DOMContentLoaded",(function(){const e=document.querySelector("#main .tl_formbody_edit");if(!e)return;const t=e.querySelectorAll("input, textarea");for(let e=0;e]*?name="VERSION_NUMBER"\s+[^>]*?value="([^"]*)"/i.exec(t)[1]}))}i?e.value?(e.value="",e.checked="",i.setStyle("display","none"),i.getElements("[required]").each((function(e){e.set("required",null).set("data-required","")})),new Request.Contao({field:e,onSuccess:r}).post({action:"toggleSubpalette",id:t,field:n,state:0,REQUEST_TOKEN:Contao.request_token})):(e.value=1,e.checked="checked",i.setStyle("display",null),i.getElements("[data-required]").each((function(e){e.set("required","").set("data-required",null)})),new Request.Contao({field:e,onSuccess:r}).post({action:"toggleSubpalette",id:t,field:n,state:1,REQUEST_TOKEN:Contao.request_token})):new Request.Contao({field:e,evalScripts:!1,onRequest:function(){AjaxRequest.displayBox(Contao.lang.loading+" …")},onSuccess:function(n,i){var s=new Element("div",{id:t,class:"subpal cf",html:n,styles:{display:"block"}}).inject($(e).getParent("div").getParent("div"),"after");i.javascript&&(document.write=function(e){var t="";e.replace(/
trans('MSC.date') ?>