From eff27e156f75c68ac43bc2088476586870963ab3 Mon Sep 17 00:00:00 2001 From: Fritz Michael Gschwantner Date: Wed, 5 Jun 2024 16:17:06 +0100 Subject: [PATCH 01/24] Replace non-routable URLs with an empty string for the `{{link*}}` insert tags (see #7264) Description ----------- Fixes #7250 Before: | Type | `{{link_url::*}}` | `{{link::*}}` | `{{link_title::*}}` | `{{link_name::*}}` | | --- | --- | --- | --- | --- | | Page with require item: | `./` | [Detail](./) | Detail | Detail | | Page with index: | `./` | [Index](./) | Index | Index | Regular page: | `page` | [Page](page) | Page | Page After: | Type | `{{link_url::*}}` | `{{link::*}}` | `{{link_title::*}}` | `{{link_name::*}}` | | --- | --- | --- | --- | --- | | Page with require item: | | | Detail | Detail | | Page with index: | `./` | [Index](./) | Index | Index | Regular page: | `page` | [Page](page) | Page | Page Commits ------- 93f7e15b replace non-routable URLs with an empty string --- src/Resources/contao/library/Contao/InsertTags.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Resources/contao/library/Contao/InsertTags.php b/src/Resources/contao/library/Contao/InsertTags.php index 58a26bde2e..597462378d 100644 --- a/src/Resources/contao/library/Contao/InsertTags.php +++ b/src/Resources/contao/library/Contao/InsertTags.php @@ -571,6 +571,8 @@ static function ($allowedTag) } catch (ExceptionInterface $exception) { + $arrCache[$strTag] = ''; + break 2; } break; } @@ -583,6 +585,8 @@ static function ($allowedTag) } catch (ExceptionInterface $exception) { + $arrCache[$strTag] = ''; + break 2; } break; } From 3c329f3b159e18ab9a17524b9da95a76f65ed9ef Mon Sep 17 00:00:00 2001 From: Fritz Michael Gschwantner Date: Wed, 5 Jun 2024 16:24:07 +0100 Subject: [PATCH 02/24] Delete search index entries under more specific conditions (see #7266) Description ----------- In a Contao instance of a customer where indexing of protected pages is enabled I noticed the following issue: if the URL of protected and already indexed page is requested without a valid login for that page, the URL gets deleted from the search index. To fix this I first thought of ignoring the `401` and `403` status code in our `SearchIndexListener` for the delete operation. However, then I realized that there are other status codes where the same holds true: a `503` status code is only temporary and any URL responding momentarily with that status code should not be removed from the index (neither would Google, they would only remove the URL from the index if that status code persists over a longer period of time). Then I realized the same holds true for the `500` status code. Any error happening under a specific URL might only be temporary and thus the URL should not be removed from the index (neither would Google, they would only remove the URL from the index if that status code persists over a longer period of time). Thus I then decided to completely revamp the conditions under which a URL should be deleted from the index: * If the status code is `404` or `410`, always delete from the index. * If the response is succesful and the `X-Robots-Tag` contains `noindex`, always delete from the index. * If the response is succesful and the HTML contains the meta robots tag with `noindex`, always delete from the index. * Otherwise never delete from the index automatically, as any other state might just be temporary for any given URL. Commits ------- 3392dfed revamp SearchIndexListener 018340e8 update wording 3126738f add comment 9ca90d6c Apply suggestions from code review 74ea6353 adjust test and add comment 41d2dc74 remove unused argument 377fe5b0 Apply suggestions from code review e8287f59 remove remaining trailing space --- src/EventListener/SearchIndexListener.php | 44 ++++++++++++++-- .../EventListener/SearchIndexListenerTest.php | 52 +++++++++++++++---- 2 files changed, 83 insertions(+), 13 deletions(-) diff --git a/src/EventListener/SearchIndexListener.php b/src/EventListener/SearchIndexListener.php index 173380a25a..26ee4e0041 100644 --- a/src/EventListener/SearchIndexListener.php +++ b/src/EventListener/SearchIndexListener.php @@ -59,15 +59,14 @@ public function __invoke(TerminateEvent $event): void $document = Document::createFromRequestResponse($request, $response); $needsIndex = $this->needsIndex($request, $response, $document); + $needsDelete = $this->needsDelete($response, $document); try { - $success = $event->getResponse()->isSuccessful(); - - if ($needsIndex && $success && $this->enabledFeatures & self::FEATURE_INDEX) { + if ($needsIndex && $this->enabledFeatures & self::FEATURE_INDEX) { $this->indexer->index($document); } - if (!$success && $this->enabledFeatures & self::FEATURE_DELETE) { + if ($needsDelete && $this->enabledFeatures & self::FEATURE_DELETE) { $this->indexer->delete($document); } } catch (IndexerException $e) { @@ -77,6 +76,11 @@ public function __invoke(TerminateEvent $event): void private function needsIndex(Request $request, Response $response, Document $document): bool { + // Do not index if response was not successful + if (!$response->isSuccessful()) { + return false; + } + // Do not index if called by crawler if (Factory::USER_AGENT === $request->headers->get('User-Agent')) { return false; @@ -108,4 +112,36 @@ private function needsIndex(Request $request, Response $response, Document $docu // If there are no json ld scripts at all, this should not be handled by our indexer return 0 !== \count($lds); } + + private function needsDelete(Response $response, Document $document): bool + { + // Always delete on 404 and 410 responses + if (\in_array($response->getStatusCode(), [Response::HTTP_NOT_FOUND, Response::HTTP_GONE], true)) { + return true; + } + + // Do not delete if the response was not successful + if (!$response->isSuccessful()) { + return false; + } + + // Delete if the X-Robots-Tag header contains "noindex" + if (false !== strpos($response->headers->get('X-Robots-Tag', ''), 'noindex')) { + return true; + } + + try { + $robots = $document->getContentCrawler()->filterXPath('//head/meta[@name="robots"]')->first()->attr('content'); + + // Delete if the meta robots tag contains "noindex" + if (false !== strpos($robots, 'noindex')) { + return true; + } + } catch (\Exception $e) { + // No meta robots tag found + } + + // Otherwise do not delete + return false; + } } diff --git a/tests/EventListener/SearchIndexListenerTest.php b/tests/EventListener/SearchIndexListenerTest.php index ef69ee9d76..0df93e82a5 100644 --- a/tests/EventListener/SearchIndexListenerTest.php +++ b/tests/EventListener/SearchIndexListenerTest.php @@ -99,7 +99,7 @@ public function getRequestResponse(): \Generator false, ]; - yield 'Should be deleted because the response was not successful (404)' => [ + yield 'Should be deleted because the response was "not found" (404)' => [ Request::create('/foobar'), new Response('', 404), SearchIndexListener::FEATURE_DELETE | SearchIndexListener::FEATURE_INDEX, @@ -107,26 +107,26 @@ public function getRequestResponse(): \Generator true, ]; - yield 'Should be deleted because the response was not successful (403)' => [ + yield 'Should be deleted because the response was "gone" (410)' => [ Request::create('/foobar'), - new Response('', 403), + new Response('', 404), SearchIndexListener::FEATURE_DELETE | SearchIndexListener::FEATURE_INDEX, false, true, ]; - yield 'Should not be deleted because even though the response was not successful (403), it was disabled by the feature flag ' => [ + yield 'Should not be deleted because even though the response was "not found" (404), it was disabled by the feature flag' => [ Request::create('/foobar'), - new Response('', 403), + new Response('', 404), SearchIndexListener::FEATURE_INDEX, false, false, ]; - $response = new Response('', 403); + $response = new Response('', 200); $response->headers->set('X-Robots-Tag', 'noindex'); - yield 'Should not be handled because the X-Robots-Tag header contains "noindex" ' => [ + yield 'Should not index but should delete because the X-Robots-Tag header contains "noindex"' => [ Request::create('/foobar'), $response, SearchIndexListener::FEATURE_DELETE | SearchIndexListener::FEATURE_INDEX, @@ -134,12 +134,46 @@ public function getRequestResponse(): \Generator true, ]; - yield 'Should not be handled because the meta robots tag contains "noindex" ' => [ + $response = new Response('', 500); + $response->headers->set('X-Robots-Tag', 'noindex'); + + yield 'Should not index and delete because the X-Robots-Tag header contains "noindex" and response is unsuccessful' => [ Request::create('/foobar'), - new Response('', 403), + $response, + SearchIndexListener::FEATURE_DELETE | SearchIndexListener::FEATURE_INDEX, + false, + false, + ]; + + yield 'Should not index but should delete because the meta robots tag contains "noindex"' => [ + Request::create('/foobar'), + new Response('', 200), SearchIndexListener::FEATURE_DELETE | SearchIndexListener::FEATURE_INDEX, false, true, ]; + + yield 'Should not index and delete because the meta robots tag contains "noindex" and response is unsuccessful' => [ + Request::create('/foobar'), + new Response('', 500), + SearchIndexListener::FEATURE_DELETE | SearchIndexListener::FEATURE_INDEX, + false, + false, + ]; + + // From the unsuccessful responses only the 404 and 410 status codes should execute a deletion. + for ($status = 400; $status < 600; ++$status) { + if (\in_array($status, [Response::HTTP_NOT_FOUND, Response::HTTP_GONE], true)) { + continue; + } + + yield 'Should be skipped because the response status ('.$status.') is not successful and not a "not found" or "gone" response' => [ + Request::create('/foobar'), + new Response('', $status), + SearchIndexListener::FEATURE_DELETE | SearchIndexListener::FEATURE_INDEX, + false, + false, + ]; + } } } From 74238b90918d6f636a105aa16d67d45a626ceeab Mon Sep 17 00:00:00 2001 From: Andreas Schempp Date: Wed, 5 Jun 2024 17:25:14 +0200 Subject: [PATCH 03/24] Handle failed `preg_split()` return values for image sources (see #7263) Description ----------- I had a client drag&drop images into tinyMCE which resultet in binary data in the `src` attribute. That's obviously not a good idea, but even worse was that the backend did break with a message that `\count($paths)` must be an array but was a boolean. Commits ------- 03493cc5 Handle failed preg_split for image source --- src/Resources/contao/library/Contao/StringUtil.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Resources/contao/library/Contao/StringUtil.php b/src/Resources/contao/library/Contao/StringUtil.php index 38655797f7..6fff3c24a3 100644 --- a/src/Resources/contao/library/Contao/StringUtil.php +++ b/src/Resources/contao/library/Contao/StringUtil.php @@ -716,9 +716,15 @@ public static function srcToInsertTag($data) */ public static function insertTagToSrc($data) { - $return = ''; $paths = preg_split('/((src|href)="([^"]*){{file::([^"}|]+)[^"}]*}}")/i', $data, -1, PREG_SPLIT_DELIM_CAPTURE); + if (!$paths) + { + return $data; + } + + $return = ''; + for ($i=0, $c=\count($paths); $i<$c; $i+=5) { $return .= $paths[$i]; From d0b82eb5aaab1db48439c7facf5ec9ea013ce330 Mon Sep 17 00:00:00 2001 From: MD-Netdesign <90682614+md-netdesign@users.noreply.github.com> Date: Thu, 6 Jun 2024 09:32:55 +0200 Subject: [PATCH 04/24] Remove the process timeout in the `SuperviseWorkersCommand` (see #7262) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Description ----------- Fixes #7260 The process timeout for the supervisor command and it's workers is removed when invoked via the cron framework to allow for long running messages and prevent orphaned temporary php.ini files, due to the killed worker processes, when the supervisor command is timed out. The 60 seconds time limit for the workers is not touched, so they will shutdown after 60 seconds or after processing the last messages started before the 60 second limit. Commits ------- 9f363584 Fixes the supervisor / worker process timeout, when used inside conta… Co-authored-by: --- src/Command/SuperviseWorkersCommand.php | 17 ++++++++++++----- src/Cron/SuperviseWorkersCron.php | 7 ++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Command/SuperviseWorkersCommand.php b/src/Command/SuperviseWorkersCommand.php index d8921e6914..368d524728 100644 --- a/src/Command/SuperviseWorkersCommand.php +++ b/src/Command/SuperviseWorkersCommand.php @@ -20,6 +20,7 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; use Symfony\Component\Messenger\Transport\Receiver\MessageCountAwareInterface; +use Symfony\Component\Process\Process; use Toflar\CronjobSupervisor\BasicCommand; use Toflar\CronjobSupervisor\CommandInterface; use Toflar\CronjobSupervisor\Supervisor; @@ -79,11 +80,17 @@ private function createCommandForWorker(string $identifier, array $worker): Comm return new BasicCommand( $identifier, $desiredWorkers, - fn () => $this->processUtil->createSymfonyConsoleProcess( - 'messenger:consume', - ...$worker['options'], - ...$worker['transports'], - ), + function () use ($worker): Process { + $process = $this->processUtil->createSymfonyConsoleProcess( + 'messenger:consume', + ...$worker['options'], + ...$worker['transports'], + ); + + $process->setTimeout(null); + + return $process; + }, ); } diff --git a/src/Cron/SuperviseWorkersCron.php b/src/Cron/SuperviseWorkersCron.php index 16761c5828..958688e8ff 100644 --- a/src/Cron/SuperviseWorkersCron.php +++ b/src/Cron/SuperviseWorkersCron.php @@ -30,8 +30,9 @@ public function __invoke(string $scope): PromiseInterface throw new CronExecutionSkippedException(); } - return $this->processUtil->createPromise( - $this->processUtil->createSymfonyConsoleProcess('contao:supervise-workers'), - ); + $process = $this->processUtil->createSymfonyConsoleProcess('contao:supervise-workers'); + $process->setTimeout(null); + + return $this->processUtil->createPromise($process); } } From 36f185bcf010cdecd2ae82a9a9b061424893775c Mon Sep 17 00:00:00 2001 From: Yanick Witschi Date: Thu, 6 Jun 2024 08:58:26 +0100 Subject: [PATCH 05/24] Rework the messenger integration (see #7253) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Description ----------- Fixes https://github.com/contao/contao/issues/7251 - All the Messenger magic is gone, we now always use the Doctrine queue and all messages are always sent to the queue. - Everything that used the `SyncTransport` before is now automatically delayed to the `kernel.terminate` event providing an advantage for all users (that have access to `fastcgi_finish_request()`), not only the ones that have the cronjob configured. - Logic spread across 4 classes is now centralized in 1 🥳 - It fixes the `You cannot call ack() on the Messenger SyncTransport.` no matter the grace period because the transport configuration does not change anymore. - The grace period has been adjusted to 10 minutes and is now also configurable I've split deleting the old logic and the new in two commits so that it's easier to review. Remarks: - I decided to not create separate `*Listener` classes because they would all be one-liners forwarding to the `WebWorker` service. Now, all the magic is part of the `WebWorker` which makes it way easier to understand and see what's going on. I know we have `*Listener` classes for almost everything else but I strongly suggest to not do that in this case. It also makes removing the one single service from the container super easy in case no transport is configured to use the web worker (`core-bundle` standalone default). Commits ------- 7a8e8ff3 Removed existing auto fallback worker logic 9d6f0b9b New implementation b9af0733 Adjust new implementation 39a3363e Started writing some of the most complex unit tests I have ever written 5dfa70ac Adjust grace period to 10 minutes 7c1d7b54 The actual tests that took me forever... 565da075 Made grace period configurable and renamed the service c9976c09 Adjust config c8625244 Some more tests 8534605f Improve the tests a3cc5c8d Remove debug statement fe68fd87 Docs dc68bceb Exclude Symfony Clock from the GlobalStateWatcher 5d2580c2 Use a different logger approach 1f9061ee Make phpstan happy 22b11c06 Apply suggestions from code review b35e33f3 Cleanup for phpstan 4d3e30a0 Forgot to commit the phpstan-ignore line --- config/listener.yaml | 5 - config/services.yaml | 19 +- src/DependencyInjection/Configuration.php | 28 +++ .../ContaoCoreExtension.php | 13 ++ src/Messenger/AutoFallbackNotifier.php | 64 ------- .../EventListener/WorkerListener.php | 41 ----- .../Transport/AutoFallbackTransport.php | 100 ----------- .../AutoFallbackTransportFactory.php | 68 ------- src/Messenger/WebWorker.php | 129 ++++++++++++++ .../DependencyInjection/ConfigurationTest.php | 22 +++ .../ContaoCoreExtensionTest.php | 21 +++ tests/Messenger/AutoFallbackNotifierTest.php | 88 ---------- .../EventListener/WorkerListenerTest.php | 67 ------- .../AutoFallbackTransportFactoryTest.php | 115 ------------ .../Transport/AutoFallbackTransportTest.php | 84 --------- tests/Messenger/WebWorkerTest.php | 166 ++++++++++++++++++ tests/PhpunitExtension/GlobalStateWatcher.php | 1 + 17 files changed, 387 insertions(+), 644 deletions(-) delete mode 100644 src/Messenger/AutoFallbackNotifier.php delete mode 100644 src/Messenger/EventListener/WorkerListener.php delete mode 100644 src/Messenger/Transport/AutoFallbackTransport.php delete mode 100644 src/Messenger/Transport/AutoFallbackTransportFactory.php create mode 100644 src/Messenger/WebWorker.php delete mode 100644 tests/Messenger/AutoFallbackNotifierTest.php delete mode 100644 tests/Messenger/EventListener/WorkerListenerTest.php delete mode 100644 tests/Messenger/Transport/AutoFallbackTransportFactoryTest.php delete mode 100644 tests/Messenger/Transport/AutoFallbackTransportTest.php create mode 100644 tests/Messenger/WebWorkerTest.php diff --git a/config/listener.yaml b/config/listener.yaml index 07470af8dd..15d5be51e9 100644 --- a/config/listener.yaml +++ b/config/listener.yaml @@ -514,11 +514,6 @@ services: arguments: - '@monolog.logger.contao.error' - contao.messenger.worker_listener: - class: Contao\CoreBundle\Messenger\EventListener\WorkerListener - arguments: - - '@contao.messenger.auto_fallback_notifier' - contao.twig.loader.auto_refresh_template_hierarchy_listener: class: Contao\CoreBundle\Twig\Loader\AutoRefreshTemplateHierarchyListener arguments: diff --git a/config/services.yaml b/config/services.yaml index 99704f2401..4cf53f0e28 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -547,23 +547,18 @@ services: arguments: - '@contao.menu.matcher' - contao.messenger.auto_fallback_notifier: - class: Contao\CoreBundle\Messenger\AutoFallbackNotifier - arguments: - - '@cache.app' - - '@messenger.receiver_locator' - - contao.messenger.auto_fallback_transport_factory: - class: Contao\CoreBundle\Messenger\Transport\AutoFallbackTransportFactory - arguments: - - '@contao.messenger.auto_fallback_notifier' - - '@messenger.receiver_locator' - contao.messenger.search_index_message_handler: class: Contao\CoreBundle\Messenger\MessageHandler\SearchIndexMessageHandler arguments: - '@?contao.search.indexer' + contao.messenger.web_worker: + class: Contao\CoreBundle\Messenger\WebWorker + arguments: + - '@cache.app' + - '@console.command.messenger_consume_messages' + - '@messenger.receiver_locator' + contao.model_argument_resolver: class: Contao\CoreBundle\HttpKernel\ModelArgumentResolver arguments: diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index abf070236c..163780e29c 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -129,6 +129,34 @@ private function addMessengerNode(): NodeDefinition ->addDefaultsIfNotSet() ->info('Allows to define Symfony Messenger workers (messenger:consume). Workers are started every minute using the Contao cron job framework.') ->children() + ->arrayNode('web_worker') + ->addDefaultsIfNotSet() + ->info('Contao provides a way to work on Messenger transports in the web process (kernel.terminate) if there is no real "messenger:consume" worker. You can configure its behavior here.') + ->children() + ->arrayNode('transports') + ->info('The transports to apply the web worker logic to.') + ->scalarPrototype()->end() + ->defaultValue([]) + ->end() + ->scalarNode('grace_period') + ->defaultValue('PT10M') + ->validate() + ->ifTrue( + static function (string $period) { + try { + new \DateInterval($period); + } catch (\Exception) { + return true; + } + + return false; + }, + ) + ->thenInvalid('Must be a valid string for \DateInterval(). %s given.') + ->end() + ->end() + ->end() + ->end() ->arrayNode('workers') ->performNoDeepMerging() ->arrayPrototype() diff --git a/src/DependencyInjection/ContaoCoreExtension.php b/src/DependencyInjection/ContaoCoreExtension.php index 55db388f88..107885858a 100644 --- a/src/DependencyInjection/ContaoCoreExtension.php +++ b/src/DependencyInjection/ContaoCoreExtension.php @@ -243,6 +243,19 @@ public function configureFilesystem(FilesystemConfiguration $config): void private function handleMessengerConfig(array $config, ContainerBuilder $container): void { + if ($container->hasDefinition('contao.messenger.web_worker')) { + $definition = $container->getDefinition('contao.messenger.web_worker'); + + // Remove the entire service and all its listeners if there are no web worker + // transports configured + if ([] === $config['messenger']['web_worker']['transports']) { + $container->removeDefinition('contao.messenger.web_worker'); + } else { + $definition->setArgument(2, $config['messenger']['web_worker']['transports']); + $definition->setArgument(3, $config['messenger']['web_worker']['grace_period']); + } + } + if ( !$container->hasDefinition('contao.cron.supervise_workers') || !$container->hasDefinition('contao.command.supervise_workers') diff --git a/src/Messenger/AutoFallbackNotifier.php b/src/Messenger/AutoFallbackNotifier.php deleted file mode 100644 index f39899ec13..0000000000 --- a/src/Messenger/AutoFallbackNotifier.php +++ /dev/null @@ -1,64 +0,0 @@ -isAutoFallbackTransport($transportName)) { - return; - } - - $item = $this->getCacheItemForTransportName($transportName); - $item->expiresAfter(60); - - $this->cache->save($item); - } - - public function isWorkerRunning(string $transportName): bool - { - if (!$this->isAutoFallbackTransport($transportName)) { - return false; - } - - return $this->getCacheItemForTransportName($transportName)->isHit(); - } - - private function isAutoFallbackTransport(string $transportName): bool - { - if (!$this->messengerTransportLocator->has($transportName)) { - return false; - } - - $transport = $this->messengerTransportLocator->get($transportName); - - return $transport instanceof AutoFallbackTransport; - } - - private function getCacheItemForTransportName(string $transportName): CacheItemInterface - { - return $this->cache->getItem('auto-fallback-transport-notifier-'.$transportName); - } -} diff --git a/src/Messenger/EventListener/WorkerListener.php b/src/Messenger/EventListener/WorkerListener.php deleted file mode 100644 index ac80b4441c..0000000000 --- a/src/Messenger/EventListener/WorkerListener.php +++ /dev/null @@ -1,41 +0,0 @@ -getWorker()->getMetadata()->getTransportNames() as $transportName) { - $this->autoFallbackNotifier->ping($transportName); - } - } - - #[AsEventListener] - public function onWorkerStarted(WorkerStartedEvent $event): void - { - foreach ($event->getWorker()->getMetadata()->getTransportNames() as $transportName) { - $this->autoFallbackNotifier->ping($transportName); - } - } -} diff --git a/src/Messenger/Transport/AutoFallbackTransport.php b/src/Messenger/Transport/AutoFallbackTransport.php deleted file mode 100644 index 3570b879a3..0000000000 --- a/src/Messenger/Transport/AutoFallbackTransport.php +++ /dev/null @@ -1,100 +0,0 @@ -isWorkerRunning()) { - return $this->target->get(); - } - - return $this->fallback->get(); - } - - public function ack(Envelope $envelope): void - { - if ($this->isWorkerRunning()) { - $this->target->ack($envelope); - - return; - } - - $this->fallback->ack($envelope); - } - - public function reject(Envelope $envelope): void - { - if ($this->isWorkerRunning()) { - $this->target->reject($envelope); - - return; - } - - $this->fallback->reject($envelope); - } - - public function send(Envelope $envelope): Envelope - { - if ($this->isWorkerRunning()) { - return $this->target->send($envelope); - } - - return $this->fallback->send($envelope); - } - - public function getMessageCount(): int - { - $transport = $this->isWorkerRunning() ? $this->target : $this->fallback; - - if ($transport instanceof MessageCountAwareInterface) { - return $transport->getMessageCount(); - } - - return 0; - } - - public function getSelfTransportName(): string - { - return $this->selfTransportName; - } - - public function getTarget(): TransportInterface - { - return $this->target; - } - - public function getFallback(): TransportInterface - { - return $this->fallback; - } - - private function isWorkerRunning(): bool - { - return $this->autoFallbackNotifier->isWorkerRunning($this->selfTransportName); - } -} diff --git a/src/Messenger/Transport/AutoFallbackTransportFactory.php b/src/Messenger/Transport/AutoFallbackTransportFactory.php deleted file mode 100644 index 8868c372ad..0000000000 --- a/src/Messenger/Transport/AutoFallbackTransportFactory.php +++ /dev/null @@ -1,68 +0,0 @@ - - */ -class AutoFallbackTransportFactory implements TransportFactoryInterface -{ - public function __construct( - private readonly AutoFallbackNotifier $autoFallbackNotifier, - private readonly ContainerInterface $messengerTransportLocator, - ) { - } - - public function createTransport(string $dsn, array $options, SerializerInterface $serializer): AutoFallbackTransport - { - if (!$parsedUrl = parse_url($dsn)) { - throw new InvalidArgumentException(sprintf('The given Auto Fallback DSN "%s" is invalid.', $dsn)); - } - - parse_str($parsedUrl['query'] ?? '', $parsedQuery); - - $self = $parsedUrl['host'] ?? ''; - $target = $parsedQuery['target'] ?? ''; - $fallback = $parsedQuery['fallback'] ?? ''; - - if (!$this->messengerTransportLocator->has($self)) { - throw new InvalidArgumentException(sprintf('The given Auto Fallback Transport self "%s" is invalid.', $self)); - } - - if (!$this->messengerTransportLocator->has($target)) { - throw new InvalidArgumentException(sprintf('The given Auto Fallback Transport target "%s" is invalid.', $target)); - } - - if (!$this->messengerTransportLocator->has($fallback)) { - throw new InvalidArgumentException(sprintf('The given Auto Fallback Transport fallback "%s" is invalid.', $fallback)); - } - - return new AutoFallbackTransport( - $this->autoFallbackNotifier, - $self, - $this->messengerTransportLocator->get($target), - $this->messengerTransportLocator->get($fallback), - ); - } - - public function supports(string $dsn, array $options): bool - { - return str_starts_with($dsn, 'contao-auto-fallback://'); - } -} diff --git a/src/Messenger/WebWorker.php b/src/Messenger/WebWorker.php new file mode 100644 index 0000000000..009bf46ca4 --- /dev/null +++ b/src/Messenger/WebWorker.php @@ -0,0 +1,129 @@ +transports as $transportName) { + $this->processTransport($transportName); + } + } + + #[AsEventListener] + public function onWorkerStarted(WorkerStartedEvent $event): void + { + foreach ($event->getWorker()->getMetadata()->getTransportNames() as $transportName) { + $this->ping($transportName); + } + } + + #[AsEventListener] + public function onWorkerRunning(WorkerRunningEvent $event): void + { + // Stop idle web workers to free the web process. + if ($this->webWorkerRunning && $event->isWorkerIdle()) { + $event->getWorker()->stop(); + + return; + } + + foreach ($event->getWorker()->getMetadata()->getTransportNames() as $transportName) { + $this->ping($transportName); + } + } + + public function ping(string $transportName): void + { + // If we are running in our web worker process, we never ping (otherwise we + // would self-disable) + if ($this->webWorkerRunning) { + return; + } + + // If this is a transport we don't care about, we don't do anything either + if (!\in_array($transportName, $this->transports, true)) { + return; + } + + $item = $this->getCacheItemForTransportName($transportName); + $item->expiresAfter(new \DateInterval($this->gracePeriod)); + + $this->cache->save($item); + } + + private function getCacheItemForTransportName(string $transportName): CacheItemInterface + { + return $this->cache->getItem('contao-web-worker-'.$transportName); + } + + private function processTransport(string $transportName): void + { + // Real worker is running, abort + if ($this->getCacheItemForTransportName($transportName)->isHit()) { + return; + } + + $this->webWorkerRunning = true; + + $input = new ArrayInput([ + 'receivers' => [$transportName], + '--time-limit' => 30, + ]); + + // No need to log anything because this is done by the messenger:consume command + // already and would only cause log duplication. + $this->consumeMessagesCommand->run($input, new NullOutput()); + + $this->webWorkerRunning = false; + } +} diff --git a/tests/DependencyInjection/ConfigurationTest.php b/tests/DependencyInjection/ConfigurationTest.php index 32d1d77baa..32356fd5f6 100644 --- a/tests/DependencyInjection/ConfigurationTest.php +++ b/tests/DependencyInjection/ConfigurationTest.php @@ -310,6 +310,10 @@ public function testMessengerConfiguration(): void ], ], ], + 'web_worker' => [ + 'transports' => [], + 'grace_period' => 'PT10M', + ], ], $configuration['messenger'], ); @@ -362,6 +366,24 @@ public function testMessengerConfiguration(): void } } + public function testFailsOnInvalidWebWorkerGracePeriod(): void + { + $params = [ + [ + 'messenger' => [ + 'web_worker' => [ + 'grace_period' => 'nonsense', + ], + ], + ], + ]; + + $this->expectException(InvalidConfigurationException::class); + $this->expectExceptionMessage('Invalid configuration for path "contao.messenger.web_worker.grace_period": Must be a valid string for \DateInterval(). "nonsense" given.'); + + (new Processor())->processConfiguration($this->configuration, $params); + } + /** * @dataProvider invalidAllowedInlineStylesRegexProvider */ diff --git a/tests/DependencyInjection/ContaoCoreExtensionTest.php b/tests/DependencyInjection/ContaoCoreExtensionTest.php index ff7c36c7d0..f9db6cc5ae 100644 --- a/tests/DependencyInjection/ContaoCoreExtensionTest.php +++ b/tests/DependencyInjection/ContaoCoreExtensionTest.php @@ -444,6 +444,27 @@ public function testDoesNotRegisterTheDefaultSearchIndexerIfItIsDisabled(): void $this->assertFalse($container->hasDefinition('contao.search.default_indexer')); } + public function testRemovesWebWorkerIfNoTransportsAreConfigured(): void + { + $container = $this->getContainerBuilder(); + + $extension = new ContaoCoreExtension(); + $extension->load( + [ + 'contao' => [ + 'messenger' => [ + 'web_worker' => [ + 'transports' => [], + ], + ], + ], + ], + $container, + ); + + $this->assertFalse($container->hasDefinition('contao.messenger.web_worker')); + } + public function testSetsTheCorrectFeatureFlagOnTheSearchIndexListener(): void { $container = $this->getContainerBuilder(); diff --git a/tests/Messenger/AutoFallbackNotifierTest.php b/tests/Messenger/AutoFallbackNotifierTest.php deleted file mode 100644 index 5c9835165e..0000000000 --- a/tests/Messenger/AutoFallbackNotifierTest.php +++ /dev/null @@ -1,88 +0,0 @@ -set('auto-fallback', $this->createMock(AutoFallbackTransport::class)); - $container->set('regular', $this->createMock(TransportInterface::class)); - - $cacheItem = $this->createMock(CacheItemInterface::class); - $cacheItem - ->expects($this->once()) - ->method('expiresAfter') - ->with(60) - ; - - $cache = $this->createMock(CacheItemPoolInterface::class); - $cache - ->expects($this->once()) - ->method('getItem') - ->with('auto-fallback-transport-notifier-auto-fallback') - ->willReturn($cacheItem) - ; - - $cache - ->expects($this->once()) - ->method('save') - ->with($cacheItem) - ; - - $notifier = new AutoFallbackNotifier($cache, $container); - $notifier->ping('auto-fallback'); - $notifier->ping('regular'); - } - - public function testIsWorkerRunning(): void - { - $container = new Container(); - $container->set('running-auto-fallback', $this->createMock(AutoFallbackTransport::class)); - $container->set('not-running-auto-fallback', $this->createMock(AutoFallbackTransport::class)); - $container->set('regular', $this->createMock(TransportInterface::class)); - - $cacheItem = $this->createMock(CacheItemInterface::class); - $cacheItem - ->expects($this->exactly(2)) - ->method('isHit') - ->willReturnOnConsecutiveCalls(true, false) - ; - - $cache = $this->createMock(CacheItemPoolInterface::class); - $cache - ->expects($this->exactly(2)) - ->method('getItem') - ->withConsecutive( - ['auto-fallback-transport-notifier-running-auto-fallback'], - ['auto-fallback-transport-notifier-not-running-auto-fallback'], - ) - ->willReturn($cacheItem) - ; - - $notifier = new AutoFallbackNotifier($cache, $container); - - $this->assertTrue($notifier->isWorkerRunning('running-auto-fallback')); - $this->assertFalse($notifier->isWorkerRunning('not-running-auto-fallback')); - $this->assertFalse($notifier->isWorkerRunning('regular')); - } -} diff --git a/tests/Messenger/EventListener/WorkerListenerTest.php b/tests/Messenger/EventListener/WorkerListenerTest.php deleted file mode 100644 index 0f3c88e039..0000000000 --- a/tests/Messenger/EventListener/WorkerListenerTest.php +++ /dev/null @@ -1,67 +0,0 @@ -mockWorker(), false); - - $listener = new WorkerListener($this->mockNotifier()); - $listener->onWorkerRunning($event); - } - - public function testPingsCorrectlyOnStart(): void - { - $event = new WorkerStartedEvent($this->mockWorker()); - - $listener = new WorkerListener($this->mockNotifier()); - $listener->onWorkerStarted($event); - } - - private function mockWorker(): Worker - { - $worker = $this->createMock(Worker::class); - $worker - ->expects($this->once()) - ->method('getMetadata') - ->willReturn(new WorkerMetadata(['transportNames' => ['foo', 'bar']])) - ; - - return $worker; - } - - private function mockNotifier(): AutoFallbackNotifier - { - $notifier = $this->createMock(AutoFallbackNotifier::class); - $notifier - ->expects($this->exactly(2)) - ->method('ping') - ->withConsecutive( - ['foo'], - ['bar'], - ) - ; - - return $notifier; - } -} diff --git a/tests/Messenger/Transport/AutoFallbackTransportFactoryTest.php b/tests/Messenger/Transport/AutoFallbackTransportFactoryTest.php deleted file mode 100644 index 29b45597d6..0000000000 --- a/tests/Messenger/Transport/AutoFallbackTransportFactoryTest.php +++ /dev/null @@ -1,115 +0,0 @@ -createMock(CacheItemPoolInterface::class), new Container()); - $factory = new AutoFallbackTransportFactory($notifier, new Container()); - - $this->assertTrue($factory->supports('contao-auto-fallback://my_transport_name?target=target_transport&fallback=fallback_transport', [])); - $this->assertFalse($factory->supports('doctrine://default', [])); - } - - public function testCreatesTransport(): void - { - $self = $this->createMock(TransportInterface::class); - $target = $this->createMock(TransportInterface::class); - $fallback = $this->createMock(TransportInterface::class); - - $container = new Container(); - $container->set('my_transport_name', $self); - $container->set('target_transport', $target); - $container->set('fallback_transport', $fallback); - - $notifier = new AutoFallbackNotifier($this->createMock(CacheItemPoolInterface::class), new Container()); - $factory = new AutoFallbackTransportFactory($notifier, $container); - - $transport = $factory->createTransport( - 'contao-auto-fallback://my_transport_name?target=target_transport&fallback=fallback_transport', - [], - $this->createMock(SerializerInterface::class), - ); - - $this->assertSame('my_transport_name', $transport->getSelfTransportName()); - $this->assertSame($target, $transport->getTarget()); - $this->assertSame($fallback, $transport->getFallback()); - } - - public function testFailsIfSelfDoesNotExist(): void - { - $this->expectException(\InvalidArgumentException::class); - $this->expectExceptionMessage('The given Auto Fallback Transport self "my_transport_name" is invalid.'); - - $container = new Container(); - $container->set('target_transport', $this->createMock(TransportInterface::class)); - $container->set('fallback_transport', $this->createMock(TransportInterface::class)); - - $notifier = new AutoFallbackNotifier($this->createMock(CacheItemPoolInterface::class), new Container()); - $factory = new AutoFallbackTransportFactory($notifier, $container); - - $factory->createTransport( - 'contao-auto-fallback://my_transport_name?target=target_transport&fallback=fallback_transport', - [], - $this->createMock(SerializerInterface::class), - ); - } - - public function testFailsIfTargetDoesNotExist(): void - { - $this->expectException(\InvalidArgumentException::class); - $this->expectExceptionMessage('The given Auto Fallback Transport target "target_transport" is invalid.'); - - $container = new Container(); - $container->set('my_transport_name', $this->createMock(TransportInterface::class)); - $container->set('fallback_transport', $this->createMock(TransportInterface::class)); - - $notifier = new AutoFallbackNotifier($this->createMock(CacheItemPoolInterface::class), new Container()); - $factory = new AutoFallbackTransportFactory($notifier, $container); - - $factory->createTransport( - 'contao-auto-fallback://my_transport_name?target=target_transport&fallback=fallback_transport', - [], - $this->createMock(SerializerInterface::class), - ); - } - - public function testFailsIfFallbackDoesNotExist(): void - { - $this->expectException(\InvalidArgumentException::class); - $this->expectExceptionMessage('The given Auto Fallback Transport fallback "fallback_transport" is invalid.'); - - $container = new Container(); - $container->set('my_transport_name', $this->createMock(TransportInterface::class)); - $container->set('target_transport', $this->createMock(TransportInterface::class)); - - $notifier = new AutoFallbackNotifier($this->createMock(CacheItemPoolInterface::class), new Container()); - $factory = new AutoFallbackTransportFactory($notifier, $container); - - $factory->createTransport( - 'contao-auto-fallback://my_transport_name?target=target_transport&fallback=fallback_transport', - [], - $this->createMock(SerializerInterface::class), - ); - } -} diff --git a/tests/Messenger/Transport/AutoFallbackTransportTest.php b/tests/Messenger/Transport/AutoFallbackTransportTest.php deleted file mode 100644 index bb2a96e284..0000000000 --- a/tests/Messenger/Transport/AutoFallbackTransportTest.php +++ /dev/null @@ -1,84 +0,0 @@ -createMock(AutoFallbackNotifier::class); - $notifier - ->expects($this->exactly(4)) - ->method('isWorkerRunning') - ->with('foobar') - ->willReturn($isRunning) - ; - - $target = $this->mockTransport($isRunning); - $fallback = $this->mockTransport(!$isRunning); - - $transport = new AutoFallbackTransport( - $notifier, - 'foobar', - $target, - $fallback, - ); - - $transport->get(); - $transport->ack(new Envelope(new \stdClass())); - $transport->reject(new Envelope(new \stdClass())); - $transport->send(new Envelope(new \stdClass())); - } - - public static function isRunning(): iterable - { - yield [true]; - yield [false]; - } - - private function mockTransport(bool $expectCalls): TransportInterface - { - $transport = $this->createMock(TransportInterface::class); - $transport - ->expects($expectCalls ? $this->once() : $this->never()) - ->method('get') - ; - - $transport - ->expects($expectCalls ? $this->once() : $this->never()) - ->method('ack') - ; - - $transport - ->expects($expectCalls ? $this->once() : $this->never()) - ->method('reject') - ; - - $transport - ->expects($expectCalls ? $this->once() : $this->never()) - ->method('send') - ->willReturn(new Envelope(new \stdClass())) - ; - - return $transport; - } -} diff --git a/tests/Messenger/WebWorkerTest.php b/tests/Messenger/WebWorkerTest.php new file mode 100644 index 0000000000..249e369439 --- /dev/null +++ b/tests/Messenger/WebWorkerTest.php @@ -0,0 +1,166 @@ +logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []): void + { + $this->logs[] = $message; + } + + public function getLogs(): array + { + return $this->logs; + } + }; + + $this->eventDispatcher = new EventDispatcher(); + $this->createConsumeCommand(); + } + + public function testPingOnlyAboutConfiguredTransports(): void + { + $cache = $this->createMock(CacheItemPoolInterface::class); + $cache + ->expects($this->atLeastOnce()) // Tests that transport-2 is not called + ->method('getItem') + ->with('contao-web-worker-transport-1') + ; + + $webWorker = new WebWorker( + $cache, + $this->command, + ['transport-1'], + ); + + $this->addEventsToEventDispatcher($webWorker); + $this->triggerRealWorkers(['transport-1', 'transport-2']); + } + + public function testWorkerIsStoppedIfIdle(): void + { + $cache = new ArrayAdapter(); // No real workers running + + $webWorker = new WebWorker( + $cache, + $this->command, + ['transport-1'], + ); + + $this->addEventsToEventDispatcher($webWorker); + $this->triggerWebWorker(); + + // This test would run for 30 seconds if it failed. If the worker is correctly + // stopped, it will return immediately and log "Stopping worker.". + // @phpstan-ignore method.notFound + $this->assertContains('Stopping worker.', $this->logger->getLogs()); + } + + private function triggerWebWorker(): void + { + $this->eventDispatcher->dispatch(new TerminateEvent( + $this->createMock(HttpKernelInterface::class), + new Request(), + new Response(), + )); + } + + private function triggerRealWorkers(array $transports): void + { + $listener = static function (WorkerRunningEvent $event): void { + if ($event->isWorkerIdle()) { + $event->getWorker()->stop(); + } + }; + + $this->eventDispatcher->addListener(WorkerRunningEvent::class, $listener); + + $input = new ArrayInput([ + 'receivers' => $transports, + ]); + + $this->command->run($input, new NullOutput()); + $this->eventDispatcher->removeListener(WorkerRunningEvent::class, $listener); + } + + private function createConsumeCommand(): void + { + $receiverLocator = new Container(); + $receiverLocator->set('transport-1', $this->createMock(ReceiverInterface::class)); + $receiverLocator->set('transport-2', $this->createMock(ReceiverInterface::class)); + $receiverLocator->set('transport-3', $this->createMock(ReceiverInterface::class)); + + $this->command = new ConsumeMessagesCommand( + $this->createMock(RoutableMessageBus::class), + $receiverLocator, + $this->eventDispatcher, + $this->logger, + ); + } + + private function addEventsToEventDispatcher(WebWorker $webWorker): void + { + $this->eventDispatcher->addListener( + WorkerStartedEvent::class, + static function (WorkerStartedEvent $event) use ($webWorker): void { + $webWorker->onWorkerStarted($event); + }, + ); + + $this->eventDispatcher->addListener( + WorkerRunningEvent::class, + static function (WorkerRunningEvent $event) use ($webWorker): void { + $webWorker->onWorkerRunning($event); + }, + ); + + $this->eventDispatcher->addListener( + TerminateEvent::class, + static function (TerminateEvent $event) use ($webWorker): void { + $webWorker->onKernelTerminate($event); + }, + ); + } +} diff --git a/tests/PhpunitExtension/GlobalStateWatcher.php b/tests/PhpunitExtension/GlobalStateWatcher.php index f4b0620fd3..c594fd8600 100644 --- a/tests/PhpunitExtension/GlobalStateWatcher.php +++ b/tests/PhpunitExtension/GlobalStateWatcher.php @@ -158,6 +158,7 @@ private function buildStaticMembers(): string 'SebastianBergmann\\', 'Symfony\Bridge\PhpUnit\\', 'Symfony\Component\Cache\Adapter\\', + 'Symfony\Component\Clock\Clock', 'Symfony\Component\Config\Resource\ComposerResource', 'Symfony\Component\Console\Helper\\', 'Symfony\Component\Console\Terminal', From c5f4c01433f100b3cff1d923831d79030f9da41b Mon Sep 17 00:00:00 2001 From: Andreas Schempp Date: Fri, 7 Jun 2024 09:39:38 +0200 Subject: [PATCH 06/24] Initialize the Contao framework when working with opt-in tokens (see #7268) Description ----------- Got this erro in my logs: ``` RuntimeException: The Symfony container is not available, did you initialize the Contao framework? in vendor/contao/core-bundle/contao/library/Contao/System.php:143 Stack trace: #0 vendor/contao/core-bundle/contao/library/Contao/System.php(97): Contao\System->import('Contao\\Config', 'Config') #1 vendor/contao/core-bundle/contao/library/Contao/DcaExtractor.php(105): Contao\System->__construct() #2 vendor/contao/core-bundle/contao/library/Contao/DcaExtractor.php(140): Contao\DcaExtractor->__construct('tl_opt_in') #3 vendor/contao/core-bundle/contao/library/Contao/Model.php(291): Contao\DcaExtractor::getInstance('tl_opt_in') #4 vendor/contao/core-bundle/contao/library/Contao/Model.php(1084): Contao\Model::getUniqueFields() #5 vendor/contao/core-bundle/contao/models/OptInModel.php(87): Contao\Model::findBy(Array, 1716888783, Array) #6 vendor/contao/core-bundle/src/Framework/Adapter.php(38): Contao\OptInModel::findExpiredTokens() #7 vendor/contao/core-bundle/src/OptIn/OptIn.php(76): Contao\CoreBundle\Framework\Adapter->__call('findExpiredToke...', Array) #8 vendor/contao/core-bundle/src/Cron/PurgeOptInTokensCron.php(30): Contao\CoreBundle\OptIn\OptIn->purgeTokens() #9 vendor/contao/core-bundle/src/Cron/CronJob.php(44): Contao\CoreBundle\Cron\PurgeOptInTokensCron->__invoke('cli') #10 vendor/contao/core-bundle/src/Cron/Cron.php(197): Contao\CoreBundle\Cron\CronJob->__invoke('cli') #11 vendor/contao/core-bundle/src/Cron/Cron.php(182): Contao\CoreBundle\Cron\Cron->executeCrons(Array, 'cli', Object(Closure)) #12 vendor/contao/core-bundle/src/Cron/Cron.php(97): Contao\CoreBundle\Cron\Cron->doRun(Array, 'cli', false) #13 vendor/contao/core-bundle/src/Command/CronCommand.php(53): Contao\CoreBundle\Cron\Cron->run('cli', false) #14 vendor/symfony/console/Command/Command.php(326): Contao\CoreBundle\Command\CronCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #15 vendor/symfony/console/Application.php(1096): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #16 vendor/symfony/framework-bundle/Console/Application.php(126): Symfony\Component\Console\Application->doRunCommand(Object(Contao\CoreBundle\Command\CronCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #17 vendor/symfony/console/Application.php(324): Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand(Object(Contao\CoreBundle\Command\CronCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #18 vendor/symfony/framework-bundle/Console/Application.php(80): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #19 vendor/symfony/console/Application.php(175): Symfony\Bundle\FrameworkBundle\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #20 vendor/contao/manager-bundle/bin/contao-console(40): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput)) #21 vendor/bin/contao-console(119): #22 ``` Commits ------- 9ee76a07 Initialize the Contao framework when working with opt-in tokens --- src/OptIn/OptIn.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/OptIn/OptIn.php b/src/OptIn/OptIn.php index 16bf46d6a6..d1c326270a 100644 --- a/src/OptIn/OptIn.php +++ b/src/OptIn/OptIn.php @@ -42,6 +42,8 @@ public function create(string $prefix, string $email, array $related): OptInToke $token = $prefix.'-'.substr($token, \strlen($prefix) + 1); } + $this->framework->initialize(); + $optIn = $this->framework->createInstance(OptInModel::class); $optIn->tstamp = time(); $optIn->token = $token; @@ -60,6 +62,8 @@ public function create(string $prefix, string $email, array $related): OptInToke public function find(string $identifier): OptInTokenInterface|null { + $this->framework->initialize(); + $adapter = $this->framework->getAdapter(OptInModel::class); if (!$model = $adapter->findByToken($identifier)) { @@ -71,6 +75,8 @@ public function find(string $identifier): OptInTokenInterface|null public function purgeTokens(): void { + $this->framework->initialize(); + $adapter = $this->framework->getAdapter(OptInModel::class); if (!$tokens = $adapter->findExpiredTokens()) { From ec9f4109ba357136639f42d610fd51d1b7fd8433 Mon Sep 17 00:00:00 2001 From: Fritz Michael Gschwantner Date: Tue, 11 Jun 2024 08:26:42 +0100 Subject: [PATCH 07/24] Replace non-routable URLs with an empty string for the `{{link*}}` insert tags (see #7270) Description ----------- Same as #7264 for Contao 5. Commits ------- a3f3929a replace non-routable URLs with an empty string 0fd0f2b8 use '/' --- src/InsertTag/Resolver/LinkInsertTag.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/InsertTag/Resolver/LinkInsertTag.php b/src/InsertTag/Resolver/LinkInsertTag.php index 22bb2f9596..3b2905f107 100644 --- a/src/InsertTag/Resolver/LinkInsertTag.php +++ b/src/InsertTag/Resolver/LinkInsertTag.php @@ -92,10 +92,20 @@ public function replaceInsertTag(ResolvedInsertTag $insertTag): InsertTagResult $strUrl = StringUtil::encodeEmail($strUrl); } } catch (ExceptionInterface) { - // Use empty URL defined above + // Replace with empty string (#7250) + switch ($insertTag->getName()) { + case 'link': + case 'link_open': + case 'link_url': return new InsertTagResult(''); + } } } + // Use "/" for the index page (#2394) + if ('' === $strUrl) { + $strUrl = '/'; + } + $strName = $objNextPage->title; $strTarget = $objNextPage->target ? ' target="_blank" rel="noreferrer noopener"' : ''; $strClass = $objNextPage->cssClass ? sprintf(' class="%s"', $objNextPage->cssClass) : ''; @@ -107,9 +117,9 @@ public function replaceInsertTag(ResolvedInsertTag $insertTag): InsertTagResult } return match ($insertTag->getName()) { - 'link' => new InsertTagResult(sprintf('%s', $strUrl ?: './', StringUtil::specialcharsAttribute($strTitle), $strClass, $strTarget, $strName), OutputType::html), - 'link_open' => new InsertTagResult(sprintf('', $strUrl ?: './', StringUtil::specialcharsAttribute($strTitle), $strClass, $strTarget), OutputType::html), - 'link_url' => new InsertTagResult($strUrl ?: './', OutputType::url), + 'link' => new InsertTagResult(sprintf('%s', $strUrl, StringUtil::specialcharsAttribute($strTitle), $strClass, $strTarget, $strName), OutputType::html), + 'link_open' => new InsertTagResult(sprintf('', $strUrl, StringUtil::specialcharsAttribute($strTitle), $strClass, $strTarget), OutputType::html), + 'link_url' => new InsertTagResult($strUrl, OutputType::url), 'link_title' => new InsertTagResult(StringUtil::specialcharsAttribute($strTitle), OutputType::html), 'link_name' => new InsertTagResult(StringUtil::specialcharsAttribute($strName), OutputType::html), default => throw new InvalidInsertTagException(), From ea823b88779fe6a71272b2644cd2344245b65f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ausw=C3=B6ger?= Date: Thu, 13 Jun 2024 09:52:52 +0200 Subject: [PATCH 08/24] Improve the docs of `quoteIdentifier()` and `findInSet()` (see #7277) Description ----------- This should bring more clarity to the usage of the methods `Database::quoteIdentifier()` and `Database::findInSet()`. Commits ------- 5c45d53c Improve docs of quoteIdentifier() and findInSet() --- src/Resources/contao/library/Contao/Database.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Resources/contao/library/Contao/Database.php b/src/Resources/contao/library/Contao/Database.php index 2b23631020..e6c73bdfb4 100644 --- a/src/Resources/contao/library/Contao/Database.php +++ b/src/Resources/contao/library/Contao/Database.php @@ -220,6 +220,11 @@ public function query($strQuery) /** * Auto-generate a FIND_IN_SET() statement * + * Do not pass user input as $strKey to this method as only identifiers get + * quoted and SQL expressions get returned as is! + * + * @internal Do not use this class in your code + * * @param string $strKey The field name * @param mixed $varSet The set to find the key in * @param boolean $blnIsField If true, the set will not be quoted @@ -718,6 +723,12 @@ public function getUuid() /** * Quote the column name if it is a reserved word * + * Do not pass user input to this method as only identifiers get quoted and + * SQL expressions get returned as is! + * + * @internal Do not use this class in your code; use the "quoteIdentifier()" + * method of the "@database_connection" service instead + * * @param string $strName * * @return string From 827ea89232033dba9826e864eb2632795e519b44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ausw=C3=B6ger?= Date: Mon, 17 Jun 2024 12:21:36 +0200 Subject: [PATCH 09/24] Check CSRF and private response after the session (see #7282) Description ----------- Same as #7281 for Contao 5.3 Commits ------- e6d9aaab Check CSRF and private response after the session cd61132e Coding style --- .../CsrfTokenCookieSubscriber.php | 36 ++-------- .../MakeResponsePrivateListener.php | 69 ++++++++----------- .../ContaoCoreExtensionTest.php | 2 +- .../MakeResponsePrivateListenerTest.php | 65 ++++++++++++----- 4 files changed, 79 insertions(+), 93 deletions(-) diff --git a/src/EventListener/CsrfTokenCookieSubscriber.php b/src/EventListener/CsrfTokenCookieSubscriber.php index e955a5d1dc..5c41d9b88a 100644 --- a/src/EventListener/CsrfTokenCookieSubscriber.php +++ b/src/EventListener/CsrfTokenCookieSubscriber.php @@ -22,8 +22,6 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\ResponseHeaderBag; -use Symfony\Component\HttpFoundation\Session\Session; -use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; @@ -93,8 +91,9 @@ public static function getSubscribedEvents(): array // (defaults to 32) KernelEvents::REQUEST => ['onKernelRequest', 36], // The priority must be higher than the one of the make-response-private listener - // (defaults to -896) - KernelEvents::RESPONSE => ['onKernelResponse', -832], + // (defaults to -1012) and lower than the one of the session listener (defaults + // to -1000) + KernelEvents::RESPONSE => ['onKernelResponse', -1006], ConsoleEvents::COMMAND => ['onCommand', 36], ]; } @@ -111,34 +110,7 @@ private function requiresCsrf(Request $request, Response $response): bool return true; } - if ($request->getUserInfo()) { - return true; - } - - return $request->hasSession() && !$this->isSessionEmpty($request->getSession()); - } - - private function isSessionEmpty(SessionInterface $session): bool - { - foreach (headers_list() as $header) { - if ( - str_starts_with($header, "Set-Cookie: {$session->getName()}=") - && !str_starts_with($header, "Set-Cookie: {$session->getName()}=deleted;") - ) { - return false; - } - } - - if (!$session->isStarted()) { - return true; - } - - if ($session instanceof Session) { - // Marked @internal but no other way to check all attribute bags - return $session->isEmpty(); - } - - return [] === $session->all(); + return (bool) $request->getUserInfo(); } private function setCookies(Request $request, Response $response): void diff --git a/src/EventListener/MakeResponsePrivateListener.php b/src/EventListener/MakeResponsePrivateListener.php index 69d2eee559..5652ba1667 100644 --- a/src/EventListener/MakeResponsePrivateListener.php +++ b/src/EventListener/MakeResponsePrivateListener.php @@ -16,20 +16,12 @@ use Symfony\Component\EventDispatcher\Attribute\AsEventListener; use Symfony\Component\HttpFoundation\Cookie; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpFoundation\Session\Session; -use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\EventListener\AbstractSessionListener; /** - * The priority must be lower than the one of MergeHttpHeadersListener (defaults - * to 256) and must be lower than the one of the ClearSessionDataListener listener - * (defaults to -768) and must be lower than the one of the - * CsrfTokenCookieSubscriber listener (defaults to -832). - * * @internal */ -#[AsEventListener(priority: -896)] class MakeResponsePrivateListener { final public const DEBUG_HEADER = 'Contao-Private-Response-Reason'; @@ -38,20 +30,41 @@ public function __construct(private readonly ScopeMatcher $scopeMatcher) { } + /** + * The priority must be higher than the one of the session listener (defaults to -1000). + */ + #[AsEventListener(priority: -896)] + public function disableSymfonyAutoCacheControl(ResponseEvent $event): void + { + if (!$this->scopeMatcher->isContaoMainRequest($event)) { + return; + } + + // Disable the default Symfony auto cache control + $event->getResponse()->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, '1'); + } + /** * Make sure that the current response becomes a private response if any of the * following conditions are true. * * 1. An Authorization header is present and not empty - * 2. The session was started - * 3. The response sets a cookie (same reason as 2 but for other cookies than the session cookie) + * 2. The session was started by a request header + * 3. The response sets a cookie (including session cookies as this listener comes after the session listener) * 4. The response has a "Vary: Cookie" header and the request provides at least one cookie * * Some of this logic is also already implemented in the HttpCache (1, 2 and 3), * but we want to make sure it works for any reverse proxy without having to * configure too much. + * + * The priority must be lower than the one of MergeHttpHeadersListener (defaults + * to 256) and must be lower than the one of the ClearSessionDataListener listener + * (defaults to -768) and must be lower than the one of the + * CsrfTokenCookieSubscriber listener (defaults to -1006) and must be higher than + * the one of the StreamedResponseListener listener (defaults to -1024) */ - public function __invoke(ResponseEvent $event): void + #[AsEventListener(priority: -1012)] + public function makeResponsePrivate(ResponseEvent $event): void { if (!$this->scopeMatcher->isContaoMainRequest($event)) { return; @@ -60,9 +73,6 @@ public function __invoke(ResponseEvent $event): void $request = $event->getRequest(); $response = $event->getResponse(); - // Disable the default Symfony auto cache control - $response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, '1'); - // If the response is not cacheable for a reverse proxy, we don't have to do // anything anyway if (!$response->isCacheable()) { @@ -76,15 +86,15 @@ public function __invoke(ResponseEvent $event): void return; } - // 2) The session was started and is not empty - if ($request->hasSession() && !$this->isSessionEmpty($request->getSession())) { + // 2) The session was started by a request header + if ($request->hasSession(true) && $request->hasPreviousSession()) { $this->makePrivate($response, 'session-cookie'); return; } - // 3) The response sets a cookie (same reason as 2 but for other cookies than the - // session cookie) + // 3) The response sets a cookie (including session cookies as this listener + // comes after the session listener) if ($cookies = $response->headers->getCookies()) { $this->makePrivate( $response, @@ -112,27 +122,4 @@ private function makePrivate(Response $response, string $reason): void $response->setPrivate(); $response->headers->set(self::DEBUG_HEADER, $reason); } - - private function isSessionEmpty(SessionInterface $session): bool - { - foreach (headers_list() as $header) { - if ( - str_starts_with($header, "Set-Cookie: {$session->getName()}=") - && !str_starts_with($header, "Set-Cookie: {$session->getName()}=deleted;") - ) { - return false; - } - } - - if (!$session->isStarted()) { - return true; - } - - if ($session instanceof Session) { - // Marked @internal but no other way to check all attribute bags - return $session->isEmpty(); - } - - return [] === $session->all(); - } } diff --git a/tests/DependencyInjection/ContaoCoreExtensionTest.php b/tests/DependencyInjection/ContaoCoreExtensionTest.php index f9db6cc5ae..f5d9d74bcc 100644 --- a/tests/DependencyInjection/ContaoCoreExtensionTest.php +++ b/tests/DependencyInjection/ContaoCoreExtensionTest.php @@ -83,7 +83,7 @@ public function testRegistersTheMakeResponsePrivateListenerAtTheEnd(): void $container = $this->getContainerBuilder(); $makeResponsePrivateDefinition = $container->getDefinition('contao.listener.make_response_private'); - $attribute = (new \ReflectionClass($makeResponsePrivateDefinition->getClass()))->getAttributes()[0]; + $attribute = (new \ReflectionClass($makeResponsePrivateDefinition->getClass()))->getMethod('makeResponsePrivate')->getAttributes()[0]; $makeResponsePrivatePriority = $attribute->getArguments()['priority']; $mergeHeadersListenerDefinition = $container->getDefinition('contao.listener.merge_http_headers'); diff --git a/tests/EventListener/MakeResponsePrivateListenerTest.php b/tests/EventListener/MakeResponsePrivateListenerTest.php index bd0f4e982b..71a89f33cf 100644 --- a/tests/EventListener/MakeResponsePrivateListenerTest.php +++ b/tests/EventListener/MakeResponsePrivateListenerTest.php @@ -45,7 +45,7 @@ public function testIgnoresNonContaoMainRequests(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(false)); - $listener($event); + $listener->makeResponsePrivate($event); $this->assertTrue($response->headers->getCacheControlDirective('public')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); @@ -65,10 +65,9 @@ public function testIgnoresRequestsThatMatchNoCondition(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); $this->assertTrue($response->headers->getCacheControlDirective('public')); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertSame('600', $response->headers->getCacheControlDirective('max-age')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -90,9 +89,8 @@ public function testMakesResponsePrivateWhenAnAuthorizationHeaderIsPresent(): vo ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('private')); $this->assertSame('authorization', $response->headers->get(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -114,9 +112,8 @@ public function testIgnoresTheResponseWhenAnAuthorizationHeaderIsEmpty(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('public')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -138,9 +135,8 @@ public function testIgnoresTheResponseWhenAnAuthorizationHeaderIsNull(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('public')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -166,9 +162,8 @@ public function testIgnoresTheResponseWhenTheSessionWasStartedButIsEmpty(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('public')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -185,6 +180,8 @@ public function testMakesResponsePrivateWhenTheSessionIsStartedAndNotEmpty(): vo $request = new Request(); $request->setSession($session); + $request->cookies->set($session->getName(), $session->getId()); + $event = new ResponseEvent( $this->createMock(KernelInterface::class), $request, @@ -193,9 +190,8 @@ public function testMakesResponsePrivateWhenTheSessionIsStartedAndNotEmpty(): vo ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('private')); $this->assertSame('session-cookie', $response->headers->get(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -217,9 +213,8 @@ public function testMakesResponsePrivateWhenTheResponseContainsACookie(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('private')); $this->assertSame('response-cookies (foobar, foobar2)', $response->headers->get(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -239,9 +234,8 @@ public function testMakesResponsePrivateWhenItContainsVaryCookieAndTheRequestPro ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('private')); $this->assertSame('request-cookies (super-cookie)', $response->headers->get(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -261,13 +255,46 @@ public function testIgnoresTheResponseWhenItContainsVaryCookieButTheRequestDoesN ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('public')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); } + public function testDisablesSymfonyAutoCache(): void + { + $response = new Response(); + + $event = new ResponseEvent( + $this->createMock(KernelInterface::class), + new Request(), + HttpKernelInterface::MAIN_REQUEST, + $response, + ); + + $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); + $listener->disableSymfonyAutoCacheControl($event); + + $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); + } + + public function testDoesNotDisableSymfonyAutoCache(): void + { + $response = new Response(); + + $event = new ResponseEvent( + $this->createMock(KernelInterface::class), + new Request(), + HttpKernelInterface::MAIN_REQUEST, + $response, + ); + + $listener = new MakeResponsePrivateListener($this->createScopeMatcher(false)); + $listener->disableSymfonyAutoCacheControl($event); + + $this->assertFalse($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); + } + private function createScopeMatcher(bool $isContaoMainRequest): ScopeMatcher { $scopeMatcher = $this->createMock(ScopeMatcher::class); From 6d45c62e86113a5757d1066213e9e5a9ec06ef0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ausw=C3=B6ger?= Date: Tue, 18 Jun 2024 08:59:18 +0200 Subject: [PATCH 10/24] Check CSRF and private response after the session (see #7281) Description ----------- Followup to #7213 Commits ------- fddd360a Check CSRF and private response after the session 96c8f5b0 Disable auto cache in make response private listener a421739d Missing test af230ecd Improve session started test 9dd22f05 Update core-bundle/src/Resources/config/listener.yml 3064003d Update core-bundle/src/Resources/config/listener.yml --- .../CsrfTokenCookieSubscriber.php | 34 +--------- .../MakeResponsePrivateListener.php | 50 +++++---------- src/Resources/config/listener.yml | 7 +- .../ContaoCoreExtensionTest.php | 2 +- .../MakeResponsePrivateListenerTest.php | 64 +++++++++++++------ 5 files changed, 70 insertions(+), 87 deletions(-) diff --git a/src/EventListener/CsrfTokenCookieSubscriber.php b/src/EventListener/CsrfTokenCookieSubscriber.php index 70846cb66b..5e291a6d0e 100644 --- a/src/EventListener/CsrfTokenCookieSubscriber.php +++ b/src/EventListener/CsrfTokenCookieSubscriber.php @@ -22,8 +22,6 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\ResponseHeaderBag; -use Symfony\Component\HttpFoundation\Session\Session; -use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; @@ -95,8 +93,9 @@ public static function getSubscribedEvents(): array return [ // The priority must be higher than the one of the Symfony route listener (defaults to 32) KernelEvents::REQUEST => ['onKernelRequest', 36], - // The priority must be higher than the one of the make-response-private listener (defaults to -896) - KernelEvents::RESPONSE => ['onKernelResponse', -832], + // The priority must be higher than the one of the make-response-private listener (defaults to -1012) + // and lower than the one of the session listener (defaults to -1000) + KernelEvents::RESPONSE => ['onKernelResponse', -1006], ConsoleEvents::COMMAND => ['onCommand', 36], ]; } @@ -117,36 +116,9 @@ private function requiresCsrf(Request $request, Response $response): bool return true; } - if ($request->hasSession() && !$this->isSessionEmpty($request->getSession())) { - return true; - } - return false; } - private function isSessionEmpty(SessionInterface $session): bool - { - foreach (headers_list() as $header) { - if ( - str_starts_with($header, "Set-Cookie: {$session->getName()}=") - && !str_starts_with($header, "Set-Cookie: {$session->getName()}=deleted;") - ) { - return false; - } - } - - if (!$session->isStarted()) { - return true; - } - - if ($session instanceof Session) { - // Marked @internal but no other way to check all attribute bags - return $session->isEmpty(); - } - - return [] === $session->all(); - } - private function setCookies(Request $request, Response $response): void { $isSecure = $request->isSecure(); diff --git a/src/EventListener/MakeResponsePrivateListener.php b/src/EventListener/MakeResponsePrivateListener.php index 487db30d17..2414e27346 100644 --- a/src/EventListener/MakeResponsePrivateListener.php +++ b/src/EventListener/MakeResponsePrivateListener.php @@ -15,8 +15,6 @@ use Contao\CoreBundle\Routing\ScopeMatcher; use Symfony\Component\HttpFoundation\Cookie; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpFoundation\Session\Session; -use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\EventListener\AbstractSessionListener; @@ -34,19 +32,29 @@ public function __construct(ScopeMatcher $scopeMatcher) $this->scopeMatcher = $scopeMatcher; } + public function disableSymfonyAutoCacheControl(ResponseEvent $event): void + { + if (!$this->scopeMatcher->isContaoMainRequest($event)) { + return; + } + + // Disable the default Symfony auto cache control + $event->getResponse()->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, '1'); + } + /** * Make sure that the current response becomes a private response if any * of the following conditions are true. * * 1. An Authorization header is present and not empty - * 2. The session was started - * 3. The response sets a cookie (same reason as 2 but for other cookies than the session cookie) + * 2. The session was started by a request header + * 3. The response sets a cookie (including session cookies as this listener comes after the session listener) * 4. The response has a "Vary: Cookie" header and the request provides at least one cookie * * Some of this logic is also already implemented in the HttpCache (1, 2 and 3), but we * want to make sure it works for any reverse proxy without having to configure too much. */ - public function __invoke(ResponseEvent $event): void + public function makeResponsePrivate(ResponseEvent $event): void { if (!$this->scopeMatcher->isContaoMainRequest($event)) { return; @@ -55,9 +63,6 @@ public function __invoke(ResponseEvent $event): void $request = $event->getRequest(); $response = $event->getResponse(); - // Disable the default Symfony auto cache control - $response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, '1'); - // If the response is not cacheable for a reverse proxy, we don't have to do anything anyway if (!$response->isCacheable()) { return; @@ -70,14 +75,14 @@ public function __invoke(ResponseEvent $event): void return; } - // 2) The session was started and is not empty - if ($request->hasSession() && !$this->isSessionEmpty($request->getSession())) { + // 2) The session was started by a request header + if ($request->hasSession(true) && $request->hasPreviousSession()) { $this->makePrivate($response, 'session-cookie'); return; } - // 3) The response sets a cookie (same reason as 2 but for other cookies than the session cookie) + // 3) The response sets a cookie (including session cookies as this listener comes after the session listener) $cookies = $response->headers->getCookies(); if (0 !== \count($cookies)) { @@ -106,27 +111,4 @@ private function makePrivate(Response $response, string $reason): void $response->setPrivate(); $response->headers->set(self::DEBUG_HEADER, $reason); } - - private function isSessionEmpty(SessionInterface $session): bool - { - foreach (headers_list() as $header) { - if ( - str_starts_with($header, "Set-Cookie: {$session->getName()}=") - && !str_starts_with($header, "Set-Cookie: {$session->getName()}=deleted;") - ) { - return false; - } - } - - if (!$session->isStarted()) { - return true; - } - - if ($session instanceof Session) { - // Marked @internal but no other way to check all attribute bags - return $session->isEmpty(); - } - - return [] === $session->all(); - } } diff --git a/src/Resources/config/listener.yml b/src/Resources/config/listener.yml index fc2fed0d50..cdf047876f 100644 --- a/src/Resources/config/listener.yml +++ b/src/Resources/config/listener.yml @@ -322,10 +322,13 @@ services: arguments: - '@contao.routing.scope_matcher' tags: + # The priority must be higher than the one of the session listener (defaults to -1000) + - { name: kernel.event_listener, method: disableSymfonyAutoCacheControl, priority: -896 } # The priority must be lower than the one of MergeHttpHeadersListener (defaults to 256) # and must be lower than the one of the ClearSessionDataListener listener (defaults to -768) - # and must be lower than the one of the CsrfTokenCookieSubscriber listener (defaults to -832) - - { name: kernel.event_listener, priority: -896 } + # and must be lower than the one of the CsrfTokenCookieSubscriber listener (defaults to -1006) + - and must be higher than the one of the StreamedResponseListener listener (defaults to -1024) + - { name: kernel.event_listener, method: makeResponsePrivate, priority: -1012 } contao.listener.menu.backend: class: Contao\CoreBundle\EventListener\Menu\BackendMenuListener diff --git a/tests/DependencyInjection/ContaoCoreExtensionTest.php b/tests/DependencyInjection/ContaoCoreExtensionTest.php index 97d2a6a6c0..9dd70d9b8a 100644 --- a/tests/DependencyInjection/ContaoCoreExtensionTest.php +++ b/tests/DependencyInjection/ContaoCoreExtensionTest.php @@ -84,7 +84,7 @@ public function testRegistersTheMakeResponsePrivateListenerAtTheEnd(): void $makeResponsePrivateDefinition = $container->getDefinition('contao.listener.make_response_private'); $makeResponsePrivateTags = $makeResponsePrivateDefinition->getTags(); - $makeResponsePrivatePriority = $makeResponsePrivateTags['kernel.event_listener'][0]['priority'] ?? 0; + $makeResponsePrivatePriority = $makeResponsePrivateTags['kernel.event_listener'][1]['priority'] ?? 0; $mergeHeadersListenerDefinition = $container->getDefinition('contao.listener.merge_http_headers'); $mergeHeadersListenerTags = $mergeHeadersListenerDefinition->getTags(); diff --git a/tests/EventListener/MakeResponsePrivateListenerTest.php b/tests/EventListener/MakeResponsePrivateListenerTest.php index 0c4a228a0d..78a912c40d 100644 --- a/tests/EventListener/MakeResponsePrivateListenerTest.php +++ b/tests/EventListener/MakeResponsePrivateListenerTest.php @@ -43,7 +43,7 @@ public function testIgnoresNonContaoMainRequests(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(false)); - $listener($event); + $listener->makeResponsePrivate($event); $this->assertTrue($response->headers->getCacheControlDirective('public')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); @@ -63,10 +63,9 @@ public function testIgnoresRequestsThatMatchNoCondition(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); $this->assertTrue($response->headers->getCacheControlDirective('public')); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertSame('600', $response->headers->getCacheControlDirective('max-age')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -88,9 +87,8 @@ public function testMakesResponsePrivateWhenAnAuthorizationHeaderIsPresent(): vo ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('private')); $this->assertSame('authorization', $response->headers->get(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -112,9 +110,8 @@ public function testIgnoresTheResponseWhenAnAuthorizationHeaderIsEmpty(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('public')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -136,9 +133,8 @@ public function testIgnoresTheResponseWhenAnAuthorizationHeaderIsNull(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('public')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -164,9 +160,8 @@ public function testIgnoresTheResponseWhenTheSessionWasStartedButIsEmpty(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('public')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -182,6 +177,7 @@ public function testMakesResponsePrivateWhenTheSessionIsStartedAndNotEmpty(): vo $request = new Request(); $request->setSession($session); + $request->cookies->set($session->getName(), $session->getId()); $event = new ResponseEvent( $this->createMock(KernelInterface::class), @@ -191,9 +187,8 @@ public function testMakesResponsePrivateWhenTheSessionIsStartedAndNotEmpty(): vo ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('private')); $this->assertSame('session-cookie', $response->headers->get(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -214,9 +209,8 @@ public function testMakesResponsePrivateWhenTheResponseContainsACookie(): void ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('private')); $this->assertSame('response-cookies (foobar, foobar2)', $response->headers->get(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -236,9 +230,8 @@ public function testMakesResponsePrivateWhenItContainsVaryCookieAndTheRequestPro ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('private')); $this->assertSame('request-cookies (super-cookie)', $response->headers->get(MakeResponsePrivateListener::DEBUG_HEADER)); } @@ -258,13 +251,46 @@ public function testIgnoresTheResponseWhenItContainsVaryCookieButTheRequestDoesN ); $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); - $listener($event); + $listener->makeResponsePrivate($event); - $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); $this->assertTrue($response->headers->getCacheControlDirective('public')); $this->assertFalse($response->headers->has(MakeResponsePrivateListener::DEBUG_HEADER)); } + public function testDisablesSymfonyAutoCache(): void + { + $response = new Response(); + + $event = new ResponseEvent( + $this->createMock(KernelInterface::class), + new Request(), + HttpKernelInterface::MAIN_REQUEST, + $response + ); + + $listener = new MakeResponsePrivateListener($this->createScopeMatcher(true)); + $listener->disableSymfonyAutoCacheControl($event); + + $this->assertTrue($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); + } + + public function testDoesNotDisableSymfonyAutoCache(): void + { + $response = new Response(); + + $event = new ResponseEvent( + $this->createMock(KernelInterface::class), + new Request(), + HttpKernelInterface::MAIN_REQUEST, + $response + ); + + $listener = new MakeResponsePrivateListener($this->createScopeMatcher(false)); + $listener->disableSymfonyAutoCacheControl($event); + + $this->assertFalse($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); + } + private function createScopeMatcher(bool $isContaoMainRequest): ScopeMatcher { $scopeMatcher = $this->createMock(ScopeMatcher::class); From 01cc99db95f8f49fc7a30d2a6becb9985b446d81 Mon Sep 17 00:00:00 2001 From: Yanick Witschi Date: Tue, 18 Jun 2024 13:28:20 +0200 Subject: [PATCH 11/24] Use the translator language instead of the request language for the `iflng` and `ifnlng` insert tags (see #7283) Description ----------- Currently, the `{{iflng}}` insert tags are using `$request->getLocale()`. This means, they are ignoring the locale they would get when using e.g. the `LocaleSwitcher` service. The insert tags are meant to use the same locale as the `Translator` does. Commits ------- 4833c4b1 Fixed IfLanguageInsertTag should be translation specific, not page e789c37e Fixed tests --- config/services.yaml | 2 +- .../Resolver/IfLanguageInsertTag.php | 14 +++++-------- tests/Contao/InsertTagsTest.php | 20 +++++++------------ .../Compiler/AddInsertTagsPassTest.php | 4 ++-- tests/InsertTag/InsertTagParserTest.php | 3 ++- 5 files changed, 17 insertions(+), 26 deletions(-) diff --git a/config/services.yaml b/config/services.yaml index 4cf53f0e28..a6ee6bf8a3 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -470,7 +470,7 @@ services: contao.insert_tag.resolver.if_language: class: Contao\CoreBundle\InsertTag\Resolver\IfLanguageInsertTag arguments: - - '@request_stack' + - '@translator' contao.insert_tag.resolver.legacy: class: Contao\CoreBundle\InsertTag\Resolver\LegacyInsertTag diff --git a/src/InsertTag/Resolver/IfLanguageInsertTag.php b/src/InsertTag/Resolver/IfLanguageInsertTag.php index c05489f047..81d6ca9a62 100644 --- a/src/InsertTag/Resolver/IfLanguageInsertTag.php +++ b/src/InsertTag/Resolver/IfLanguageInsertTag.php @@ -18,13 +18,13 @@ use Contao\CoreBundle\InsertTag\ResolvedInsertTag; use Contao\CoreBundle\Util\LocaleUtil; use Contao\StringUtil; -use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Contracts\Translation\TranslatorInterface; #[AsBlockInsertTag('iflng', endTag: 'iflng')] #[AsBlockInsertTag('ifnlng', endTag: 'ifnlng')] class IfLanguageInsertTag implements BlockInsertTagResolverNestedResolvedInterface { - public function __construct(private readonly RequestStack $requestStack) + public function __construct(private readonly TranslatorInterface $translator) { } @@ -36,20 +36,16 @@ public function __invoke(ResolvedInsertTag $insertTag, ParsedSequence $wrappedCo throw new InvalidInsertTagException(sprintf('Missing language parameter in %s insert tag', $insertTag->getName())); } - if ($this->languageMatchesPage($language)) { + if ($this->languageMatchesTranslatorLocale($language)) { return $inverse ? new ParsedSequence([]) : $wrappedContent; } return $inverse ? $wrappedContent : new ParsedSequence([]); } - private function languageMatchesPage(string $language): bool + private function languageMatchesTranslatorLocale(string $language): bool { - if (!$request = $this->requestStack->getCurrentRequest()) { - return false; - } - - $pageLanguage = LocaleUtil::formatAsLocale($request->getLocale()); + $pageLanguage = LocaleUtil::formatAsLocale($this->translator->getLocale()); foreach (StringUtil::trimsplit(',', $language) as $lang) { if ($pageLanguage === LocaleUtil::formatAsLocale($lang)) { diff --git a/tests/Contao/InsertTagsTest.php b/tests/Contao/InsertTagsTest.php index b6912b4da8..accea117e8 100644 --- a/tests/Contao/InsertTagsTest.php +++ b/tests/Contao/InsertTagsTest.php @@ -30,9 +30,9 @@ use Psr\Log\LoggerInterface; use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Component\Config\FileLocatorInterface; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpKernel\Fragment\FragmentHandler; +use Symfony\Contracts\Translation\TranslatorInterface; class InsertTagsTest extends TestCase { @@ -779,18 +779,12 @@ public static function encodeHtmlAttributesProvider(): iterable * * @group legacy */ - public function testRemovesLanguageInsertTags(string $source, string $expected, string $pageLanguage = 'en'): void + public function testRemovesLanguageInsertTags(string $source, string $expected, string $translatorLocale = 'en'): void { - $request = $this->createMock(Request::class); - $request + $translator = $this->createMock(TranslatorInterface::class); + $translator ->method('getLocale') - ->willReturn($pageLanguage) - ; - - $requestStack = $this->createMock(RequestStack::class); - $requestStack - ->method('getCurrentRequest') - ->willReturn($request) + ->willReturn($translatorLocale) ; $reflectionClass = new \ReflectionClass(InsertTags::class); @@ -801,7 +795,7 @@ public function testRemovesLanguageInsertTags(string $source, string $expected, System::getContainer()->set('contao.insert_tag.parser', $insertTagParser); $insertTagParser->addBlockSubscription(new InsertTagSubscription( - new IfLanguageInsertTag($requestStack), + new IfLanguageInsertTag($translator), '__invoke', 'iflng', 'iflng', @@ -810,7 +804,7 @@ public function testRemovesLanguageInsertTags(string $source, string $expected, )); $insertTagParser->addBlockSubscription(new InsertTagSubscription( - new IfLanguageInsertTag($requestStack), + new IfLanguageInsertTag($translator), '__invoke', 'ifnlng', 'ifnlng', diff --git a/tests/DependencyInjection/Compiler/AddInsertTagsPassTest.php b/tests/DependencyInjection/Compiler/AddInsertTagsPassTest.php index 80897ec6b2..6cbe264682 100644 --- a/tests/DependencyInjection/Compiler/AddInsertTagsPassTest.php +++ b/tests/DependencyInjection/Compiler/AddInsertTagsPassTest.php @@ -176,10 +176,10 @@ public static function getAddsExpectedMethodCalls(): iterable yield [ [ - 'service_a' => (new Definition(IfLanguageInsertTag::class))->addTag('contao.insert_tag', get_object_vars(new AsInsertTag('date', method: 'languageMatchesPage'))), + 'service_a' => (new Definition(IfLanguageInsertTag::class))->addTag('contao.insert_tag', get_object_vars(new AsInsertTag('date', method: 'languageMatchesTranslatorLocale'))), ], [], - new InvalidDefinitionException('The contao.insert_tag definition for service "service_a" is invalid. The "Contao\CoreBundle\InsertTag\Resolver\IfLanguageInsertTag::languageMatchesPage" method exists but is not public.'), + new InvalidDefinitionException('The contao.insert_tag definition for service "service_a" is invalid. The "Contao\CoreBundle\InsertTag\Resolver\IfLanguageInsertTag::languageMatchesTranslatorLocale" method exists but is not public.'), ]; yield [ diff --git a/tests/InsertTag/InsertTagParserTest.php b/tests/InsertTag/InsertTagParserTest.php index 43df94fb97..ba872a58b7 100644 --- a/tests/InsertTag/InsertTagParserTest.php +++ b/tests/InsertTag/InsertTagParserTest.php @@ -32,6 +32,7 @@ use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpKernel\Controller\ControllerReference; use Symfony\Component\HttpKernel\Fragment\FragmentHandler; +use Symfony\Contracts\Translation\TranslatorInterface; class InsertTagParserTest extends TestCase { @@ -214,7 +215,7 @@ public function __toString(): string $parser = new InsertTagParser($this->createMock(ContaoFramework::class), $this->createMock(LoggerInterface::class), $this->createMock(FragmentHandler::class), $this->createMock(RequestStack::class)); $parser->addSubscription(new InsertTagSubscription(new LegacyInsertTag(System::getContainer()), '__invoke', 'br', null, true, false)); - $parser->addBlockSubscription(new InsertTagSubscription(new IfLanguageInsertTag($this->createMock(RequestStack::class)), '__invoke', 'ifnlng', 'ifnlng', true, false)); + $parser->addBlockSubscription(new InsertTagSubscription(new IfLanguageInsertTag($this->createMock(TranslatorInterface::class)), '__invoke', 'ifnlng', 'ifnlng', true, false)); System::getContainer()->set('contao.insert_tag.parser', $parser); $this->assertSame($expected, $parser->replaceInline($source)); From 3ae44da465ca1f9302d71594d526928842d02349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ausw=C3=B6ger?= Date: Tue, 18 Jun 2024 13:33:51 +0200 Subject: [PATCH 12/24] Fix missing query parameters in the file insert tag (see #7287) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Description ----------- Fixes #7220 But please be aware that this usage of the `{{file::*}}` insert tag is deprecated: _“Using the file insert tag to include templates has been deprecated and will no longer work in Contao 6. Use the "Template" content element instead.”_ Commits ------- 35346dae Fix missing query parameters in file insert tag --- src/InsertTag/Resolver/LegacyInsertTag.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/InsertTag/Resolver/LegacyInsertTag.php b/src/InsertTag/Resolver/LegacyInsertTag.php index 8c3c537c56..7571d93ed2 100644 --- a/src/InsertTag/Resolver/LegacyInsertTag.php +++ b/src/InsertTag/Resolver/LegacyInsertTag.php @@ -623,17 +623,21 @@ public function __invoke(ResolvedInsertTag $insertTag): InsertTagResult trigger_deprecation('contao/core-bundle', '5.0', 'Using the file insert tag to include templates has been deprecated and will no longer work in Contao 6. Use the "Template" content element instead.'); + $requestStack = $this->container->get('request_stack'); + $subRequest = null; $arrGet = $_GET; $strFile = $insertTag->getParameters()->get(0); // Take arguments and add them to the $_GET array if (str_contains($strFile, '?')) { + $subRequest = $requestStack->getCurrentRequest()->duplicate(); $arrChunks = explode('?', urldecode($strFile)); $strSource = StringUtil::decodeEntities($arrChunks[1]); $arrParams = explode('&', $strSource); foreach ($arrParams as $strParam) { $arrParam = explode('=', $strParam); + $subRequest->query->set($arrParam[0], $arrParam[1]); $_GET[$arrParam[0]] = $arrParam[1]; } @@ -647,6 +651,10 @@ public function __invoke(ResolvedInsertTag $insertTag): InsertTagResult // Include .php, .tpl, .xhtml and .html5 files if (preg_match('/\.(php|tpl|xhtml|html5)$/', $strFile) && (new Filesystem())->exists($this->container->getParameter('kernel.project_dir').'/templates/'.$strFile)) { + if ($subRequest) { + $requestStack->push($subRequest); + } + ob_start(); try { @@ -654,6 +662,10 @@ public function __invoke(ResolvedInsertTag $insertTag): InsertTagResult $result = ob_get_contents(); } finally { ob_end_clean(); + + if ($subRequest) { + $requestStack->pop(); + } } } From 6feac9c9792d4dd452261303c8dcfe87e3a42c0d Mon Sep 17 00:00:00 2001 From: Andreas Schempp Date: Tue, 18 Jun 2024 13:35:58 +0200 Subject: [PATCH 13/24] Decouple the locale subscriber test from the request implementation (see #7285) Description ----------- The LocaleSubscriperTest should not test the implementation details of the Request class. Fixes issues with https://github.com/contao/contao/pull/7279 Commits ------- 79779f94 Decouple LocaleSubscriberTest from Request implementation --- tests/EventListener/LocaleSubscriberTest.php | 62 ++++++++++++++++---- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/tests/EventListener/LocaleSubscriberTest.php b/tests/EventListener/LocaleSubscriberTest.php index 724d502c6b..2c16fd96fc 100644 --- a/tests/EventListener/LocaleSubscriberTest.php +++ b/tests/EventListener/LocaleSubscriberTest.php @@ -12,9 +12,9 @@ namespace Contao\CoreBundle\Tests\EventListener; -use Contao\CoreBundle\ContaoCoreBundle; use Contao\CoreBundle\EventListener\LocaleSubscriber; use Contao\CoreBundle\Intl\Locales; +use Contao\CoreBundle\Routing\ScopeMatcher; use Contao\CoreBundle\Tests\TestCase; use PHPUnit\Framework\MockObject\MockObject; use Symfony\Component\HttpFoundation\ParameterBag; @@ -31,22 +31,39 @@ class LocaleSubscriberTest extends TestCase */ public function testReadsTheLocaleFromTheRequest(string|null $locale, string $expected): void { - $request = Request::create('/'); - $request->attributes->set('_locale', $locale); - $request->attributes->set('_scope', ContaoCoreBundle::SCOPE_FRONTEND); + $request = $this->createMock(Request::class); + $request->attributes = $this->createMock(ParameterBag::class); + $request->attributes + ->expects($this->atLeastOnce()) + ->method('get') + ->with('_locale') + ->willReturn($expected) + ; + + $request->attributes + ->expects($this->once()) + ->method('set') + ->with('_locale', $expected) + ; + + $scopeMatcher = $this->createMock(ScopeMatcher::class); + $scopeMatcher + ->expects($this->once()) + ->method('isContaoRequest') + ->with($request) + ->willReturn(true) + ; $kernel = $this->createMock(KernelInterface::class); $event = new RequestEvent($kernel, $request, HttpKernelInterface::MAIN_REQUEST); $listener = new LocaleSubscriber( $this->createMock(LocaleAwareInterface::class), - $this->mockScopeMatcher(), + $scopeMatcher, $this->mockLocales(['en']), ); $listener->onKernelRequest($event); - - $this->assertSame($expected, $request->attributes->get('_locale')); } public static function getLocaleRequestData(): iterable @@ -64,9 +81,23 @@ public static function getLocaleRequestData(): iterable */ public function testReadsTheLocaleFromTheAcceptLanguageHeader(string|null $locale, string $expected, array $available): void { - $request = Request::create('/'); - $request->headers->set('Accept-Language', $locale); - $request->attributes->set('_scope', ContaoCoreBundle::SCOPE_FRONTEND); + $request = $this->createMock(Request::class); + $request->attributes = new ParameterBag(); + + $request + ->expects($this->once()) + ->method('getPreferredLanguage') + ->with($available) + ->willReturn($expected) + ; + + $scopeMatcher = $this->createMock(ScopeMatcher::class); + $scopeMatcher + ->expects($this->once()) + ->method('isContaoRequest') + ->with($request) + ->willReturn(true) + ; $event = new RequestEvent( $this->createMock(KernelInterface::class), @@ -76,7 +107,7 @@ public function testReadsTheLocaleFromTheAcceptLanguageHeader(string|null $local $listener = new LocaleSubscriber( $this->createMock(LocaleAwareInterface::class), - $this->mockScopeMatcher(), + $scopeMatcher, $this->mockLocales($available), ); @@ -121,8 +152,13 @@ public function testDoesNothingIfThereIsNoRequestScope(): void public function testSetsTheTranslatorLocale(): void { - $request = Request::create('/'); - $request->headers->set('Accept-Language', 'de'); + $request = $this->createMock(Request::class); + $request + ->expects($this->once()) + ->method('getPreferredLanguage') + ->with(['en', 'de']) + ->willReturn('de') + ; $event = new RequestEvent( $this->createMock(KernelInterface::class), From 9cdf18187741de3019bd556dfaa80da8114d1d01 Mon Sep 17 00:00:00 2001 From: Andreas Schempp Date: Tue, 18 Jun 2024 16:08:50 +0200 Subject: [PATCH 14/24] Return to the list view after adding items to the clipboard (see #7055) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Description ----------- Re-implements https://github.com/contao/contao/pull/7007 DC_Table needs to check for the clipboard content instead of `act = paste` now, to correctly render paste buttons etc. Commits ------- 2121c134 Revert "Revert "Return to the list view after adding items to the cli… 76a8df55 Correctly handle clipboard instead of paste action 8ae5c1a7 Generate return URL from current URL c1e4c0a6 Include the parentID on redirect --- contao/drivers/DC_Table.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/contao/drivers/DC_Table.php b/contao/drivers/DC_Table.php index 58e0b4bb79..621f3fd387 100644 --- a/contao/drivers/DC_Table.php +++ b/contao/drivers/DC_Table.php @@ -392,6 +392,15 @@ public function showAll() ); $objSession->set('CLIPBOARD', $arrClipboard); + + if ($this->currentPid) + { + $this->redirect(Backend::addToUrl('id='.$this->currentPid, false, array('act', 'mode'))); + } + else + { + $this->redirect(Backend::addToUrl('', false, array('act', 'mode', 'id'))); + } } // Custom filter @@ -3966,7 +3975,7 @@ protected function treeView() $breadcrumb = $GLOBALS['TL_DCA'][$table]['list']['sorting']['breadcrumb'] ?? ''; // Return if there are no records - if (!$tree && Input::get('act') != 'paste') + if (!$tree && !$blnClipboard) { if ($breadcrumb) { @@ -4342,7 +4351,7 @@ protected function generateTree($table, $id, $arrPrevNext, $blnHasSorting, $intM { $mouseover = ' toggle_select hover-div'; } - elseif (($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['mode'] ?? null) == self::MODE_TREE_EXTENDED && Input::get('act') == 'paste') + elseif (($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['mode'] ?? null) == self::MODE_TREE_EXTENDED && $arrClipboard !== false) { $mouseover = ' hover-div'; } @@ -4620,7 +4629,7 @@ protected function parentView()
'; // List all records of the child table - if (\in_array(Input::get('act'), array('paste', 'select', null))) + if (\in_array(Input::get('act'), array('select', null))) { // Header $imagePasteNew = Image::getHtml('new.svg', $labelPasteNew[0]); From 9b100090fc4f9f858606a0d2d066d7b0a548f12d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ausw=C3=B6ger?= Date: Tue, 18 Jun 2024 16:09:26 +0200 Subject: [PATCH 15/24] Skip sleeping in messenger web worker (see #7289) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Description ----------- I noticed a huge increase in response time on systems that don’t have `fastcgi_finish_request()` available. The reason for it is that the `messenger:consume` command in the web worker sleeps one second for each transport. I think we should disable that sleep :) Response time went from 3396ms down to 154ms after this change on my system (Apache mod_php). Commits ------- 969b8698 Skip sleeping in messenger web worker --- src/Messenger/WebWorker.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Messenger/WebWorker.php b/src/Messenger/WebWorker.php index 009bf46ca4..fb21d8b9e2 100644 --- a/src/Messenger/WebWorker.php +++ b/src/Messenger/WebWorker.php @@ -118,6 +118,7 @@ private function processTransport(string $transportName): void $input = new ArrayInput([ 'receivers' => [$transportName], '--time-limit' => 30, + '--sleep' => 0, ]); // No need to log anything because this is done by the messenger:consume command From f84a57fab799d12ad5646491231790acd6ed3543 Mon Sep 17 00:00:00 2001 From: Leo Feyer <1192057+leofeyer@users.noreply.github.com> Date: Wed, 19 Jun 2024 10:42:31 +0200 Subject: [PATCH 16/24] Fix drag and drop in the file manager (see #7291) Description ----------- Fixes #7284 Commits ------- 070861bc Fix drag and drop in the file manager af0e2b59 Fix the issue in the comments bundle --- contao/themes/flexible/backend.49ffe8ed.css.map | 1 - .../flexible/{backend.49ffe8ed.css => backend.509d1d15.css} | 4 ++-- contao/themes/flexible/backend.509d1d15.css.map | 1 + contao/themes/flexible/entrypoints.json | 2 +- contao/themes/flexible/manifest.json | 4 ++-- contao/themes/flexible/styles/main.css | 1 - public/{backend.69d856f0.js => backend.147aae9f.js} | 6 +++--- public/backend.147aae9f.js.map | 1 + public/backend.69d856f0.js.map | 1 - public/entrypoints.json | 2 +- public/manifest.json | 4 ++-- 11 files changed, 13 insertions(+), 14 deletions(-) delete mode 100644 contao/themes/flexible/backend.49ffe8ed.css.map rename contao/themes/flexible/{backend.49ffe8ed.css => backend.509d1d15.css} (55%) create mode 100644 contao/themes/flexible/backend.509d1d15.css.map rename public/{backend.69d856f0.js => backend.147aae9f.js} (96%) create mode 100644 public/backend.147aae9f.js.map delete mode 100644 public/backend.69d856f0.js.map diff --git a/contao/themes/flexible/backend.49ffe8ed.css.map b/contao/themes/flexible/backend.49ffe8ed.css.map deleted file mode 100644 index 3df44f4468..0000000000 --- a/contao/themes/flexible/backend.49ffe8ed.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"backend.49ffe8ed.css","mappings":"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","sources":["webpack:///./core-bundle/contao/themes/flexible/styles/fonts.css","webpack:///./core-bundle/contao/themes/flexible/styles/basic.css","webpack:///./core-bundle/contao/themes/flexible/styles/main.css"],"sourcesContent":["/* Architects Daughter (https://google-webfonts-helper.herokuapp.com/fonts/architects-daughter?subsets=latin) */\n@font-face {\n\tfont-family: \"Architects Daughter\";\n\tsrc: local(\"Architects Daughter\"),\n\t\turl(\"fonts/architects-daughter-v6-latin-regular.woff2\") format(\"woff2\"),\n\t\turl(\"fonts/architects-daughter-v6-latin-regular.woff\") format(\"woff\");\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n","/* Appearance */\n:root {\n\t--text: #222;\n\t--body-bg: #eaeaec;\n\t--content-bg: #fff;\n\t--content-border: #cacacc;\n\t--black: #000;\n\t--white: #fff;\n\t--gray: #999;\n\t--green: #589b0e;\n\t--red: #c33;\n\t--blue: #006494;\n\t--orange: #f90;\n\t--contao: #f47c00;\n\t--border: #eaeaec;\n\t--nav: #d3d6da;\n\t--nav-hover: #eaedf1;\n\t--nav-bg: #0f1c26;\n\t--nav-hover-bg: #eaedf1;\n\t--nav-current: #172b3b;\n\t--nav-group: #9fa4a8;\n\t--nav-separator: #3a454d;\n\t--hover-row: #fffce1;\n\t--header-bg: #f47c00;\n\t--header-bg-hover: #e67300;\n\t--header-text: #fff;\n\t--invert-bg: #333;\n\t--invert-text: #fff;\n\t--table-header: #f7f7f8;\n\t--table-odd: #fff;\n\t--table-even: #fbfbfc;\n\t--table-nb-header: #f2f2f3;\n\t--table-nb-odd: #fff;\n\t--table-nb-even: #f7f7f8;\n\t--panel-bg: #f3f3f5;\n\t--tree-header: #f3f3f5;\n\t--tree-header-border: #dddddf;\n\t--form-text-disabled: #bbb;\n\t--form-border: #aaa;\n\t--form-border-disabled: #c8c8c8;\n\t--form-bg: #fff;\n\t--form-bg-hover: #f6f6f6;\n\t--form-bg-disabled: #f9f9f9;\n\t--form-button: #eee;\n\t--form-button-hover: #f6f6f6;\n\t--form-button-active: #aaa;\n\t--form-button-disabled: #e9e9e9;\n\t--diff-left: #ffe8e5;\n\t--diff-del: #ffc1bf;\n\t--diff-right: #e0ffe8;\n\t--diff-ins: #abf2bc;\n\t--code-bg: #f0f0f0;\n\t--checkerbox-bg: #ddd;\n\t--info: #808080;\n\t--active-bg: #fffce1;\n\t--active-border: #e7b36a;\n\t--pre-disabled: #a6a6a6;\n\t--error-bg: rgba(204,51,51,.15);\n\t--confirm-bg: rgba(88,155,14,.15);\n\t--info-bg: rgba(0,100,148,.15);\n\t--new-bg: rgba(224,149,21,.15);\n\t--progress-running: #f47c00;\n\t--progress-finished: #589b0e;\n\t--drag-bg: #a3c2db;\n\t--legend: #6a6a6c;\n\t--paste-hint: #838990;\n\t--serp-preview: #3c4043;\n\t--serp-preview-title: #1a0dab;\n\t--nested-bg: #fbfbfd;\n}\n\nhtml[data-color-scheme=\"dark\"] {\n\tcolor-scheme: dark;\n\t--text: #ddd;\n\t--body-bg: #121416;\n\t--content-bg: #1b1d21;\n\t--content-border: #414448;\n\t--black: #fff;\n\t--white: #000;\n\t--blue: #0073a8;\n\t--orange: #d68c23;\n\t--contao: #f47c00;\n\t--border: #303236;\n\t--nav-bg: #1b1d21;\n\t--nav-hover-bg: #1b325f;\n\t--nav-current: #272a30;\n\t--nav-separator: #3f3f3f;\n\t--hover-row: #1b325f;\n\t--header-bg: #292c32;\n\t--header-bg-hover: #202327;\n\t--header-text: #ddd;\n\t--invert-bg: #8f96a3;\n\t--invert-text: #222;\n\t--table-header: #232529;\n\t--table-odd: #1b1d21;\n\t--table-even: #1e2024;\n\t--table-nb-header: #292c32;\n\t--table-nb-odd: #1b1d21;\n\t--table-nb-even: #23252a;\n\t--panel-bg: #272a30;\n\t--tree-header: #272a30;\n\t--tree-header-border: #3f4146;\n\t--form-text-disabled: #666;\n\t--form-border: #44464b;\n\t--form-border-disabled: #3a3c40;\n\t--form-bg: #151619;\n\t--form-bg-hover: #1e2024;\n\t--form-bg-disabled: #1e2024;\n\t--form-button: #31333a;\n\t--form-button-hover: #383a42;\n\t--form-button-active: #777;\n\t--form-button-disabled: #26272c;\n\t--diff-left: rgba(248,81,73,.17);\n\t--diff-del: rgba(248,81,73,.4);\n\t--diff-right: rgba(46,160,67,.17);\n\t--diff-ins: rgba(46,160,67,.4);\n\t--code-bg: #30343b;\n\t--checkerbox-bg: #30343b;\n\t--info: #9095a2;\n\t--active-bg: #1b325f;\n\t--active-border: #264787;\n\t--drag-bg: #1b325f;\n\t--legend: #747b8b;\n\t--serp-preview: #bdc1c6;\n\t--serp-preview-title: #8ab4f8;\n\t--nested-bg: #1e2024;\n}\n\nhtml[data-color-scheme=\"dark\"] .color-scheme--light, .color-scheme--dark {\n\tdisplay: none;\n}\n\nhtml[data-color-scheme=\"dark\"] .color-scheme--dark, .color-scheme--light {\n\tdisplay: initial;\n}\n\n/* HTML */\nhtml {\n\tfont-size: 100%;\n\t-webkit-text-size-adjust: 100%;\n}\n\n/* General */\nheader, footer, nav, section, aside, main, article, figure, figcaption {\n\tdisplay: block;\n}\n\nbody, h1, h2, h3, h4, p, figure, blockquote, dl {\n\tmargin: 0;\n}\n\nimg {\n\tborder: 0;\n}\n\ntable {\n\tborder-spacing: 0;\n\tborder-collapse: collapse;\n\tempty-cells: show;\n}\n\nth, td {\n\ttext-align: left;\n}\n\ninput, select, label, img, a.tl_submit, .tl_select {\n\tvertical-align: middle;\n}\n\nbutton {\n\tcursor: pointer;\n}\n\nbutton[disabled] {\n\tcursor: default;\n}\n\nnav ul, nav li {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n\n/* Font */\nbody {\n\tfont-family: -apple-system, system-ui, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n\tfont-weight: 400;\n\tfont-size: .875rem;\n\tline-height: 1;\n\tcolor: var(--text);\n}\n\nh1, h2, h3, h4, h5, h6, strong, b, th {\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\tbody {\n\t\tfont-weight: 300;\n\t}\n\n\th1, h2, h3, h4, h5, h6, strong, b, th {\n\t\tfont-weight: 500;\n\t}\n}\n\npre, code, .tl_textarea.monospace {\n\tfont: 300 .75rem/1.25 SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tfont-size: 1rem;\n}\n\ninput, textarea, select, button {\n\tfont: inherit;\n\tcolor: inherit;\n\tline-height: inherit;\n}\n\ninput, select {\n\tline-height: 17px; /* see #501 and #79 */\n}\n\n@supports (display:-ms-grid) {\n\tinput, select {\n\t\tline-height: 1.1;\n\t}\n}\n\n.tl_gray {\n\tcolor: var(--gray);\n}\n\n.tl_green {\n\tcolor: var(--green);\n}\n\n.tl_red {\n\tcolor: var(--red);\n}\n\n.tl_blue {\n\tcolor: var(--blue);\n}\n\n.tl_orange {\n\tcolor: var(--orange);\n}\n\nspan.mandatory {\n\tcolor: var(--red);\n}\n\n.upper {\n\ttext-transform: uppercase;\n}\n\n/* Basic elements */\na {\n\tcolor: var(--text);\n\ttext-decoration: none;\n}\n\na:hover, a:active {\n\tcolor: var(--contao);\n}\n\nhr {\n\theight: 1px;\n\tmargin: 18px 0;\n\tborder: 0;\n\tbackground: var(--border);\n\tcolor: var(--border);\n}\n\np {\n\tmargin-bottom: 1em;\n\tpadding: 0;\n}\n\n.hidden {\n\tdisplay: none !important;\n}\n\n.unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\t-webkit-touch-callout: none;\n}\n\n/* Tables */\ntable.with-border th, table.with-border td {\n\tborder: solid var(--border);\n\tborder-width: 1px 0;\n}\n\ntable.with-border th {\n\tbackground-color: var(--table-header);\n}\n\ntable.with-padding th, table.with-padding td {\n\tpadding: 6px;\n}\n\ntable.with-zebra th {\n\tbackground-color: var(--table-nb-header);\n}\n\ntable.with-zebra tbody tr:nth-child(odd) td {\n\tbackground-color: var(--table-nb-odd);\n}\n\ntable.with-zebra tbody tr:nth-child(even) td {\n\tbackground-color: var(--table-nb-even);\n}\n\n/* Invisible elements */\n.clear {\n\tclear: both;\n\theight: 0.1px;\n\tline-height: 0.1px;\n\tfont-size: 0.1px;\n}\n\n.cf:before, .cf:after {\n\tcontent: \" \";\n\tdisplay: table;\n}\n\n.cf:after {\n\tclear: both;\n}\n\n.invisible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n\n/* Widgets */\n.widget {\n\tmargin-left: 15px;\n\tmargin-right: 15px;\n\tposition: relative;\n}\n\n.widget {\n\tfont-size: 0;\n}\n\n.widget * {\n\tfont-size: .875rem;\n}\n\n.widget > div {\n\tfont-size: 0;\n}\n\n.widget > div > * {\n\tfont-size: .875rem;\n}\n\n.widget pre, .widget code {\n\tfont-size: .7rem;\n}\n\n.widget h3 {\n\tmin-height: 16px;\n}\n\n.widget h3 img {\n\tmargin-right: 3px;\n}\n\n.widget legend {\n\tpadding: 0;\n}\n\n.widget legend img {\n\tvertical-align: -1px;\n}\n\n.widget-captcha {\n\tdisplay: initial !important;\n}\n\n.widget p.info {\n\tmargin: 2px 0;\n\tpadding: 7px;\n\tbackground: var(--panel-bg);\n\tline-height: 1.3;\n\tborder-radius: 3px;\n}\n\n.widget picture {\n\tdisplay: contents;\n}\n\n/* Forms */\noptgroup {\n\tpadding-top: 3px;\n\tpadding-bottom: 3px;\n\tfont-style: normal;\n\tbackground: var(--form-bg);\n}\n\nfieldset.tl_checkbox_container, fieldset.tl_radio_container {\n\tborder: 0;\n\tmargin: 15px 0 1px;\n\tpadding: 0;\n}\n\nfieldset.tl_checkbox_container {\n\tline-height: 15px;\n}\n\nfieldset.tl_radio_container {\n\tline-height: 16px;\n}\n\nfieldset.tl_checkbox_container legend, fieldset.tl_radio_container legend {\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\tfieldset.tl_checkbox_container legend, fieldset.tl_radio_container legend {\n\t\tfont-weight: 500;\n\t}\n}\n\nfieldset.tl_checkbox_container .check-all {\n\tcolor: var(--gray);\n}\n\nfieldset.tl_checkbox_container button {\n\tvertical-align: middle;\n}\n\nfieldset.checkbox_container, fieldset.radio_container {\n\tborder: 0;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n/* Text fields */\n.tl_text {\n\twidth: 100%;\n}\n\n.tl_text_2, .tl_text_interval {\n\twidth: 49%;\n}\n\n.tl_text_3 {\n\twidth: 32.333%;\n}\n\n.tl_text_4 {\n\twidth: 24%;\n}\n\n.tl_textarea {\n\twidth: 100%;\n}\n\n.tl_text_unit {\n\twidth: 79%;\n}\n\n.tl_text_trbl {\n\twidth: 19%;\n}\n\n.tl_text, .tl_text_2, .tl_text_3, .tl_text_4, .tl_textarea, .tl_text_unit, .tl_text_trbl, .tl_text_interval {\n\theight: 30px;\n\tmargin: 3px 0;\n\tbox-sizing: border-box;\n\tpadding: 5px 6px 6px;\n\tborder: 1px solid var(--form-border);\n\tborder-radius: 2px;\n\tbackground-color: var(--form-bg);\n\t-moz-appearance: none;\n\t-webkit-appearance: none;\n}\n\n.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] {\n\tcolor: var(--form-text-disabled);\n\tbackground-color: var(--form-bg-disabled);\n\tborder: 1px solid var(--form-border-disabled);\n\tcursor: not-allowed;\n}\n\n.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] {\n\tbackground-color: var(--form-bg-disabled);\n\tborder: 1px solid var(--form-border-disabled);\n}\n\n.tl_textarea {\n\theight: 240px;\n\tpadding: 4px 6px;\n\tline-height: 1.45;\n}\n\n.tl_text_2, .tl_text_3, .tl_text_4, .tl_text_unit, .tl_text_trbl, .tl_text_interval {\n\tmargin-right: 1%;\n}\n\n.tl_text_2:last-child, .tl_text_3:last-child, .tl_text_4:last-child, .tl_text_trbl:last-child {\n\tmargin-right: 0;\n}\n\n.tl_text_field .tl_text_2 {\n\twidth: 49.5%;\n}\n\n.tl_imageSize_0 {\n\tmargin-left: 1%;\n}\n\ninput[type=\"search\"] {\n\theight: 27px;\n\tpadding-top: 0;\n\tpadding-bottom: 1px;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button {\n\t-webkit-appearance: none;\n\theight: 14px;\n\twidth: 14px;\n\tmargin-right: 0;\n\tbackground-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzc3NyI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiLz48L3N2Zz4=\");\n}\n\n@-moz-document url-prefix() {\n\t.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 {\n\t\tline-height: 18px;\n\t}\n}\n\n@media not all and (min-resolution: .001dpcm) {\n\t@supports (-webkit-appearance:none) {\n\t\t.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 {\n\t\t\tline-height: 16px;\n\t\t}\n\n\t\tinput[type=\"search\"] {\n\t\t\tpadding-right: 0;\n\t\t}\n\n\t\tinput[type=\"search\"]::-webkit-search-cancel-button {\n\t\t\tmargin: 7px 4px 0 0;\n\t\t}\n\t}\n}\n\n@supports (display:-ms-grid) {\n\t.tl_text, .tl_text_2, .tl_text_3, .tl_text_4, .tl_textarea, .tl_text_unit, .tl_text_trbl, .tl_text_interval {\n\t\tpadding: 4px 6px 5px;\n\t}\n}\n\n/* Select menus */\nselect {\n\ttext-transform: none;\n\t-moz-appearance: none;\n\t-webkit-appearance: none;\n}\n\nselect::-ms-expand {\n\tdisplay: none;\n}\n\nselect[multiple] {\n\theight: auto;\n}\n\n.tl_select, .tl_mselect, .tl_select_column {\n\twidth: 100%;\n}\n\n.tl_select_unit {\n\twidth: 20%;\n}\n\n.tl_select_interval {\n\twidth: 50%;\n}\n\n.tl_select, .tl_mselect, .tl_select_column, .tl_select_unit, .tl_select_interval {\n\theight: 30px;\n\tmargin: 3px 0;\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--form-border);\n\tpadding: 5px 22px 6px 6px;\n\tborder-radius: 2px;\n\tbackground: var(--form-bg) url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDUwMCA1MDAiPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMzEuNTIzIiB5MT0iNDIuNjMiIHgyPSIzNjguNDc4IiB5Mj0iMjc5LjU4NCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjYjNiM2IzIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOTk5Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBmaWxsPSJ1cmwoI2EpIiBkPSJNMjUwIDM5Ni42NjZjLTEuMTU1IDAtNC4xMS0xLjgzMi03LjExMy02Ljc1bC0xNjkuNi0yNzcuNDU1Yy0yLjUxNy00LjExNC0zLjE5LTYuOTgtMy4yOC04LjMxNC44MjctLjMzIDIuNTY1LS44MTIgNS42MjctLjgxMmgzNDguNzMzYzMuMDYzIDAgNC43OTguNDgyIDUuNjI3LjgxMi0uMDkgMS4zMzQtLjc2NiA0LjItMy4yOCA4LjMxNWwtMTY5LjYgMjc3LjQ1N2MtMy4wMDUgNC45MTctNS45NiA2Ljc1LTcuMTE0IDYuNzV6Ii8+PC9zdmc+\") right -16px top 3px no-repeat;\n\tbackground-origin: content-box;\n\tcursor: pointer;\n}\n\n.tl_select[disabled], .tl_mselect[disabled], .tl_select_column[disabled], .tl_select_unit[disabled], .tl_select_interval[disabled],\n.tl_select[readonly], .tl_mselect[readonly], .tl_select_column[readonly], .tl_select_unit[readonly], .tl_select_interval[readonly] {\n\tcolor: var(--form-text-disabled);\n\tbackground-color: var(--form-bg-disabled);\n\tborder: 1px solid var(--form-border-disabled);\n\tcursor: not-allowed;\n}\n\n.tl_select[multiple], .tl_mselect[multiple], .tl_select_column[multiple], .tl_select_unit[multiple], .tl_select_interval[multiple] {\n\tbackground-image: none;\n}\n\n@supports (display:-ms-grid) {\n\t.tl_select, .tl_mselect, .tl_select_column, .tl_select_unit, .tl_select_interval {\n\t\tpadding: 5px 18px 5px 2px;\n\t}\n}\n\n/* Checkboxes */\n.tl_checkbox {\n\tmargin: 0 1px 0 0;\n}\n\n.tl_tree_checkbox {\n\tmargin: 1px 1px 1px 0;\n}\n\n.tl_checkbox_single_container {\n\theight: 16px;\n\tmargin: 14px 0 1px;\n}\n\n.tl_checkbox_single_container label {\n\tmargin-left: 4px;\n\tmargin-right: 3px;\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_checkbox_single_container label {\n\t\tfont-weight: 500;\n\t}\n}\n\n/* Grouped checkboxes */\n.checkbox_toggler {\n\tfont-weight: 600;\n}\n\n.checkbox_toggler_first {\n\tmargin-top: 3px;\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.checkbox_toggler, .checkbox_toggler_first {\n\t\tfont-weight: 500;\n\t}\n}\n\n.checkbox_toggler img, .checkbox_toggler_first img {\n\tposition: relative;\n\ttop: -1px;\n\tmargin-right: 2px;\n}\n\n.checkbox_options {\n\tmargin: 0 0 6px 21px !important;\n}\n\n.tl_checkbox_container .checkbox_options:last-of-type {\n\tmargin-bottom: 0 !important;\n}\n\n/* Radio buttons */\n.tl_radio {\n\tmargin: 0 1px 0 0;\n}\n\n.tl_tree_radio {\n\tmargin: 1px 1px 1px 0;\n}\n\n/* Radio table */\n.tl_radio_table {\n\tmargin-top: 3px;\n}\n\n.tl_radio_table td {\n\tpadding: 0 24px 0 0;\n}\n\n/* Upload fields */\n.tl_upload_field {\n\tmargin: 1px 0;\n}\n\n/* Submit buttons */\n.tl_submit {\n\theight: 30px;\n\tpadding: 7px 12px;\n\tborder: 1px solid var(--form-border);\n\tborder-radius: 2px;\n\tbox-sizing: border-box;\n\tcursor: pointer;\n\tbackground: var(--form-button);\n\ttransition: background .2s ease;\n}\n\n.tl_submit:hover {\n\tcolor: inherit;\n\tbackground-color: var(--form-button-hover);\n}\n\n.tl_submit:active {\n\tcolor: var(--form-button-active);\n}\n\n.tl_submit:disabled {\n\tcolor: var(--gray);\n\tbackground: var(--form-button-disabled) !important;\n\tcursor: not-allowed;\n}\n\n.tl_panel .tl_submit, .tl_version_panel .tl_submit, .tl_formbody_submit .tl_submit {\n\tbackground: var(--form-bg);\n}\n\n.tl_panel .tl_submit:hover, .tl_version_panel .tl_submit:hover, .tl_formbody_submit .tl_submit:hover {\n\tbackground: var(--form-bg-hover);\n}\n\na.tl_submit {\n\tdisplay: inline-block;\n}\n\n/* Split buttons */\n.split-button {\n\tdisplay: inline-block;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.split-button ul, .split-button li {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n/* Placeholders */\n::-moz-placeholder {\n\tpadding-top: 1px;\n}\n\n::-webkit-input-placeholder {\n\tpadding-top: 1px;\n}\n\n/* Floats */\n.clr {\n\tclear: both;\n\twidth: calc(100% - 30px);\n}\n\n.clr:not(.widget) {\n\twidth: 100%;\n}\n\n.clr:before {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.w25, .w33, .w50, .w66, .w75 {\n\twidth: calc(50% - 30px);\n\tfloat: left;\n\tmin-height: 80px;\n}\n\n.nogrid .w25, .nogrid .w33, .nogrid .w50, .nogrid .w66, .nogrid .w75 {\n\tfloat: none;\n}\n\n.long {\n\twidth: calc(100% - 30px); /* see #6320 */\n}\n\n.wizard > a {\n\tposition: relative;\n\ttop: -2px;\n\tvertical-align: middle;\n}\n\n.wizard > .image-button {\n\tpadding: 0;\n\tborder: 0;\n\tbackground: none;\n\tvertical-align: middle;\n}\n\n.wizard .tl_text, .wizard .tl_select, .wizard .tl_image_size {\n\twidth: calc(100% - 24px);\n}\n\n.wizard .tl_text_2 {\n\twidth: 45%;\n}\n\n.wizard .tl_image_size {\n\tdisplay: inline-block;\n}\n\n.wizard img {\n\tmargin-left: 4px;\n}\n\n.wizard h3 img {\n\tmargin-left: 0;\n}\n\n.long .tl_text, .long .tl_select {\n\twidth: 100%;\n}\n\n.m12 {\n\tmargin: 0 15px;\n\tpadding: 18px 0 16px;\n}\n\n.nogrid .m12 {\n\tpadding: 0;\n}\n\n.cbx {\n\tmin-height: 46px;\n}\n\n.cbx.m12 {\n\tmin-height: 80px;\n\tbox-sizing: border-box;\n}\n\n.nogrid .cbx {\n\tmin-height: 32px;\n}\n\n.subpal {\n\tclear: both;\n}\n\n.inline div {\n\tdisplay: inline;\n}\n\n.autoheight {\n\theight: auto;\n}\n\n/* Tips */\n.tl_tip {\n\theight: 15px;\n\toverflow: hidden;\n\tcursor: help;\n}\n\n.tip {\n\tposition: relative;\n\tmax-width: 320px;\n\tpadding: 6px 9px;\n\tborder-radius: 2px;\n\tbackground: var(--invert-bg);\n\tz-index: 99;\n}\n\n.tip div {\n\tline-height: 1.3;\n}\n\n.tip div, .tip a, .tip span {\n\tcolor: var(--invert-text);\n}\n\n.tip:before {\n\tcontent: \"\";\n\theight: 6px;\n\tposition: absolute;\n\ttop: -13px;\n\tleft: 9px;\n\tborder-left: 7px solid transparent;\n\tborder-right: 7px solid transparent;\n\tborder-bottom: 7px solid var(--invert-bg);\n}\n\n.tip--rtl:before {\n\tleft: auto;\n\tright: 9px;\n}\n\n/* Row highlighting */\n.hover-div:hover, .hover-row:hover td, .hover-div:hover .limit_toggler, .hover-row:hover .limit_toggler {\n\tbackground-color: var(--hover-row) !important;\n}\n\n/* Badge */\n.badge-title {\n\tfloat: right;\n\tmargin-left: 8px;\n\tmargin-top: -8px;\n\tborder-radius: 8px;\n\tpadding: 2px 5px;\n\tbackground: var(--invert-bg);\n\tcolor: var(--invert-text);\n\tfont-size: .75rem;\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.badge-title {\n\t\tfont-weight: 500;\n\t}\n}\n\n/* Large screens */\n@media (min-width: 1280px) {\n\t.w25 {\n\t\twidth: calc(25% - 30px);\n\t}\n\n\t.w33 {\n\t\twidth: calc(33.3333% - 30px);\n\t}\n\n\t.w66 {\n\t\twidth: calc(66.6666% - 30px);\n\t}\n\n\t.w75 {\n\t\twidth: calc(75% - 30px);\n\t}\n\n\t#sbtog {\n\t\tdisplay: none;\n\t}\n\n\t.split-button ul {\n\t\tdisplay: inline-flex;\n\t\tclip: initial;\n\t\theight: auto;\n\t\tmargin: 0 0 0 -4px;\n\t\toverflow: initial;\n\t\tposition: initial;\n\t\twidth: auto;\n\t}\n\n\t.split-button li {\n\t\tmargin-left: 4px;\n\t}\n}\n\n/* Split button */\n@media (max-width: 1279px) {\n\t.split-button {\n\t\tdisplay: inline-flex;\n\t}\n\n\t.split-button ul {\n\t\tposition: absolute;\n\t\tright: 0;\n\t\tbottom: 20px;\n\t\tmin-width: 100%;\n\t\tbackground: var(--form-bg);\n\t\tborder: 1px solid var(--form-border);\n\t\tborder-radius: 2px;\n\t\tbox-sizing: border-box;\n\t\tpadding: 3px 0;\n\t\tmargin-bottom: 1em;\n\t}\n\n\t.split-button ul button {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t\ttext-align: left;\n\t\twhite-space: nowrap;\n\t}\n\n\t.split-button ul .tl_submit {\n\t\tmargin-top: 0;\n\t\tmargin-bottom: 0;\n\t\tbackground: var(--form-bg);\n\t}\n\n\t.split-button ul .tl_submit:hover {\n\t\tbackground: var(--form-button-hover);\n\t}\n\n\t.split-button ul:before {\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 0;\n\t\twidth: 0;\n\t\tposition: absolute;\n\t\tright: 4px;\n\t\tbottom: -12px;\n\t\tz-index: 89;\n\t\tborder: 6px inset transparent;\n\t\tborder-top: 6px solid var(--form-bg);\n\t}\n\n\t.split-button ul:after {\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 0;\n\t\twidth: 0;\n\t\tposition: absolute;\n\t\tright: 3px;\n\t\tbottom: -14px;\n\t\tz-index: 88;\n\t\tborder: 7px inset transparent;\n\t\tborder-top: 7px solid var(--form-border);\n\t}\n\n\t.split-button > button[type=\"submit\"] {\n\t\tposition: relative;\n\t\tborder-radius: 2px 0 0 2px;\n\t}\n\n\t.split-button > button[type=\"button\"] {\n\t\theight: 30px;\n\t\tmargin: 2px 0;\n\t\tpadding: 7px 4px;\n\t\tbackground: var(--form-bg);\n\t\tborder: 1px solid var(--form-border);\n\t\tborder-left: 0;\n\t\tborder-radius: 0 2px 2px 0;\n\t\tbox-sizing: border-box;\n\t\ttransition: background .2s ease;\n\t}\n\n\t.split-button > button[type=\"button\"].active, .split-button > button[type=\"button\"]:hover {\n\t\tbackground: var(--form-button-hover);\n\t}\n\n\t.split-button > button[type=\"button\"]:focus {\n\t\toutline: none;\n\t}\n}\n\n/* Handheld */\n@media (max-width: 767px) {\n\t.w25, .w33, .w50, .w66, .w75 {\n\t\tfloat: none;\n\t\twidth: calc(100% - 30px);\n\t}\n\n\t.m12 {\n\t\tpadding-top: 0;\n\t\tpadding-bottom: 0;\n\t}\n\n\t.cbx, .cbx.m12 {\n\t\tmin-height: auto;\n\t}\n\n\t.tip {\n\t\tmax-width: 80vw;\n\t}\n\n\t.tl_checkbox_container .tl_checkbox {\n\t\tmargin-top: 1px;\n\t\tmargin-bottom: 1px;\n\t}\n}\n","@import 'fonts.css';\n@import 'basic.css';\n\n/* Icons */\n:root {\n\t--icon-logo: url(\"icons/logo.svg\");\n\t--icon-profile: url(\"icons/profile_small.svg\");\n\t--icon-security: url(\"icons/shield_small.svg\");\n\t--icon-favorites: url(\"icons/favorites_small.svg\");\n\t--icon-logout: url(\"icons/exit.svg\");\n\t--icon-toggle-all: url(\"icons/chevron-right.svg\");\n\t--icon-alert: url(\"icons/alert.svg\");\n\t--icon-favorite: url(\"icons/favorite.svg\");\n\t--icon-favorite--active: url(\"icons/favorite_active.svg\");\n\t--icon-manual: url(\"icons/manual.svg\");\n\t--icon-color-scheme: url(\"icons/color_scheme.svg\");\n\t--icon-arrow-left: url(\"icons/arrow_left.svg\");\n\t--icon-arrow-right: url(\"icons/arrow_right.svg\");\n\t--icon-visible: url(\"icons/visible.svg\");\n\t--icon-invisible: url(\"icons/invisible.svg\");\n\t--icon-loading: url(\"icons/loading.svg\");\n}\n\nhtml[data-color-scheme=\"dark\"] {\n\t--icon-logo: url(\"icons/logo--dark.svg\");\n\t--icon-profile: url(\"icons/profile_small--dark.svg\");\n\t--icon-security: url(\"icons/shield_small--dark.svg\");\n\t--icon-favorites: url(\"icons/favorites_small--dark.svg\");\n\t--icon-logout: url(\"icons/exit--dark.svg\");\n\t--icon-toggle-all: url(\"icons/chevron-right--dark.svg\");\n\t--icon-alert: url(\"icons/alert--dark.svg\");\n\t--icon-favorite: url(\"icons/favorite--dark.svg\");\n\t--icon-favorite--active: url(\"icons/favorite_active--dark.svg\");\n\t--icon-manual: url(\"icons/manual--dark.svg\");\n\t--icon-color-scheme: url(\"icons/color_scheme--dark.svg\");\n\t--icon-arrow-left: url(\"icons/arrow_left--dark.svg\");\n\t--icon-arrow-right: url(\"icons/arrow_right--dark.svg\");\n\t--icon-visible: url(\"icons/visible--dark.svg\");\n\t--icon-invisible: url(\"icons/invisible--dark.svg\");\n\t--icon-loading: url(\"icons/loading--dark.svg\");\n}\n\n/* Account for the jump links bar */\nhtml {\n\tscroll-padding-top: 36px;\n\tscroll-behavior: smooth;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n\thtml {\n\t\tscroll-behavior: auto;\n\t}\n}\n\n/* Body */\nbody {\n\tbackground: var(--body-bg);\n\toverflow-y: scroll;\n}\n\nbody.popup {\n\tbackground: var(--content-bg);\n}\n\n/* Header */\n#header {\n\tmin-height: 40px;\n\ttext-align: left;\n\tbackground: var(--header-bg);\n}\n\n#header h1 {\n\tposition: absolute;\n}\n\n#header h1 a {\n\tdisplay: block;\n\theight: 16px;\n\tpadding: 12px 12px 12px 42px;\n\tbackground: var(--icon-logo) no-repeat 10px center;\n\tfont-weight: 400;\n}\n\n#header h1 a .app-title {\n\tfont-size: 17px;\n\tcolor: var(--header-text);\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#header h1 a {\n\t\tfont-weight: 300;\n\t}\n}\n\n#tmenu {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n#tmenu li {\n\tposition: relative;\n}\n\n#tmenu a, #tmenu .profile button {\n\tmargin: 0;\n\tpadding: 13px 12px;\n\tdisplay: inline-block;\n}\n\n#tmenu sup {\n\tposition: absolute;\n\ttop: 5px;\n\tleft: 20px;\n\tfont-size: .6rem;\n\tcolor: var(--header-bg);\n\tbackground: var(--header-text);\n\tpadding: 2px;\n\tborder-radius: 2px;\n\ttext-indent: 0;\n\tfont-weight: 400;\n}\n\n#tmenu .burger {\n\tdisplay: none;\n}\n\n#tmenu .burger button {\n\tpadding: 8px 10px 9px;\n\tbackground: none;\n\tborder: 0;\n}\n\n#tmenu .burger svg {\n\tmargin-bottom: -1px;\n\tvertical-align: middle;\n}\n\n#tmenu .profile button {\n\tposition: relative;\n\tcursor: pointer;\n\tfont-size: .875rem;\n\tfont-weight: 400;\n\tborder: none;\n\tpadding-right: 26px;\n\tbackground: url(\"icons/chevron-down.svg\") right 9px top 14px no-repeat;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#tmenu .profile button {\n\t\tfont-weight: 300;\n\t}\n}\n\n#tmenu a, #tmenu .profile button, #tmenu .burger button {\n\tcolor: var(--header-text);\n\ttransition: background-color .3s ease;\n}\n\n#tmenu a:hover, #tmenu a.hover, #tmenu li:hover .profile button, #tmenu .active .profile button, #tmenu .burger button:hover {\n\tbackground-color: var(--header-bg-hover);\n}\n\n#tmenu ul.menu_level_1 {\n\tmin-width: 150px;\n\tposition: absolute;\n\tright: 6px;\n\tmargin-top: 5px;\n\tbackground: var(--content-bg);\n\tborder: 1px solid var(--content-border);\n\tbox-shadow: 0 1px 6px rgba(0,0,0,.2);\n\tz-index: 4; /* Above .jump-targets */\n\tcolor: var(--text);\n\ttext-align: left;\n\topacity: 0;\n\tvisibility: hidden;\n\ttransition: opacity .3s ease, visibility .3s ease;\n}\n\n#tmenu .active ul.menu_level_1 {\n\topacity: 1;\n\tvisibility: visible;\n}\n\n#tmenu ul.menu_level_1 li a {\n\tdisplay: block;\n\tcolor: inherit;\n\tpadding: 6px 20px 6px 40px;\n\twhite-space: nowrap;\n}\n\n#tmenu ul.menu_level_1 li a:hover {\n\tbackground-color: var(--nav-hover-bg);\n}\n\n#tmenu ul.menu_level_1 .info {\n\tcolor: var(--info);\n\tpadding: 15px 20px;\n\tborder-bottom: 1px solid var(--border);\n\tline-height: 1.4;\n\tmargin-bottom: 9px;\n\twhite-space: nowrap;\n}\n\n#tmenu ul.menu_level_1 strong {\n\tcolor: var(--text);\n\tdisplay: block;\n}\n\n#tmenu ul.menu_level_1:before {\n\tcontent: \"\";\n\tdisplay: block;\n\twidth: 0;\n\theight: 0;\n\tposition: absolute;\n\tright: 9px;\n\ttop: -14px;\n\tborder: 7px solid transparent;\n\tborder-bottom-color: var(--content-bg);\n}\n\n#tmenu ul.menu_level_1:after {\n\tcontent: \"\";\n\tdisplay: block;\n\twidth: 9px;\n\theight: 9px;\n\tposition: absolute;\n\ttop: -6px;\n\tright: 11px;\n\tborder-top: 1px solid var(--content-border);\n\tborder-right: 1px solid var(--content-border);\n\ttransform: rotateZ(-45deg);\n}\n\n#tmenu ul.menu_level_1 .logout {\n\tmargin-top: 9px;\n\tpadding: 6px 0;\n\tborder-top: 1px solid var(--border);\n}\n\n#tmenu .icon-alert, #tmenu .icon-favorite, #tmenu .icon-manual, #tmenu .icon-color-scheme {\n\twidth: 16px;\n\tmargin-bottom: -2px;\n\tposition: relative;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-indent: 28px; /* 16px width + 12px padding */\n}\n\n#tmenu .icon-alert {\n\tbackground: var(--icon-alert) center center no-repeat;\n}\n\n#tmenu .icon-favorite {\n\tbackground: var(--icon-favorite) center center no-repeat;\n}\n\n#tmenu .icon-favorite--active {\n\tbackground: var(--icon-favorite--active) center center no-repeat;\n}\n\n#tmenu .icon-manual {\n\tbackground: var(--icon-manual) center center no-repeat;\n}\n\n#tmenu .icon-color-scheme {\n\tbackground: var(--icon-color-scheme) center center no-repeat;\n}\n\n#tmenu .icon-profile {\n\tbackground: var(--icon-profile) 20px center no-repeat;\n}\n\n#tmenu .icon-security {\n\tbackground: var(--icon-security) 20px center no-repeat;\n}\n\n#tmenu .icon-favorites {\n\tbackground: var(--icon-favorites) 20px center no-repeat;\n}\n\n#tmenu .icon-logout {\n\tbackground: var(--icon-logout) 20px center no-repeat;\n}\n\n/* Container */\n#container {\n\tdisplay: flex;\n\tmin-height: calc(100vh - 40px);\n}\n\n.popup #container {\n\tpadding: 0;\n\twidth: auto;\n\tmin-height: 0;\n\tmax-width: none;\n}\n\n/* Left */\n#left {\n\twidth: 220px;\n\tbackground: var(--nav-bg);\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n#left .version {\n\tmargin-top: 4em;\n\tpadding: 15px 18px;\n\tfont-size: .75rem;\n\tline-height: 1.4;\n}\n\n#left .version, #left .version a {\n\tcolor: var(--nav-group);\n}\n\n/* Main */\n#main {\n\twidth: calc(100% - 220px);\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.popup #main {\n\tfloat: none;\n\twidth: auto;\n\tmax-width: none;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tdisplay: initial;\n}\n\n#main .content {\n\tmargin: 0 15px 15px;\n}\n\n#main .content {\n\tbackground: var(--content-bg);\n\tborder: 1px solid var(--content-border);\n}\n\n.popup #main .content {\n\tmargin: 0;\n\tborder: 0;\n}\n\n/* Navigation */\n#tl_navigation {\n\tflex-grow: 1;\n}\n\n#tl_navigation .menu_level_0 {\n\tpadding-top: 20px;\n}\n\n#tl_navigation .menu_level_0 > li:after {\n\tcontent: \"\";\n\twidth: calc(100% - 30px);\n\theight: 1px;\n\tdisplay: block;\n\tmargin: 15px auto;\n\tbackground: var(--nav-separator);\n}\n\n#tl_navigation .menu_level_0 > li.last:after {\n\tdisplay: none;\n}\n\n#tl_navigation .menu_level_0 a[class^=\"group-\"] {\n\tdisplay: block;\n\tmargin: 0 15px;\n\tpadding: 3px 3px 3px 22px;\n\tcolor: var(--nav-group);\n\tfont-size: .75rem;\n\ttext-transform: uppercase;\n\tfont-weight: 500;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#tl_navigation .menu_level_0 a[class^=\"group-\"] {\n\t\tfont-weight: 400;\n\t}\n}\n\n#tl_navigation .group-favorites {\n\tbackground: url(\"icons/favorites_group.svg\") 3px 2px no-repeat;\n}\n\n#tl_navigation .group-content {\n\tbackground: url(\"icons/content.svg\") 3px 2px no-repeat;\n}\n\n#tl_navigation .group-design {\n\tbackground: url(\"icons/monitor.svg\") 3px 2px no-repeat;\n}\n\n#tl_navigation .group-accounts {\n\tbackground: url(\"icons/person.svg\") 3px 2px no-repeat;\n}\n\n#tl_navigation .group-system {\n\tbackground: url(\"icons/wrench.svg\") 3px 2px no-repeat;\n}\n\n#tl_navigation .menu_level_1 {\n\tpadding-top: 5px;\n}\n\n#tl_navigation [class^=\"menu_level_\"] a {\n\tdisplay: block;\n\tpadding: 5px 33px 5px 37px;\n\tfont-weight: 400;\n\tcolor: var(--nav);\n\ttransition: color .2s ease;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#tl_navigation [class^=\"menu_level_\"] a {\n\t\tfont-weight: 300;\n\t}\n}\n\n#tl_navigation [class^=\"menu_level_\"] > li.current > a {\n\tbackground-color: var(--nav-current);\n\tborder-left: 4px solid var(--contao);\n}\n\n#tl_navigation .menu_level_1 > li.current > a {\n\tpadding-left: 33px;\n}\n\n#tl_navigation .menu_level_2 a {\n\tpadding-left: 49px;\n}\n\n#tl_navigation .menu_level_2 > li.current > a {\n\tpadding-left: 45px;\n}\n\n#tl_navigation .menu_level_3 a {\n\tpadding-left: 61px;\n}\n\n#tl_navigation .menu_level_3 > li.current > a {\n\tpadding-left: 57px;\n}\n\n#tl_navigation .menu_level_4 a {\n\tpadding-left: 73px;\n}\n\n#tl_navigation .menu_level_4 > li.current > a {\n\tpadding-left: 69px;\n}\n\n#tl_navigation .menu_level_5 a {\n\tpadding-left: 85px;\n}\n\n#tl_navigation .menu_level_5 > li.current > a {\n\tpadding-left: 81px;\n}\n\n#tl_navigation .menu_level_2 a {\n\tfont-size: .75rem;\n}\n\n#tl_navigation .menu_level_1 li.has-children:not(.first) {\n\tpadding-top: 5px;\n}\n\n#tl_navigation .menu_level_1 li.has-children:not(.last) {\n\tpadding-bottom: 5px;\n}\n\n#tl_navigation .menu_level_1 a:hover, #tl_navigation .menu_level_1 li.current > a {\n\tcolor: var(--nav-hover);\n\tbackground-color: var(--nav-current);\n}\n\n#tl_navigation .collapsed .menu_level_1 {\n\tdisplay: none;\n}\n\n/* Buttons */\n#tl_buttons {\n\tmargin: 0;\n\tpadding: 9px 15px;\n\ttext-align: right;\n}\n\n.toggleWrap {\n\tcursor: pointer;\n}\n\n.opacity {\n\t-moz-opacity: .8;\n\topacity: .8;\n}\n\n/* Data container */\n#main_headline {\n\tmargin: 18px 16px;\n\tfont-size: 1.1rem;\n\tdisplay: flex;\n}\n\n.popup #main_headline {\n\tdisplay: none;\n}\n\n#main_headline span {\n\tdisplay: inline-block;\n\tmax-width: max-content;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tline-height: 22px;\n\tflex: 1 0 0;\n}\n\n#main_headline span:nth-child(even) {\n\tfont-weight: 400;\n}\n\n#main_headline span + span::before {\n\tcontent: \"\\A0› \"; /* Non-breaking-space to prevent collapsing whitespace */\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#main_headline span:nth-child(even) {\n\t\tfont-weight: 300;\n\t}\n\n\t#main_headline span + span::before {\n\t\tfont-weight: 500;\n\t}\n}\n\nh2.sub_headline {\n\tmargin: 3px 18px;\n\tpadding: 7px 0;\n}\n\n.label-info {\n\tcolor: var(--gray);\n\tpadding-left: 3px;\n}\n\n.label-date {\n\tcolor: var(--gray);\n\tpadding-right: 3px;\n}\n\n.tl_gerror {\n\tmargin: 12px;\n\tpadding: 3px 0 3px 22px;\n\tbackground: url(\"icons/error.svg\") no-repeat left center;\n}\n\n.tl_error, .tl_confirm, .tl_info, .tl_new {\n\tmargin: 0 0 1px;\n\tpadding: 11px 18px 11px 32px;\n\tline-height: 1.3;\n}\n\n.tl_error {\n\tbackground: var(--error-bg) url(\"icons/error.svg\") no-repeat 11px 12px;\n}\n\n.tl_confirm {\n\tbackground: var(--confirm-bg) url(\"icons/ok.svg\") no-repeat 11px 12px;\n}\n\n.tl_info {\n\tbackground: var(--info-bg) url(\"icons/show.svg\") no-repeat 11px 12px;\n}\n\n.tl_new {\n\tbackground: var(--new-bg) url(\"icons/featured.svg\") no-repeat 11px 12px;\n}\n\n.tl_gerror, .tl_gerror a, .tl_error, .tl_error a {\n\tcolor: var(--red);\n}\n\n.tl_gerror a, .tl_error a {\n\ttext-decoration: underline;\n}\n\n.tl_confirm, .tl_confirm a {\n\tcolor: var(--green);\n}\n\n.tl_info, .tl_info a {\n\tcolor: var(--blue);\n}\n\n.tl_new, .tl_new a {\n\tcolor: var(--orange);\n}\n\n.widget .tl_error, .widget .tl_confirm, .widget .tl_info, .widget .tl_new {\n\tpadding: 8px 10px 8px 30px;\n\tbackground-position: 9px 9px;\n}\n\n.tl_error strong, .tl_confirm strong, .tl_info strong, .tl_new strong {\n\tcolor: inherit;\n}\n\n/* Filter */\n.tl_panel, .tl_version_panel {\n\tpadding: 4px 12px;\n\tbackground: var(--panel-bg);\n\tborder-bottom: 1px solid var(--content-border);\n\ttext-align: right;\n}\n\n.tl_version_panel {\n\tpadding: 8px 12px;\n}\n\n.tl_panel .tl_select {\n\ttext-align: left;\n}\n\n.tl_version_panel .tl_select {\n\tmax-width: 280px;\n}\n\n.tl_version_panel .tl_submit {\n\tvertical-align: middle;\n}\n\n.tl_version_panel .tl_formbody {\n\tposition: relative;\n}\n\n.tl_img_submit {\n\twidth: 16px;\n\theight: 16px;\n\tborder: 0;\n\tmargin: 0;\n\tpadding: 0;\n\ttext-indent: 16px; /* 16px width */\n\twhite-space: nowrap;\n\toverflow: hidden;\n\tposition: relative;\n\ttop: 9px;\n\tcursor: pointer;\n}\n\n.filter_apply {\n\tbackground: url(\"icons/filter-apply.svg\") center center no-repeat;\n}\n\n.filter_reset {\n\tbackground: url(\"icons/filter-reset.svg\") center center no-repeat;\n}\n\n.tl_subpanel {\n\tfloat: right;\n\tletter-spacing: -.31em;\n}\n\n.tl_subpanel * {\n\tletter-spacing: normal;\n}\n\n.tl_subpanel strong, .tl_search span {\n\tvertical-align: middle;\n}\n\n.tl_submit_panel {\n\tmin-width: 32px;\n\tpadding-left: 6px;\n\tpadding-right: 3px;\n}\n\n.tl_panel .active, .tl_panel_bottom .active, #search .active {\n\tbackground-color: var(--active-bg);\n}\n\n.tl_filter {\n\twidth: 100%;\n}\n\n.tl_filter .tl_select {\n\tmax-width: 14.65%;\n\tmargin-left: 3px;\n}\n\n.tl_submit_panel + .tl_filter {\n\twidth: 86%;\n}\n\n.tl_limit {\n\twidth: 22%;\n}\n\n.tl_limit .tl_select {\n\twidth: 52%;\n\tmargin-left: 3px;\n}\n\n.tl_search {\n\twidth: 40%;\n}\n\n.tl_search .tl_select {\n\twidth: 38%;\n\tmargin-left: 3px;\n\tmargin-right: 1%;\n}\n\n.tl_search .tl_text {\n\twidth: 30%;\n\tmargin-left: 1%;\n\t-webkit-appearance: textfield;\n\tbox-sizing: content-box;\n}\n\n.tl_sorting {\n\twidth: 26%;\n}\n\n.tl_sorting .tl_select {\n\twidth: 60%;\n\tmargin-left: 1%;\n}\n\n/* Jump targets */\n.jump-targets {\n\tmin-height: 30px;\n\tpadding-top: 1px;\n\tbackground: var(--panel-bg);\n\tborder-bottom: 1px solid var(--content-border);\n\tposition: sticky;\n\ttop: 0;\n\tz-index: 3; /* Above TinyMCE */\n}\n\n.jump-targets .inner {\n\toverflow-x: scroll;\n\tscrollbar-width: none;\n}\n\n.jump-targets .inner::-webkit-scrollbar {\n\tdisplay: none;\n}\n\n.jump-targets ul {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n\twhite-space: nowrap;\n}\n\n.jump-targets li {\n\tdisplay: inline-block;\n\tpadding: 9px 10px;\n\twhite-space: nowrap;\n\tfont-size: .75rem;\n}\n\n.jump-targets button {\n\tpadding: 0;\n\tbackground: none;\n\tborder: none;\n}\n\n.jump-targets:before, .jump-targets:after {\n\tcontent: \"\";\n\tdisplay: block;\n\twidth: 10px;\n\theight: 100%;\n\tposition: absolute;\n\ttop: 0;\n}\n\n.jump-targets:before {\n\tbackground: linear-gradient(-90deg, transparent 0, var(--panel-bg) 50%);\n}\n\n.jump-targets:after {\n\tright: 0;\n\tbackground: linear-gradient(90deg, transparent 0, var(--panel-bg) 50%);\n}\n\n/* Boxes */\n.tl_xpl {\n\tpadding: 0 18px;\n}\n\n.tl_tbox, .tl_box {\n\tpadding: 12px 0 25px;\n\tborder-bottom: 1px solid var(--border);\n}\n\n.tl_tbox:last-child, .tl_box:last-child {\n\tborder-bottom: 0;\n}\n\n.tl_box h3, .tl_tbox h3, .tl_xpl h3 {\n\tmargin: 0;\n\tpadding-top: 13px;\n\theight: 16px;\n\tfont-size: .875rem;\n}\n\n.tl_box h4, .tl_tbox h4 {\n\tmargin: 6px 0 0;\n\tpadding: 0;\n\tfont-size: .875rem;\n}\n\n.tl_tbox.theme_import {\n\tpadding-left: 15px;\n\tpadding-right: 15px;\n}\n\n.tl_tbox.theme_import h3, .tl_tbox.theme_import h4, .tl_tbox.theme_import p {\n\tline-height: 1.3;\n}\n\n.tl_help, .tl_help * {\n\tfont-size: .75rem;\n}\n\n.tl_help, .tl_help a {\n\tmargin-bottom: 0;\n\tline-height: 1.2;\n\tcolor: var(--info);\n}\n\n.tl_help a:hover, .tl_help a:focus, .tl_help a:active {\n\ttext-decoration: underline;\n}\n\n#tl_buttons + .tl_edit_form .tl_formbody_edit {\n\tborder-top: 1px solid var(--border);\n}\n\n.tl_formbody_submit {\n\tborder-top: 1px solid var(--content-border);\n\tposition: sticky;\n\tbottom: 0;\n\tz-index: 3; /* Above TinyMCE */\n}\n\n.tl_submit_container {\n\tpadding: 8px 12px;\n\tbackground: var(--panel-bg);\n}\n\n.tl_submit_container .tl_submit {\n\tmargin: 2px 0;\n}\n\n/* Maintenance */\n.maintenance_active {\n\tpadding-top: 12px;\n}\n\n.maintenance_active, .maintenance_inactive {\n\tborder-top: 1px solid var(--border);\n}\n\n.maintenance_inactive .tl_tbox {\n\tborder: 0 !important;\n\tpadding: 6px 15px 14px;\n}\n\n.maintenance_inactive .tl_message {\n\tmargin: 0 15px 3px;\n}\n\n.maintenance_inactive h2.sub_headline {\n\tmargin: 16px 15px 3px;\n}\n\n.maintenance_inactive .tl_submit_container {\n\tbackground: none;\n\tpadding: 0 15px 24px;\n\tborder: 0;\n}\n\n/* Crawler */\n@keyframes crawl-progress-bar-stripes {\n\t0% {\n\t\tbackground-position-x: 1rem;\n\t}\n}\n\n#tl_crawl .tl_message {\n\tmargin-bottom: 24px;\n}\n\n#tl_crawl .tl_message > p {\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\tbackground-color: transparent;\n\tbackground-position-y: center;\n}\n\n#tl_crawl .tl_tbox {\n\tmargin-top: 0;\n\tpadding-top: 0;\n\tpadding-right: 0;\n\tpadding-left: 0;\n}\n\n#tl_crawl .tl_checkbox_container {\n\tmargin-top: 6px;\n}\n\n#tl_crawl .inner {\n\tposition: relative;\n\tmargin: 0 18px 18px;\n}\n\n#tl_crawl .progress {\n\tdisplay: flex;\n\theight: 20px;\n\tbackground-color: var(--tree-header);\n\tborder-radius: 2px;\n}\n\n#tl_crawl .progress-bar {\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\tcolor: white;\n\ttext-align: center;\n\twhite-space: nowrap;\n\tbackground-size: 10px 10px;\n}\n\n#tl_crawl .progress-bar.running {\n\tbackground-color: var(--progress-running);\n\tbackground-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);\n\tanimation: crawl-progress-bar-stripes 1s linear infinite;\n}\n\n#tl_crawl .progress-bar.finished {\n\tbackground-color: var(--progress-finished);\n}\n\n#tl_crawl .progress-count {\n\tmargin: 6px 0 24px;\n}\n\n#tl_crawl .results h3 {\n\tfont-size: .9rem;\n\tmargin: 18px 0 9px;\n}\n\n#tl_crawl .results p {\n\tmargin-bottom: 6px;\n}\n\n#tl_crawl .crawl-hint {\n\tmargin-top: -2px;\n\tline-height: 1.3;\n}\n\n#tl_crawl .crawl-hint a {\n\ttext-decoration: underline;\n}\n\n#tl_crawl .subscriber-log {\n\tdisplay: none;\n\tpadding: 5px 0;\n\tmargin-bottom: 0;\n}\n\n#tl_crawl .wait {\n\tmargin-top: 9px;\n\tcolor: var(--gray);\n}\n\n#tl_crawl .debug-log {\n\tdisplay: none;\n\tmargin-top: 11px;\n}\n\n#tl_crawl .results.running .show-when-finished, #tl_crawl .results.finished .show-when-running {\n\tdisplay: none;\n}\n\n#tl_crawl .results.running .show-when-running, #tl_crawl .results.finished .show-when-finished {\n\tdisplay: block;\n}\n\n#tl_crawl .result .summary.success {\n\tcolor: var(--green);\n}\n\n#tl_crawl .result .summary.failure {\n\tcolor: var(--red);\n}\n\n#tl_crawl .result .warning {\n\tdisplay: none;\n\tcolor: var(--blue);\n}\n\n/* Two-factor */\n.two-factor {\n\tborder-top: 1px solid var(--border);\n\tpadding-bottom: 9px;\n}\n\n.two-factor h2.sub_headline {\n\tmargin: 18px 15px 3px;\n}\n\n.two-factor > p {\n\tmargin: 0 15px 12px;\n\tline-height: 1.3;\n}\n\n.two-factor li {\n\tmargin-left: 2em;\n\tlist-style: initial;\n}\n\n.two-factor .qr-code {\n\tmargin: 0 15px;\n}\n\n.two-factor .qr-code img {\n\tborder: 3px solid #fff;\n}\n\n.two-factor .tl_listing_container {\n\tmargin-top: 6px;\n}\n\n.two-factor .widget {\n\theight: auto;\n\tmargin: 15px 15px 12px;\n}\n\n.two-factor .widget .tl_error {\n\tmargin: 0;\n\tpadding: 1px 0;\n\tbackground: none;\n\tfont-size: .75rem;\n\tline-height: 1.25;\n}\n\n.two-factor .tl_submit_container {\n\tbackground: none;\n\tpadding: 0 15px 10px;\n\tborder: 0;\n}\n\n.two-factor .submit_container {\n\tclear: both;\n\tmargin: 0 15px 12px;\n}\n\n.two-factor .tl_message {\n\tmargin: 0 15px 12px;\n}\n\n.two-factor .tl_message > p {\n\tpadding: 0 3px 0 27px;\n\tbackground-color: transparent;\n\tbackground-position: 3px center;\n}\n\n.two-factor .tl_backup_codes > p, .two-factor .tl_trusted_devices > p {\n\tmargin: 0 15px 12px;\n\tline-height: 1.3;\n}\n\n.two-factor .backup-codes {\n\tmax-width: 224px;\n\tmargin: 15px 15px 24px;\n\tpadding: 0;\n\tdisplay: grid;\n\tgrid-template-columns:repeat(2, 1fr);\n}\n\n.two-factor .backup-codes li {\n\tmargin: 0;\n\tlist-style: none;\n}\n\n.two-factor .tl_trusted_devices th, .two-factor .tl_trusted_devices td {\n\tline-height: 16px;\n}\n\n/* Picker search */\n#search {\n\tmargin: 18px 18px -9px;\n\ttext-align: right;\n}\n\n#search .tl_text {\n\tmax-width: 160px;\n\t-webkit-appearance: textfield;\n\tbox-sizing: content-box;\n}\n\n/* Preview image */\n.tl_edit_preview {\n\tmargin-top: 18px;\n}\n\n.tl_edit_preview img {\n\tmax-width: 100%;\n\theight: auto;\n\tpadding: 2px;\n\tborder: 1px solid var(--content-border);\n\tbackground: var(--white);\n}\n\n.tl_edit_preview_enabled {\n\tposition: relative;\n\tcursor: crosshair;\n\tdisplay: inline-block;\n}\n\n.tl_edit_preview_important_part {\n\tposition: absolute;\n\tmargin: -1px;\n\tborder: 1px solid var(--black);\n\tbox-shadow: 0 0 0 1px var(--white), inset 0 0 0 1px var(--white);\n\topacity: 0.5;\n}\n\n/* Listing */\ntable.tl_listing {\n\twidth: 100%;\n}\n\n.tl_listing_container {\n\tmargin: 18px 0;\n\tpadding: 0 15px;\n}\n\n#tl_buttons + .tl_listing_container, #tl_buttons + .tl_form .tl_listing_container {\n\tmargin-top: 12px;\n}\n\n#paste_hint + .tl_listing_container {\n\tmargin-top: 36px;\n}\n\n.tl_folder_list, .tl_folder_tlist {\n\tpadding: 6px;\n\tborder-bottom: 1px solid var(--border);\n\tbackground: var(--table-header);\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_folder_list, .tl_folder_tlist {\n\t\tfont-weight: 500;\n\t}\n}\n\n.tl_folder_tlist {\n\tline-height: 16px;\n\tborder-top: 1px solid var(--border);\n}\n\n.tl_file, .tl_file_list {\n\tposition: relative;\n\tpadding: 5px 6px;\n\tborder-bottom: 1px solid var(--border);\n\tbackground: var(--content-bg);\n}\n\n.tl_file_list .ellipsis {\n\theight: 16px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tpadding-right: 18px;\n\tword-break: break-all;\n}\n\n.tl_right_nowrap {\n\tpadding: 6px;\n\tvertical-align: top;\n\ttext-align: right;\n\twhite-space: nowrap;\n}\n\n.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 {\n\tbackground-image: linear-gradient(90deg, transparent calc(100% - 26px), var(--tree-header) 26px);\n}\n\n.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 {\n\tmargin-top: 2px;\n\tmargin-left: 8px;\n}\n\n.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 {\n\tvisibility: hidden;\n}\n\n.tl_listing_container.picker div[class^=\"ce_\"] {\n\tpadding-right: 24px;\n}\n\n.tl_listing_container.picker .limit_toggler {\n\twidth: calc(100% - 26px);\n}\n\n/* List view */\n.list_view .tl_listing img.theme_preview {\n\tmargin-right: 9px;\n}\n\n.tl_show {\n\twidth: 96%;\n\tmargin: 18px 2%;\n\tpadding: 9px 0 18px;\n}\n\n.tl_show + .tl_show {\n\tmargin-top: 36px;\n}\n\n.tl_show th, .tl_show td {\n\tline-height: 16px;\n\twhite-space: pre-line;\n}\n\n.tl_show td:first-child {\n\twidth: 34%;\n\twhite-space: normal;\n}\n\n.tl_show td p:last-of-type {\n\tmargin-bottom: 0;\n}\n\n.tl_show small {\n\tdisplay: block;\n\tcolor: var(--info);\n}\n\n.tl_label {\n\tmargin-right: 12px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n\n.tl_label small {\n\tfont-weight: 400;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_label {\n\t\tfont-weight: 500;\n\t}\n\n\t.tl_label small {\n\t\tfont-weight: 300;\n\t}\n}\n\n.tl_empty {\n\tmargin: 0;\n\tpadding: 18px;\n}\n\n.tl_empty_parent_view {\n\tmargin: 0;\n\tpadding: 18px 0 0;\n}\n\n.tl_listing_container + .tl_empty {\n\tmargin-top: -18px;\n}\n\n.tl_noopt {\n\tmargin: 0 0 -1px;\n}\n\n.tl_select_trigger {\n\tmargin-top: -9px;\n\tpadding: 0 6px 3px 0;\n\ttext-align: right;\n}\n\n.tl_radio_reset {\n\tmargin-top: 6px;\n\tpadding: 0 6px 3px 0;\n\ttext-align: right;\n}\n\n.tl_select_label, .tl_radio_label {\n\tmargin-right: 2px;\n\tcolor: var(--gray);\n\tfont-size: .75rem;\n}\n\n/* Parent view */\n.tl_header {\n\tmargin-bottom: 18px;\n\tpadding: 10px;\n\tbackground: var(--table-header);\n}\n\n.tl_header_table {\n\tline-height: 1.3;\n}\n\n.tl_content_header {\n\tpadding: 7px 6px;\n\tborder-bottom: 1px solid var(--border);\n\tbackground: var(--table-header);\n\tfont-weight: 600;\n}\n\n.tl_header + .tl_content_header {\n\tborder-top: 1px solid var(--border);\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_content_header {\n\t\tfont-weight: 500;\n\t}\n}\n\n.as-grid .tl_content_header {\n\tmargin-top: 24px;\n\tpadding: 0 1px;\n\tborder: 0;\n\tbackground-color: transparent;\n\tfont-size: 1rem;\n}\n\n.tl_content {\n\tborder-bottom: 1px solid var(--border);\n\tposition: relative;\n}\n\n.tl_content .inside {\n\tpadding: 6px;\n\tbackground-color: var(--content-bg);\n}\n\n.tl_content.draft .inside {\n\tmin-height: 16px;\n}\n\n.tl_content.draft > *, .tl_folder.draft > *, .tl_file.draft > *, .hover-row.draft > td {\n\topacity: 0.5;\n}\n\n.as-grid .tl_content {\n\tmargin-top: 18px;\n\tpadding: 0;\n\tborder: 1px solid var(--border);\n\tbackground-color: var(--content-bg);\n}\n\n.as-grid .tl_content .inside {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr auto;\n}\n\n.as-grid .tl_content_header + .tl_content {\n\tmargin-top: 12px;\n}\n\n.parent_view > ul {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.parent_view:not(.as-grid) > ul {\n\tbackground-color: var(--table-header);\n}\n\n.tl_content.indent_1 {\n\tmargin-left: 20px;\n}\n\n.tl_content.indent_2 {\n\tmargin-left: 40px;\n}\n\n.tl_content.indent_3 {\n\tmargin-left: 60px;\n}\n\n.tl_content.indent_4 {\n\tmargin-left: 80px;\n}\n\n.tl_content.indent_5 {\n\tmargin-left: 100px;\n}\n\n.as-grid .tl_content .inside {\n\tpadding: 0;\n}\n\n.as-grid .tl_content.indent {\n\tmargin: 0;\n\tpadding: 15px 15px 0;\n\tborder-width: 0 1px;\n\tbackground: var(--nested-bg);\n}\n\n.as-grid .tl_content.indent_2 {\n\tpadding-left: 30px;\n\tpadding-right: 30px;\n}\n\n.as-grid .tl_content.indent_3 {\n\tpadding-left: 45px;\n\tpadding-right: 45px;\n}\n\n.as-grid .tl_content.indent_4 {\n\tpadding-left: 60px;\n\tpadding-right: 60px;\n}\n\n.as-grid .tl_content.indent_5 {\n\tpadding-left: 75px;\n\tpadding-right: 75px;\n}\n\n.as-grid .tl_content.indent_last {\n\tpadding-bottom: 15px;\n}\n\n.as-grid .tl_content.indent .inside {\n\tborder: 1px solid var(--border);\n}\n\n.as-grid .tl_content.wrapper_stop {\n\tmargin-top: 0;\n}\n\n.as-grid .tl_content.indent.wrapper_stop {\n\tpadding-top: 0;\n}\n\n.tl_content_left {\n\tline-height: 16px;\n}\n\n.as-grid .tl_content_left {\n\tpadding: 8px 10px;\n}\n\n.tl_content_right {\n\tposition: relative;\n\tz-index: 1;\n\tfloat: right;\n\ttext-align: right;\n\tmargin-left: 12px;\n\tmargin-bottom: -1px;\n}\n\n.as-grid .tl_content .tl_content_right {\n\torder: 2;\n\tfloat: none;\n\tmargin-left: 0;\n\tmargin-bottom: 0;\n\tpadding: 8px 10px;\n\tborder-left: 1px solid var(--border);\n\tbackground: var(--table-header);\n}\n\n.tl_right button, .tl_content_right button {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\theight: 16px;\n\tbackground: none;\n}\n\n.cte_type {\n\tmargin: 0 0 4px;\n\tfont-size: .75rem;\n\tcolor: var(--info);\n\tline-height: 16px;\n}\n\n.as-grid .cte_type {\n\torder: 1;\n\tmargin-bottom: 0;\n\tpadding: 8px 10px;\n\tbackground-color: var(--table-header);\n\tfont-size: .8rem;\n}\n\n.cte_type.published, .cte_type.published a {\n\tcolor: var(--green);\n}\n\n.cte_type.unpublished, .cte_type.unpublished a {\n\tcolor: var(--red);\n}\n\n.cte_type.icon-protected {\n\tpadding-left: 27px;\n\tbackground: var(--table-header) url(\"icons/protected.svg\") 8px center no-repeat;\n}\n\n.cte_type .visibility {\n\tcolor: var(--gray);\n}\n\n.cte_preview {\n\tline-height: 1.25;\n\tposition: relative;\n}\n\n.cte_preview h1 {\n\tfont-size: 1.25rem;\n\tmargin-bottom: 6px;\n}\n\n.cte_preview h2 {\n\tfont-size: 1rem;\n\tmargin-bottom: 6px;\n}\n\n.cte_preview h3 {\n\tfont-size: .9rem;\n\tmargin-bottom: 6px;\n}\n\n.cte_preview h4, .cte_preview h5, .cte_preview h6 {\n\tfont-size: .875rem;\n\tmargin-bottom: 6px;\n}\n\n.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 {\n\tmargin-bottom: 6px;\n}\n\n.cte_preview img {\n\tmax-width: 320px;\n\theight: auto;\n\tpadding: 6px 0;\n}\n\n.cte_preview th, .cte_preview td {\n\tpadding: 3px 6px;\n\tborder-bottom: 1px solid var(--border);\n}\n\n.cte_preview th {\n\tpadding: 6px;\n\tbackground: var(--table-header);\n}\n\n.cte_preview td {\n\tbackground: var(--content-bg);\n}\n\n.cte_preview table caption {\n\ttext-align: left;\n\tfont-size: .75rem;\n}\n\n.cte_preview pre {\n\tmargin-top: 0;\n\tmargin-bottom: 6px;\n\tword-break: break-all;\n\twhite-space: pre-wrap;\n}\n\n.cte_preview pre.disabled {\n\tcolor: var(--pre-disabled);\n}\n\n.cte_preview .content-gallery ul {\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 1fr;\n\tlist-style: none;\n}\n\n.cte_preview a {\n\tcolor: var(--green);\n}\n\n.cte_preview div.tl_gray a {\n\tcolor: var(--gray);\n}\n\n.cte_preview span.comment {\n\tcolor: var(--blue);\n\tdisplay: inline-block;\n\tmargin-bottom: 3px;\n}\n\n.cte_preview input, .cte_preview select, .cte_preview textarea, .cte_preview button {\n\tbackground: var(--form-bg);\n\tborder: 1px solid var(--form-border);\n}\n\n.cte_preview input[type=\"file\"] {\n\tposition: relative;\n}\n\n.cte_preview select {\n\t-moz-appearance: menulist;\n\t-webkit-appearance: menulist;\n}\n\n.cte_preview label, .cte_preview .checkbox_container legend, .cte_preview .radio_container legend {\n\tdisplay: block;\n\tmargin-bottom: 6px;\n}\n\n.cte_preview .widget {\n\tmargin: 0 0 6px;\n}\n\n.cte_preview .checkbox_container label, .cte_preview .radio_container label {\n\tdisplay: initial;\n}\n\n.cte_preview .widget-captcha {\n\tdisplay: block !important;\n}\n\n.cte_preview .widget-captcha .captcha_text {\n\tpadding-left: 3px;\n\tvertical-align: middle;\n}\n\n.cte_preview.empty {\n\tdisplay: none;\n}\n\n.as-grid .cte_preview {\n\torder: 3;\n\tgrid-column: 1 / span 2;\n\tpadding: 10px 10px 6px;\n\tborder-top: 1px solid var(--border);\n}\n\n/* Backwards compatibility */\n.limit_height {\n\toverflow: hidden;\n}\n\n.limit_toggler {\n\twidth: 100%;\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tbackground: var(--content-bg);\n\tline-height: 11px;\n\ttext-align: center;\n}\n\n.limit_toggler button {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: var(--content-bg);\n\twidth: 24px;\n\tline-height: 8px;\n\tcolor: var(--gray);\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n}\n\n.limit_toggler button span {\n\tposition: relative;\n\ttop: -4px;\n\tz-index: 1;\n}\n\n/* Tree view */\n.tl_folder_top {\n\tpadding: 5px 6px;\n\tborder: solid var(--tree-header-border);\n\tborder-width: 1px 0;\n\tbackground: var(--tree-header);\n}\n\n.tl_folder {\n\tpadding: 5px 6px;\n\tborder-bottom: 1px solid var(--border);\n\tbackground: var(--table-header);\n}\n\n.tl_folder.tl_folder_dropping, .tl_folder_top.tl_folder_dropping {\n\tbackground-color: var(--drag-bg) !important;\n\tcolor: var(--text) !important;\n}\n\n.tl_folder.tl_folder_dropping a, .tl_folder_top.tl_folder_dropping a {\n\tcolor: inherit;\n}\n\n.tl_listing .tl_left {\n\tflex-grow: 1;\n\tbox-sizing: border-box;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tline-height: normal;\n}\n\n.tl_listing .tl_left.tl_left_dragging {\n\tposition: absolute;\n\tbackground: var(--drag-bg);\n\tborder-radius: 10px;\n\tcolor: var(--text);\n\tpadding: 5px 10px !important;\n\tmargin-left: 0;\n\ttext-indent: 0;\n\twhite-space: nowrap;\n}\n\n.tl_listing .tl_left.tl_left_dragging .preview-image, .tl_listing .tl_left.tl_left_dragging a img {\n\tdisplay: none;\n}\n\n.tl_listing .tl_left.tl_left_dragging a, .tl_listing .tl_left.tl_left_dragging .tl_gray {\n\tcolor: inherit;\n}\n\n.tl_listing_dragging .hover-div:not(.tl_folder):hover {\n\tbackground-color: transparent !important;\n}\n\n.tl_listing .tl_left * {\n\tvertical-align: text-top;\n}\n\n.tl_listing .tl_left a:hover {\n\tcolor: var(--text);\n}\n\n.tl_tree_xtnd .tl_file {\n\tpadding-top: 5px;\n\tpadding-bottom: 5px;\n}\n\n.tl_tree_xtnd .tl_file .tl_left img {\n\tmargin-right: 2px;\n}\n\n.tl_file_manager .preview-image {\n\tmax-width: 100px;\n\tmax-height: 75px;\n\twidth: auto;\n\theight: auto;\n\tmargin: 0 0 2px 22px;\n}\n\n.tl_file_manager .preview-important {\n\tmax-width: 80px;\n\tmax-height: 60px;\n\twidth: auto;\n\theight: auto;\n\tmargin: 0 0 2px 0;\n\tvertical-align: bottom;\n}\n\n.tl_listing .tl_right {\n\tpadding: 1px 0 0 9px;\n\twhite-space: nowrap;\n}\n\n@-moz-document url-prefix() {\n\t.tl_listing .tl_right {\n\t\tpadding-top: 0;\n\t}\n}\n\n.tl_listing, .tl_listing ul {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.tl_listing li {\n\tdisplay: flex;\n\tmargin: 0;\n\tlist-style-type: none;\n}\n\n.tl_listing li.parent {\n\tdisplay: inline;\n\tpadding-left: 0;\n\tpadding-right: 0;\n}\n\nlabel.tl_change_selected {\n\tmargin-right: 2px;\n\tcolor: var(--gray);\n\tfont-size: .75rem;\n}\n\n/* Breadcrumb */\n#tl_breadcrumb {\n\tmargin: 0 0 12px;\n\tpadding: 4px 6px;\n\tdisplay: flow-root;\n\tbackground: var(--active-bg);\n\tborder: 1px solid var(--active-border);\n\tborder-radius: 2px;\n\tline-height: 24px;\n}\n\n#tl_breadcrumb li {\n\tmargin: 0;\n\tpadding: 0 3px;\n\tlist-style-type: none;\n\tfloat: left;\n}\n\n#tl_breadcrumb li a {\n\tdisplay: inline-block;\n}\n\n#tl_breadcrumb li img {\n\twidth: 16px;\n\theight: 16px;\n\tvertical-align: -3px;\n}\n\n/* Picker */\n.selector_container {\n\tmargin-top: 1px;\n\tposition: relative;\n}\n\n.selector_container > ul {\n\tmargin: 0 0 1px;\n\tpadding: 0;\n\tlist-style-type: none;\n}\n\n.selector_container > ul > li {\n\tmargin: 0 9px 0 0;\n\tpadding: 2px 0;\n}\n\n.selector_container p {\n\tmargin-bottom: 1px;\n}\n\n.selector_container ul:not(.sgallery) img {\n\tmargin-right: 1px;\n\tvertical-align: text-top;\n}\n\n.selector_container img {\n\tmax-width: 320px;\n\theight: auto;\n}\n\n.selector_container .limit_height {\n\theight: auto !important;\n\tmax-height: 190px;\n}\n\n.selector_container .limit_toggler {\n\tdisplay: none;\n}\n\n.selector_container h1, .selector_container h2, .selector_container h3, .selector_container h4 {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.selector_container pre {\n\twhite-space: pre-wrap;\n}\n\n.selector_container table.showColumns {\n\tmargin: 2px 0 3px;\n}\n\n.selector_container table.sortable td {\n\tcursor: move;\n}\n\nul.sgallery {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fill, 100px);\n\tgrid-auto-rows: 75px;\n\tgap: 4px;\n\tpadding: 2px 0;\n}\n\nul.sgallery li {\n\tmin-width: 100px;\n\tmin-height: 75px;\n\tmargin: 0;\n\tpadding: 0;\n\tbackground: var(--form-button);\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n\t-webkit-align-items: center;\n\talign-items: center;\n\t-webkit-justify-content: center;\n\tjustify-content: center;\n}\n\n/* Welcome screen */\n.popup #tl_soverview {\n\tmargin-top: 15px;\n}\n\n#tl_soverview > div {\n\tpadding: 5px 15px;\n\tborder-bottom: 1px solid var(--border);\n}\n\n#tl_soverview > div:last-child {\n\tborder-bottom: 0;\n}\n\n#tl_messages h2, #tl_shortcuts h2 {\n\tmargin: 14px 0 10px;\n}\n\n#tl_versions h2 {\n\tmargin: 14px 0 12px;\n}\n\n#tl_messages p {\n\tmargin-bottom: .5em;\n}\n\n#tl_messages p:last-child {\n\tmargin-bottom: 1em;\n}\n\n#tl_messages .tl_error, #tl_messages .tl_confirm, #tl_messages .tl_info, #tl_messages .tl_new {\n\tpadding: 0 0 0 21px;\n\tbackground-position: left 1px;\n\tbackground-color: transparent;\n}\n\n#tl_shortcuts p a {\n\ttext-decoration: underline;\n}\n\n#tl_versions {\n\tmargin-bottom: 0;\n}\n\n#tl_versions table {\n\twidth: 100%;\n\tmargin-bottom: 18px;\n}\n\n#tl_versions th, #tl_versions td {\n\tpadding: 6px;\n}\n\n#tl_versions th {\n\tline-height: 16px;\n}\n\n#tl_versions td:first-child {\n\twhite-space: nowrap;\n}\n\n#tl_versions td:last-child {\n\twidth: 32px;\n\twhite-space: nowrap;\n\ttext-align: right;\n}\n\n#tl_versions .pagination {\n\tmargin-top: 18px;\n\tmargin-bottom: 14px;\n\tpadding: 12px 6px;\n\tbackground: var(--table-header);\n}\n\n/* CHMOD table */\n.tl_chmod {\n\twidth: 100%;\n}\n\n.tl_chmod th {\n\theight: 18px;\n\ttext-align: center;\n\tfont-weight: 400;\n\tbackground: var(--tree-header);\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_chmod th {\n\t\tfont-weight: 300;\n\t}\n}\n\n.tl_chmod td {\n\ttext-align: center;\n\tbackground: var(--table-header);\n}\n\n.tl_chmod th, .tl_chmod td {\n\twidth: 14.2857%;\n\tpadding: 6px;\n\tborder: 1px solid var(--content-bg);\n}\n\n/* Wizards */\n.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 {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: none;\n\tvertical-align: middle;\n}\n\n/* Module wizard */\n.tl_modulewizard {\n\twidth: 100%;\n\tmax-width: 800px;\n\tmargin-top: 2px;\n}\n\n.tl_modulewizard td {\n\tposition: relative;\n\tpadding: 0 3px 0 0;\n}\n\n.tl_modulewizard th {\n\tfont-size: .75rem;\n\tfont-weight: 400;\n\tpadding: 0 6px 1px 0;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_modulewizard th {\n\t\tfont-weight: 300;\n\t}\n}\n\n.tl_modulewizard td:last-child {\n\twidth: 1%;\n\twhite-space: nowrap;\n}\n\n.tl_modulewizard .tl_select, .tl_modulewizard .tl_select_column {\n\tmargin: 2px 0;\n}\n\n.tl_modulewizard input.mw_enable + button, .js .tl_modulewizard input.mw_enable {\n\tdisplay: none;\n}\n\n.js .tl_modulewizard input.mw_enable + button {\n\tdisplay: inline;\n\twidth: 16px;\n\theight: 16px;\n\tbackground: var(--icon-invisible) 0 0 no-repeat;\n}\n\n.js .tl_modulewizard input.mw_enable:checked + button {\n\tbackground-image: var(--icon-visible);\n}\n\n.tl_modulewizard img.mw_enable {\n\tdisplay: none;\n}\n\n.js .tl_modulewizard img.mw_enable {\n\tdisplay: inline;\n\tmargin-right: 1px;\n}\n\n/* Options and key/value wizard */\n.tl_optionwizard {\n\twidth: 100%;\n\tmax-width: 600px;\n}\n\n.tl_key_value_wizard {\n\twidth: 100%;\n\tmax-width: 450px;\n}\n\n.tl_optionwizard, .tl_key_value_wizard {\n\tmargin-top: 2px;\n}\n\n.tl_optionwizard label, .tl_key_value_wizard label {\n\tmargin-right: 3px;\n}\n\n.tl_optionwizard td, .tl_key_value_wizard td {\n\tpadding: 0 3px 0 0;\n}\n\n.tl_optionwizard th, .tl_key_value_wizard th {\n\tfont-size: .75rem;\n\tfont-weight: 400;\n\tpadding: 0 6px 1px 0;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_optionwizard th, .tl_key_value_wizard th {\n\t\tfont-weight: 300;\n\t}\n}\n\n.tl_optionwizard td:nth-child(n+3), .tl_key_value_wizard td:nth-child(n+3) {\n\twidth: 1%;\n\twhite-space: nowrap;\n}\n\n.tl_optionwizard .tl_text {\n\tmargin: 2px 0;\n}\n\n.tl_optionwizard img, .tl_key_value_wizard img {\n\tposition: relative;\n\ttop: 1px;\n}\n\n.tl_optionwizard .fw_checkbox, .tl_key_value_wizard .fw_checkbox {\n\tmargin: 0 1px;\n}\n\n#ctrl_allowedAttributes {\n\tmax-width: none;\n}\n\n#ctrl_allowedAttributes td:first-child {\n\twidth: 100px;\n}\n\n/* Table wizard */\n#tl_tablewizard {\n\tmargin-top: 2px;\n\tpadding-bottom: 2px;\n\toverflow: auto;\n}\n\n.tl_tablewizard td {\n\tpadding: 0 3px 0 0;\n}\n\n.tl_tablewizard thead td {\n\tpadding-bottom: 3px;\n\ttext-align: center;\n\twhite-space: nowrap;\n}\n\n.tl_tablewizard tbody td:last-child {\n\twhite-space: nowrap;\n}\n\n.tl_tablewizard td.tcontainer {\n\tvertical-align: top;\n}\n\n.tl_tablewizard .tl_textarea {\n\tmargin: 2px 0;\n}\n\n/* List wizard */\n.tl_listwizard {\n\tmargin: 1px 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.tl_listwizard .tl_text {\n\twidth: 78%;\n\tmargin: 2px 0;\n}\n\n/* Checkbox wizard */\n.tl_checkbox_wizard .fixed {\n\tdisplay: block;\n\tmargin-top: 1px;\n}\n\n.tl_checkbox_wizard .sortable span {\n\tdisplay: block;\n}\n\n.tl_checkbox_wizard .sortable img {\n\tvertical-align: bottom;\n}\n\n/* Meta wizard */\n.tl_metawizard {\n\tmargin: 3px 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.tl_metawizard li {\n\tmargin-bottom: 2px;\n\tpadding: 9px;\n}\n\n.tl_metawizard li:nth-child(odd) {\n\tbackground: var(--table-header);\n}\n\n.tl_metawizard li:nth-child(even) {\n\tbackground: var(--table-even);\n}\n\n.tl_metawizard label {\n\tfloat: left;\n\twidth: 18%;\n\tmargin-top: 9px;\n}\n\n.tl_metawizard .tl_text, .tl_metawizard .tl_textarea {\n\tfloat: left;\n\twidth: calc(82% - 20px);\n\tmargin: 1px 0;\n}\n\n.tl_metawizard .tl_textarea {\n\tresize: vertical;\n}\n\n.tl_metawizard .tl_text + a {\n\tposition: relative;\n\ttop: 7px;\n\tmargin-left: 4px;\n}\n\n.tl_metawizard br {\n\tclear: left;\n}\n\n.tl_metawizard .lang {\n\tdisplay: block;\n\tmargin: 3px 0 9px;\n\tfont-weight: 600;\n\tposition: relative;\n}\n\n.tl_metawizard .lang button {\n\tposition: absolute;\n\tright: 0;\n\ttop: -1px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_metawizard .lang {\n\t\tfont-weight: 500;\n\t}\n}\n\n/* Section wizard */\n.tl_sectionwizard {\n\tmargin-top: 2px;\n\twidth: 100%;\n\tmax-width: 680px;\n}\n\n.tl_sectionwizard td {\n\twidth: 25%;\n\tposition: relative;\n\tpadding: 0 3px 0 0;\n}\n\n.tl_sectionwizard th {\n\tfont-size: .75rem;\n\tfont-weight: 400;\n\tpadding: 0 4px 1px 0;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_sectionwizard th {\n\t\tfont-weight: 300;\n\t}\n}\n\n.tl_sectionwizard td:last-child {\n\twhite-space: nowrap;\n}\n\n/* Paste/sort hint */\n#paste_hint {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.tl_message + #paste_hint {\n\tmargin-top: -12px;\n}\n\n#paste_hint p {\n\tposition: absolute;\n\tfont-family: \"Architects Daughter\", cursive;\n\tfont-size: 1rem;\n\tcolor: var(--paste-hint);\n\ttop: 0;\n\tright: 30px;\n\tpadding: 0 36px 24px 0;\n\tbackground: var(--icon-arrow-right) bottom right no-repeat;\n\ttransform: rotate(-1deg);\n}\n\n.sort_hint {\n\tposition: absolute;\n\tfont-family: \"Architects Daughter\", cursive;\n\tfont-size: 1rem;\n\tcolor: var(--paste-hint);\n\ttop: -50px;\n\tleft: 160px;\n\tpadding: 0 6px 24px 42px;\n\tbackground: var(--icon-arrow-left) 6px bottom no-repeat;\n\ttransform: rotate(-2deg);\n}\n\n.widget + .subpal .sort_hint {\n\tleft: 260px;\n}\n\n.widget + .widget .sort_hint {\n\tleft: 320px;\n}\n\n/* SERP preview */\n.serp-preview {\n\tmax-width: 600px;\n\tmargin: 2px 0;\n\tpadding: 5px 7px;\n\tfont-family: Arial, sans-serif;\n\tfont-weight: 400;\n\tcolor: var(--serp-preview);\n\tbackground: var(--panel-bg);\n\tborder-radius: 3px;\n}\n\n.serp-preview p {\n\tmargin: 0;\n}\n\n.serp-preview .url, .serp-preview .description {\n\tline-height: 18px;\n}\n\n.serp-preview .url:not(:empty) {\n\tmargin-top: 3px;\n}\n\n.serp-preview .description:not(:empty) {\n\tmargin-bottom: 3px;\n}\n\n.serp-preview .title {\n\tmargin: 5px 0 4px;\n\tfont-size: 18px;\n\tcolor: var(--serp-preview-title);\n}\n\n.serp-preview .tl_info {\n\tbackground-color: transparent;\n}\n\n/* Ajax box */\n#tl_ajaxBox {\n\twidth: 300px;\n\tpadding: 2em;\n\tbox-sizing: border-box;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -150px;\n\tbackground: var(--white) var(--icon-loading) no-repeat right 2em center;\n\tborder: 2px solid var(--black);\n\tborder-radius: 2px;\n\tfont-size: 1rem;\n\ttext-align: left;\n}\n\n#tl_ajaxOverlay {\n\twidth: 100%;\n\theight: 100%;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbackground: var(--white);\n\topacity: 0.5;\n}\n\n/* Misc */\n.ce_gallery ul {\n\tdisplay: flow-root;\n}\n\n.ce_gallery li {\n\tfloat: left;\n\tmargin: 0 6px 6px 0;\n}\n\n.drag-handle {\n\tcursor: move;\n}\n\nul.sortable li {\n\tcursor: move;\n\tposition: relative;\n}\n\nul.sortable li .dirname {\n\tdisplay: none;\n}\n\nul.sortable li:hover .dirname {\n\tdisplay: inline;\n}\n\nul.sortable button {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tborder: 0;\n\tborder-radius: 2px;\n\tbackground: var(--form-button);\n\tmargin: 0;\n\tpadding: 0 0 3px;\n\tfont-size: 22px;\n\tline-height: 9px;\n\tcursor: pointer;\n\ttransition: all .1s linear;\n}\n\nul.sortable button:hover {\n\tbackground: var(--form-button-hover);\n}\n\nul.sortable button[disabled] {\n\tcolor: var(--gray);\n\tcursor: not-allowed;\n}\n\nul.sortable button[disabled]:hover {\n\tbackground: rgba(255,255,255,.7);\n}\n\n#picker-menu {\n\tpadding: 9px 6px 0;\n\tborder-bottom: 1px solid var(--content-border);\n}\n\n#picker-menu > ul {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n#picker-menu li {\n\tdisplay: inline-block;\n\tpadding: 8px 0;\n\tbackground-color: var(--table-even);\n\tborder: 1px solid var(--content-border);\n\tborder-radius: 2px 2px 0 0;\n\tposition: relative;\n\ttop: 1px;\n}\n\n#picker-menu li:hover {\n\tbackground-color: var(--panel-bg);\n}\n\n#picker-menu li.current {\n\tbackground-color: var(--panel-bg);\n\tborder-bottom-color: var(--panel-bg);\n}\n\n#picker-menu a {\n\tpadding: 3px 12px 3px 32px;\n\tbackground: url(\"icons/manager.svg\") 12px center no-repeat;\n}\n\n#picker-menu a:hover {\n\tcolor: var(--text);\n}\n\n#picker-menu a.pagePicker {\n\tbackground-image: url(\"icons/pagemounts.svg\");\n\tbackground-size: 16px;\n}\n\n#picker-menu a.filePicker {\n\tbackground-image: url(\"icons/filemounts.svg\");\n\tbackground-size: 14px;\n}\n\n#picker-menu a.articlePicker {\n\tbackground-image: url(\"icons/articles.svg\");\n\tbackground-size: 16px;\n}\n\n#picker-menu a.close {\n\tbackground-image: url(\"icons/back.svg\");\n}\n\n.ace_editor {\n\tpadding: 3px;\n\tz-index: 0;\n}\n\n.ace_editor, .ace_editor * {\n\tfont-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n\tfont-size: .75rem !important;\n\tcolor: var(--text);\n}\n\n.ace-fullsize {\n\toverflow: hidden !important;\n}\n\n.ace-fullsize .ace_editor {\n\tposition: fixed !important;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\twidth: auto !important;\n\theight: auto !important;\n\tmargin: 0;\n\tborder: 0;\n\tz-index: 10000;\n}\n\ndiv.mce-edit-area {\n\twidth: 99.9%;\n}\n\ntime[title] {\n\tcursor: help;\n}\n\n.float_left {\n\tfloat: left;\n}\n\n.float_right {\n\tfloat: right;\n}\n\n.foldable img {\n\ttransition: transform .2s ease;\n\ttransform: none;\n\twill-change: transform;\n}\n\n.foldable--open img {\n\ttransform: rotateZ(90deg);\n}\n\n.foldable--loading {\n\tposition: relative;\n\tpointer-events: none;\n}\n\n.foldable--loading img {\n\tvisibility: hidden;\n}\n\n.foldable--loading::after {\n\tcontent: \"\";\n\tposition: absolute;\n\tinset: 2px auto auto 2px;\n\twidth: 14px;\n\theight: 14px;\n\tbackground: var(--icon-loading) 0 0/contain no-repeat\n}\n\n/* Default icon classes */\n.header_icon, .header_clipboard, .header_back, .header_new, .header_rss, .header_edit_all, .header_delete_all,\n.header_new_folder, .header_css_import, .header_theme_import, .header_store, .header_toggle, .header_sync {\n\tdisplay: inline-block;\n\tpadding: 3px 0 3px 21px;\n\tbackground-color: transparent;\n\tbackground-position: left center;\n\tbackground-repeat: no-repeat;\n\tborder: none;\n\tmargin-left: 15px;\n}\n\n.list_icon {\n\tmargin-left: -3px;\n\tpadding-left: 20px;\n\tbackground-position: left center;\n\tbackground-repeat: no-repeat;\n}\n\n.list_icon_new {\n\twidth: 16px;\n\tbackground-position: 1px center;\n\tbackground-repeat: no-repeat;\n}\n\n/* Header icons */\n.header_clipboard {\n\tbackground-image: url(\"icons/clipboard.svg\");\n}\n\n.header_back {\n\tbackground-image: url(\"icons/back.svg\");\n}\n\n.header_new {\n\tbackground-image: url(\"icons/new.svg\");\n}\n\n.header_rss {\n\tbackground-image: url(\"icons/rss.svg\");\n}\n\n.header_edit_all {\n\tbackground-image: url(\"icons/all.svg\");\n}\n\n.header_new_folder {\n\tpadding-left: 24px;\n\tbackground-image: url(\"icons/newfolder.svg\");\n}\n\n.header_css_import {\n\tbackground-image: url(\"icons/cssimport.svg\");\n}\n\n.header_theme_import {\n\tbackground-image: url(\"icons/theme_import.svg\");\n}\n\n.header_store {\n\tpadding-left: 18px;\n\tbackground-image: url(\"icons/store.svg\");\n}\n\n.header_toggle {\n\tbackground-image: var(--icon-toggle-all);\n}\n\n.header_sync {\n\tbackground-image: url(\"icons/sync.svg\");\n}\n\n/* Visual hint for TRBL fields - thanks to Eugene Rybyakov */\n.tl_text_trbl, .tl_imageSize_0, .tl_imageSize_1, #ctrl_playerSize input {\n\tbackground: var(--form-bg) url(\"icons/hints.svg\") no-repeat right 1px top 2px;\n}\n\n#ctrl_playerSize_1, .tl_imageSize_1 {\n\tbackground-position: right 1px top -28px !important;\n}\n\n.trbl_top {\n\tbackground-position: right 1px top -59px !important;\n}\n\n.trbl_right {\n\tbackground-position: right 1px top -89px !important;\n}\n\n.trbl_bottom {\n\tbackground-position: right 1px top -119px !important;\n}\n\n.trbl_left {\n\tbackground-position: right 1px top -149px !important;\n}\n\n#ctrl_shadowsize_top {\n\tbackground-position: right 1px top -179px !important;\n}\n\n#ctrl_shadowsize_right {\n\tbackground-position: right 1px top -209px !important;\n}\n\n#ctrl_shadowsize_bottom {\n\tbackground-position: right 1px top -238px !important;\n}\n\n#ctrl_shadowsize_left {\n\tbackground-position: right 1px top -269px !important;\n}\n\n#ctrl_borderradius_top {\n\tbackground-position: left -299px !important;\n}\n\n#ctrl_borderradius_right {\n\tbackground-position: right 1px top -329px !important;\n}\n\n#ctrl_borderradius_bottom {\n\tbackground-position: right 1px top -352px !important;\n}\n\n#ctrl_borderradius_left {\n\tbackground-position: left -382px !important;\n}\n\n/* Error messages */\nlabel.error, legend.error, .tl_checkbox_container.error legend {\n\tcolor: var(--red);\n}\n\n.tl_tbox .tl_error, .tl_box .tl_error {\n\tbackground: none;\n\tpadding: 0;\n\tmargin-bottom: 0;\n\tfont-size: .75rem;\n}\n\n.tl_formbody_edit > .tl_error {\n\tmargin-top: 9px;\n}\n\n.broken-image {\n\tdisplay: inline-block;\n\tpadding: 12px 12px 12px 30px;\n\tbackground: var(--error-bg) url(\"icons/error.svg\") no-repeat 9px center;\n\tcolor: var(--red);\n\ttext-indent: 0;\n}\n\n/* Fieldsets */\nfieldset.tl_tbox, fieldset.tl_box {\n\tmargin-top: 5px;\n\tpadding-top: 0;\n\tborder-top: none;\n\tborder-left: 0;\n\tborder-right: 0;\n\tmargin-inline: 0;\n}\n\nfieldset.tl_tbox.nolegend, fieldset.tl_box.nolegend {\n\tborder-top: 0;\n}\n\nfieldset.tl_tbox > legend, fieldset.tl_box > legend {\n\tbox-sizing: border-box;\n\tcolor: var(--legend);\n\tpadding: 9px 12px 9px 28px;\n\tbackground: url(\"icons/navcol.svg\") 13px 10px no-repeat;\n\tcursor: pointer;\n}\n\nfieldset.collapsed {\n\tmargin-bottom: 0;\n\tpadding-bottom: 5px;\n}\n\nfieldset.collapsed div {\n\tdisplay: none !important;\n}\n\nfieldset.collapsed > legend {\n\tbackground: url(\"icons/navexp.svg\") 13px 10px no-repeat;\n}\n\n/* Maintenance */\n#tl_maintenance_cache table {\n\twidth: 100%;\n}\n\n#tl_maintenance_cache td {\n\tline-height: 1.2;\n\tpadding: 9px 6px;\n}\n\n#tl_maintenance_cache td span {\n\tcolor: var(--gray);\n}\n\n#tl_maintenance_cache td:first-child {\n\twidth: 16px;\n}\n\n#tl_maintenance_cache .nw {\n\twhite-space: nowrap;\n}\n\n#tl_maintenance_cache .tl_checkbox_container {\n\tmargin-top: 3px;\n}\n\n#tl_maintenance_cache .tl_checkbox_container label {\n\tvertical-align: initial;\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#tl_maintenance_cache .tl_checkbox_container label {\n\t\tfont-weight: 500;\n\t}\n}\n\n/* Pagination */\n.pagination {\n\tdisplay: flow-root;\n\tbackground: var(--panel-bg);\n\tmargin-bottom: 18px;\n\tborder: solid var(--border);\n\tborder-width: 1px 0;\n\tpadding: 12px 15px;\n}\n\n.pagination ul {\n\twidth: 60%;\n\tfloat: right;\n\ttext-align: right;\n}\n\n.pagination p {\n\twidth: 30%;\n\tfloat: left;\n\tmargin-bottom: 0;\n}\n\n.pagination li {\n\tdisplay: inline;\n\tpadding-left: 3px;\n}\n\n.pagination .active {\n\tcolor: var(--gray);\n}\n\n.pagination-lp {\n\tmargin-bottom: 0;\n\tborder-bottom: 0;\n\tpadding: 15px 12px;\n}\n\n/* File synchronization */\n#result-list {\n\tmargin: 15px;\n}\n\n#result-list .tl_error, #result-list .tl_confirm, #result-list .tl_info, #result-list .tl_new {\n\tpadding: 3px 0;\n\tbackground: none;\n}\n\n/* DropZone */\n.dropzone {\n\tmargin: 2px 0;\n\tmin-height: auto !important;\n\tborder: 3px dashed var(--border) !important;\n\tborder-radius: 2px;\n\tbackground: var(--form-bg) !important;\n}\n\n.dropzone-filetree {\n\tdisplay: none;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\topacity: .8;\n\tz-index: 1;\n}\n\n.dropzone-filetree-enabled {\n\tdisplay: block;\n}\n\n.dz-message span {\n\tfont-size: 1.3125rem;\n\tcolor: var(--gray);\n}\n\n/* TinyMCE */\n.tox-tinymce {\n\tmargin: 3px 0;\n\tborder-radius: 2px !important;\n}\n\n/* Undo */\n.tl_undo_header {\n\tmax-width: 880px;\n\tdisplay: grid;\n\tgrid-template-columns:2fr 2fr 3fr 3fr;\n\tgrid-column-gap: 24px;\n}\n\n.hover-row:hover .tl_undo_header {\n\tbackground-color: var(--hover-row) !important;\n}\n\n.tl_undo_preview {\n\tmargin-top: 5px;\n\tpadding: 10px 15px;\n\tposition: relative;\n}\n\n.tl_undo_preview td {\n\tpadding-left: 0 !important;\n\tpadding-right: 32px !important;\n}\n\n.tl_undo_preview td:empty {\n\tdisplay: none;\n}\n\n.tl_undo_preview img {\n\tmax-width: 320px;\n\theight: auto;\n}\n\n.tl_undo_preview {\n\tfont-size: .75rem;\n}\n\n.tl_undo_preview .cte_preview h1 {\n\tfont-size: 1.15rem;\n}\n\n.tl_undo_preview .cte_preview h2 {\n\tfont-size: .9rem;\n}\n\n.tl_undo_preview .cte_preview h3 {\n\tfont-size: .8rem;\n}\n\n.tl_undo_preview .cte_preview h4, .tl_undo_preview .cte_preview h5, .tl_undo_preview .cte_preview h6 {\n\tfont-size: .775rem;\n}\n\n\n/* Tablet */\n@media (max-width: 991px) {\n\t#container {\n\t\tdisplay: block;\n\t}\n\n\t#main, #left {\n\t\tfloat: none;\n\t}\n\n\t#main {\n\t\twidth: 100% !important;\n\t\tposition: relative;\n\t\ttransition: transform .2s ease;\n\t\t-webkit-transform: none;\n\t\ttransform: none;\n\t\twill-change: transform;\n\t}\n\n\t.show-navigation #main {\n\t\t-webkit-transform: translateX(240px);\n\t\ttransform: translateX(240px);\n\t}\n\n\t#left {\n\t\tvisibility: hidden;\n\t\tposition: absolute;\n\t\ttop: 40px;\n\t\twidth: 240px;\n\t\ttransition: transform .2s ease, visibility .2s ease;\n\t\t-webkit-transform: translateX(-240px);\n\t\ttransform: translateX(-240px);\n\t\twill-change: transform, visibility;\n\t}\n\n\t.show-navigation #left {\n\t\tvisibility: visible;\n\t\t-webkit-transform: none;\n\t\ttransform: none;\n\t}\n\n\t#tmenu .burger {\n\t\tdisplay: inline;\n\t}\n}\n\n/* Handheld */\n@media (max-width: 767px) {\n\t#header h1 a {\n\t\tmin-width: 22px;\n\t\tpadding: 12px;\n\t}\n\n\t#header h1 a .app-title {\n\t\tdisplay: none;\n\t}\n\n\t#header h1 a .badge-title {\n\t\tmargin-left: 32px;\n\t}\n\n\t#tmenu > li > a {\n\t\twidth: 16px;\n\t\tmargin-bottom: -2px;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-indent: 28px; /* 16px width + 12px padding */\n\t\tbackground-size: 18px !important;\n\t}\n\n\t#tmenu sup {\n\t\ttop: 6px;\n\t\tfont-size: .5rem;\n\t}\n\n\t#tmenu .icon-debug {\n\t\tbackground: url(\"icons/debug.svg\") center center no-repeat;\n\t}\n\n\t#tmenu .icon-preview {\n\t\tbackground: url(\"icons/preview.svg\") center center no-repeat;\n\t}\n\n\t#tmenu .profile button {\n\t\twidth: 40px;\n\t\tmargin: 0 0 -2px;\n\t\tpadding-right: 12px;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-indent: 28px; /* 16px width + 12px padding */\n\t\tbackground: url(\"icons/profile.svg\") center center no-repeat;\n\t\tbackground-size: 18px;\n\t}\n\n\t#main .content {\n\t\tmargin: 15px 10px;\n\t}\n\n\t#main_headline {\n\t\tmargin: 13px 0;\n\t\tpadding: 0 11px;\n\t}\n\n\tdiv.tl_tbox, div.tl_box {\n\t\tposition: relative;\n\t}\n\n\t.tl_content_left {\n\t\twidth: 100%;\n\t\tfloat: none;\n\t}\n\n\t.showColumns th, .showColumns td {\n\t\tdisplay: block;\n\t}\n\n\t.showColumns th:empty {\n\t\tdisplay: none;\n\t}\n\n\t.tl_label {\n\t\twhite-space: normal;\n\t}\n\n\t.list_view .tl_listing img.theme_preview {\n\t\tdisplay: none;\n\t}\n\n\t.tl_filter {\n\t\tbox-sizing: border-box;\n\t\tpadding: 0 3px 0 7px;\n\t}\n\n\t.tl_filter strong {\n\t\tdisplay: none;\n\t}\n\n\t.tl_filter .tl_select {\n\t\tdisplay: block;\n\t\tmax-width: 100%;\n\t}\n\n\t.tl_search {\n\t\twidth: 76%;\n\t\tmax-width: 283px;\n\t}\n\n\t.tl_search .tl_select {\n\t\twidth: 36%;\n\t}\n\n\t.tl_search .tl_text {\n\t\twidth: 26%;\n\t}\n\n\t.tl_sorting {\n\t\twidth: 60%;\n\t\tmax-width: 212px;\n\t}\n\n\t.tl_limit {\n\t\twidth: 50%;\n\t\tmax-width: 177px;\n\t}\n\n\t.tl_submit_panel {\n\t\tfloat: right;\n\t\tz-index: 1;\n\t}\n\n\tinput.tl_submit {\n\t\tmargin-top: 3px;\n\t\tmargin-bottom: 3px;\n\t\tpadding-left: 6px !important;\n\t\tpadding-right: 7px !important;\n\t}\n\n\t.tl_listing .tl_left, .tl_show td {\n\t\tword-break: break-word;\n\t}\n\n\t#tl_breadcrumb li {\n\t\tpadding: 3px;\n\t}\n\n\t#tl_versions {\n\t\tdisplay: none;\n\t}\n\n\t.tl_version_panel .tl_select {\n\t\twidth: 44%;\n\t}\n\n\t.tl_modulewizard td:first-child {\n\t\twidth: 1%;\n\t}\n\n\t.tl_modulewizard td:first-child .tl_select {\n\t\tmax-width: 52vw;\n\t}\n\n\t#paste_hint, .sort_hint {\n\t\tdisplay: none;\n\t}\n\n\t#tl_maintenance_cache table {\n\t\twidth: 100%;\n\t}\n\n\t#tl_maintenance_cache tr th:last-child, #tl_maintenance_cache tr td:last-child {\n\t\tdisplay: none;\n\t}\n\n\t.tl_file_list .ellipsis {\n\t\tpadding-right: 10px;\n\t}\n\n\t.tl_undo_header {\n\t\tgrid-template-columns:2fr 3fr;\n\t}\n\n\t.tl_undo_header div:not(.tstamp):not(.source) {\n\t\tdisplay: none;\n\t}\n}\n\n/* Phones */\n@media (max-width: 599px) {\n\t.tl_metawizard label {\n\t\twidth: auto;\n\t\tfloat: none;\n\t\tfont-size: .9em;\n\t\tdisplay: block;\n\t\tmargin-top: 3px;\n\t}\n\n\t.tl_metawizard .tl_text {\n\t\twidth: 100%;\n\t}\n}\n\n@media (max-width: 479px) {\n\t.tl_modulewizard td:first-child .tl_select {\n\t\tmax-width: 48vw;\n\t}\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/contao/themes/flexible/backend.49ffe8ed.css b/contao/themes/flexible/backend.509d1d15.css similarity index 55% rename from contao/themes/flexible/backend.49ffe8ed.css rename to contao/themes/flexible/backend.509d1d15.css index a951352649..0cef731335 100644 --- a/contao/themes/flexible/backend.49ffe8ed.css +++ b/contao/themes/flexible/backend.509d1d15.css @@ -1,2 +1,2 @@ -@font-face{font-family:Architects Daughter;font-style:normal;font-weight:400;src:local("Architects Daughter"),url(fonts/architects-daughter-v6-latin-regular.woff2) format("woff2"),url(fonts/architects-daughter-v6-latin-regular.woff) format("woff")}:root{--text:#222;--body-bg:#eaeaec;--content-bg:#fff;--content-border:#cacacc;--black:#000;--white:#fff;--gray:#999;--green:#589b0e;--red:#c33;--blue:#006494;--orange:#f90;--contao:#f47c00;--border:#eaeaec;--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:#f7f7f8;--table-odd:#fff;--table-even:#fbfbfc;--table-nb-header:#f2f2f3;--table-nb-odd:#fff;--table-nb-even:#f7f7f8;--panel-bg:#f3f3f5;--tree-header:#f3f3f5;--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:#ffe8e5;--diff-del:#ffc1bf;--diff-right:#e0ffe8;--diff-ins:#abf2bc;--code-bg:#f0f0f0;--checkerbox-bg:#ddd;--info:grey;--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]{--text:#ddd;--body-bg:#121416;--content-bg:#1b1d21;--content-border:#414448;--black:#fff;--white:#000;--blue:#0073a8;--orange:#d68c23;--contao:#f47c00;--border:#303236;--nav-bg:#1b1d21;--nav-hover-bg:#1b325f;--nav-current:#272a30;--nav-separator:#3f3f3f;--hover-row:#1b325f;--header-bg:#292c32;--header-bg-hover:#202327;--header-text:#ddd;--invert-bg:#8f96a3;--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:#272a30;--tree-header:#272a30;--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,.17);--diff-del:rgba(248,81,73,.4);--diff-right:rgba(46,160,67,.17);--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;color-scheme:dark}.color-scheme--dark,html[data-color-scheme=dark] .color-scheme--light{display:none}.color-scheme--light,html[data-color-scheme=dark] .color-scheme--dark{display:initial}html{-webkit-text-size-adjust:100%;font-size:100%}article,aside,figcaption,figure,footer,header,main,nav,section{display:block}blockquote,body,dl,figure,h1,h2,h3,h4,p{margin:0}img{border:0}table{border-collapse:collapse;border-spacing:0;empty-cells:show}td,th{text-align:left}.tl_select,a.tl_submit,img,input,label,select{vertical-align:middle}button{cursor:pointer}button[disabled]{cursor:default}nav li,nav ul{list-style:none;margin:0;padding:0}body{color:var(--text);font-family:-apple-system,system-ui,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:.875rem;font-weight:400;line-height:1}b,h1,h2,h3,h4,h5,h6,strong,th{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body{font-weight:300}b,h1,h2,h3,h4,h5,h6,strong,th{font-weight:500}}.tl_textarea.monospace,code,pre{font:300 .75rem/1.25 SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}h1,h2,h3,h4,h5,h6{font-size:1rem}button,input,select,textarea{color:inherit;font: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:active,a:hover{color:var(--contao)}hr{background:var(--border);border:0;color:var(--border);height:1px;margin:18px 0}p{margin-bottom:1em;padding:0}.hidden{display:none!important}.unselectable{-webkit-touch-callout:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}table.with-border td,table.with-border th{border:solid var(--border);border-width:1px 0}table.with-border th{background-color:var(--table-header)}table.with-padding td,table.with-padding th{padding:6px}table.with-zebra th{background-color:var(--table-nb-header)}table.with-zebra tbody tr:nth-child(odd) td{background-color:var(--table-nb-odd)}table.with-zebra tbody tr:nth-child(2n) td{background-color:var(--table-nb-even)}.clear{clear:both;font-size:.1px;height:.1px;line-height:.1px}.cf:after,.cf:before{content:" ";display:table}.cf:after{clear:both}.invisible{clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.widget{font-size:0;margin-left:15px;margin-right:15px;position:relative}.widget *{font-size:.875rem}.widget>div{font-size:0}.widget>div>*{font-size:.875rem}.widget code,.widget pre{font-size:.7rem}.widget h3{min-height:16px}.widget h3 img{margin-right:3px}.widget legend{padding:0}.widget legend img{vertical-align:-1px}.widget-captcha{display:initial!important}.widget p.info{background:var(--panel-bg);border-radius:3px;line-height:1.3;margin:2px 0;padding:7px}.widget picture{display:contents}optgroup{background:var(--form-bg);font-style:normal;padding-bottom:3px;padding-top:3px}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.tl_checkbox_container button{vertical-align:middle}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_text_interval,.tl_text_trbl,.tl_text_unit,.tl_textarea{-moz-appearance:none;-webkit-appearance:none;background-color:var(--form-bg);border:1px solid var(--form-border);border-radius:2px;box-sizing:border-box;height:30px;margin:3px 0;padding:5px 6px 6px}.tl_text[disabled],.tl_text_2[disabled],.tl_text_3[disabled],.tl_text_4[disabled],.tl_text_interval[disabled],.tl_text_trbl[disabled],.tl_text_unit[disabled],.tl_textarea[disabled]{background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled);color:var(--form-text-disabled);cursor:not-allowed}.tl_text[readonly],.tl_text_2[readonly],.tl_text_3[readonly],.tl_text_4[readonly],.tl_text_interval[readonly],.tl_text_trbl[readonly],.tl_text_unit[readonly],.tl_textarea[readonly]{background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled)}.tl_textarea{height:240px;line-height:1.45;padding:4px 6px}.tl_text_2,.tl_text_3,.tl_text_4,.tl_text_interval,.tl_text_trbl,.tl_text_unit{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-bottom:1px;padding-top:0}input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM3NzciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE5IDYuNDEgMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiLz48L3N2Zz4=");height:14px;margin-right:0;width:14px}@-moz-document url-prefix(){.tl_text::placeholder,.tl_text_2::placeholder,.tl_text_3::placeholder,.tl_text_4::placeholder,.tl_text_interval::placeholder,.tl_text_trbl::placeholder,.tl_text_unit::placeholder,.tl_textarea::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_text_interval::placeholder,.tl_text_trbl::placeholder,.tl_text_unit::placeholder,.tl_textarea::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_text_interval,.tl_text_trbl,.tl_text_unit,.tl_textarea{padding:4px 6px 5px}}select{-moz-appearance:none;-webkit-appearance:none;text-transform:none}select::-ms-expand{display:none}select[multiple]{height:auto}.tl_mselect,.tl_select,.tl_select_column{width:100%}.tl_select_unit{width:20%}.tl_select_interval{width:50%}.tl_mselect,.tl_select,.tl_select_column,.tl_select_interval,.tl_select_unit{background:var(--form-bg) url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDUwMCA1MDAiPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjEzMS41MjMiIHgyPSIzNjguNDc4IiB5MT0iNDIuNjMiIHkyPSIyNzkuNTg0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjYjNiM2IzIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOTk5Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBmaWxsPSJ1cmwoI2EpIiBkPSJNMjUwIDM5Ni42NjZjLTEuMTU1IDAtNC4xMS0xLjgzMi03LjExMy02Ljc1bC0xNjkuNi0yNzcuNDU1Yy0yLjUxNy00LjExNC0zLjE5LTYuOTgtMy4yOC04LjMxNC44MjctLjMzIDIuNTY1LS44MTIgNS42MjctLjgxMmgzNDguNzMzYzMuMDYzIDAgNC43OTguNDgyIDUuNjI3LjgxMi0uMDkgMS4zMzQtLjc2NiA0LjItMy4yOCA4LjMxNWwtMTY5LjYgMjc3LjQ1N2MtMy4wMDUgNC45MTctNS45NiA2Ljc1LTcuMTE0IDYuNzV6Ii8+PC9zdmc+") right -16px top 3px no-repeat;background-origin:content-box;border:1px solid var(--form-border);border-radius:2px;box-sizing:border-box;cursor:pointer;height:30px;margin:3px 0;padding:5px 22px 6px 6px}.tl_mselect[disabled],.tl_mselect[readonly],.tl_select[disabled],.tl_select[readonly],.tl_select_column[disabled],.tl_select_column[readonly],.tl_select_interval[disabled],.tl_select_interval[readonly],.tl_select_unit[disabled],.tl_select_unit[readonly]{background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled);color:var(--form-text-disabled);cursor:not-allowed}.tl_mselect[multiple],.tl_select[multiple],.tl_select_column[multiple],.tl_select_interval[multiple],.tl_select_unit[multiple]{background-image:none}@supports (display:-ms-grid){.tl_mselect,.tl_select,.tl_select_column,.tl_select_interval,.tl_select_unit{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{font-weight:600;margin-left:4px;margin-right:3px}@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{font-weight:600;margin-top:3px}@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{margin-right:2px;position:relative;top:-1px}.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}.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{background:var(--form-button);border:1px solid var(--form-border);border-radius:2px;box-sizing:border-box;cursor:pointer;height:30px;padding:7px 12px;transition:background .2s ease}.tl_submit:hover{background-color:var(--form-button-hover);color:inherit}.tl_submit:active{color:var(--form-button-active)}.tl_submit:disabled{background:var(--form-button-disabled)!important;color:var(--gray);cursor:not-allowed}.tl_formbody_submit .tl_submit,.tl_panel .tl_submit,.tl_version_panel .tl_submit{background:var(--form-bg)}.tl_formbody_submit .tl_submit:hover,.tl_panel .tl_submit:hover,.tl_version_panel .tl_submit:hover{background:var(--form-bg-hover)}.split-button,a.tl_submit{display:inline-block}.split-button{position:relative;z-index:1}.split-button li,.split-button ul{list-style:none;margin:0;padding:0}::-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}.w25,.w33,.w50,.w66,.w75{float:left;min-height:80px;width:calc(50% - 30px)}.nogrid .w25,.nogrid .w33,.nogrid .w50,.nogrid .w66,.nogrid .w75{float:none}.long{width:calc(100% - 30px)}.wizard>a{position:relative;top:-2px;vertical-align:middle}.wizard>.image-button{background:none;border:0;padding:0;vertical-align:middle}.wizard .tl_image_size,.wizard .tl_select,.wizard .tl_text{width:calc(100% - 24px)}.wizard .tl_text_2{width:45%}.wizard .tl_image_size{display:inline-block}.wizard img{margin-left:4px}.wizard h3 img{margin-left:0}.long .tl_select,.long .tl_text{width:100%}.m12{margin:0 15px;padding:18px 0 16px}.nogrid .m12{padding:0}.cbx{min-height:46px}.cbx.m12{box-sizing:border-box;min-height:80px}.nogrid .cbx{min-height:32px}.subpal{clear:both}.inline div{display:inline}.autoheight{height:auto}.tl_tip{cursor:help;height:15px;overflow:hidden}.tip{background:var(--invert-bg);border-radius:2px;max-width:320px;padding:6px 9px;position:relative;z-index:99}.tip div{line-height:1.3}.tip a,.tip div,.tip span{color:var(--invert-text)}.tip:before{border-bottom:7px solid var(--invert-bg);border-left:7px solid transparent;border-right:7px solid transparent;content:"";height:6px;left:9px;position:absolute;top:-13px}.tip--rtl:before{left:auto;right:9px}.hover-div:hover,.hover-div:hover .limit_toggler,.hover-row:hover .limit_toggler,.hover-row:hover td{background-color:var(--hover-row)!important}.badge-title{background:var(--invert-bg);border-radius:8px;color:var(--invert-text);float:right;font-size:.75rem;font-weight:600;margin-left:8px;margin-top:-8px;padding:2px 5px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.badge-title{font-weight:500}}@media (min-width:1280px){.w25{width:calc(25% - 30px)}.w33{width:calc(33.3333% - 30px)}.w66{width:calc(66.6666% - 30px)}.w75{width:calc(75% - 30px)}#sbtog{display:none}.split-button ul{clip:auto;display:inline-flex;height:auto;margin:0 0 0 -4px;overflow:initial;position:static;width:auto}.split-button li{margin-left:4px}}@media (max-width:1279px){.split-button{display:inline-flex}.split-button ul{background:var(--form-bg);border:1px solid var(--form-border);border-radius:2px;bottom:20px;box-sizing:border-box;margin-bottom:1em;min-width:100%;padding:3px 0;position:absolute;right:0}.split-button ul button{border:0;text-align:left;white-space:nowrap;width:100%}.split-button ul .tl_submit{background:var(--form-bg);margin-bottom:0;margin-top:0}.split-button ul .tl_submit:hover{background:var(--form-button-hover)}.split-button ul:before{border:6px inset transparent;border-top:6px solid var(--form-bg);bottom:-12px;right:4px;z-index:89}.split-button ul:after,.split-button ul:before{content:"";display:block;height:0;position:absolute;width:0}.split-button ul:after{border:7px inset transparent;border-top:7px solid var(--form-border);bottom:-14px;right:3px;z-index:88}.split-button>button[type=submit]{border-radius:2px 0 0 2px;position:relative}.split-button>button[type=button]{background:var(--form-bg);border:1px solid var(--form-border);border-left:0;border-radius:0 2px 2px 0;box-sizing:border-box;height:30px;margin:2px 0;padding:7px 4px;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:none}}@media (max-width:767px){.w25,.w33,.w50,.w66,.w75{float:none;width:calc(100% - 30px)}.m12{padding-bottom:0;padding-top:0}.cbx,.cbx.m12{min-height:auto}.tip{max-width:80vw}.tl_checkbox_container .tl_checkbox{margin-bottom:1px;margin-top:1px}}: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-logout:url(icons/exit.svg);--icon-toggle-all:url(icons/chevron-right.svg);--icon-alert:url(icons/alert.svg);--icon-favorite:url(icons/favorite.svg);--icon-favorite--active:url(icons/favorite_active.svg);--icon-manual:url(icons/manual.svg);--icon-color-scheme:url(icons/color_scheme.svg);--icon-arrow-left:url(icons/arrow_left.svg);--icon-arrow-right:url(icons/arrow_right.svg);--icon-visible:url(icons/visible.svg);--icon-invisible:url(icons/invisible.svg);--icon-loading:url(icons/loading.svg)}html[data-color-scheme=dark]{--icon-logo:url(icons/logo--dark.svg);--icon-profile:url(icons/profile_small--dark.svg);--icon-security:url(icons/shield_small--dark.svg);--icon-favorites:url(icons/favorites_small--dark.svg);--icon-logout:url(icons/exit--dark.svg);--icon-toggle-all:url(icons/chevron-right--dark.svg);--icon-alert:url(icons/alert--dark.svg);--icon-favorite:url(icons/favorite--dark.svg);--icon-favorite--active:url(icons/favorite_active--dark.svg);--icon-manual:url(icons/manual--dark.svg);--icon-color-scheme:url(icons/color_scheme--dark.svg);--icon-arrow-left:url(icons/arrow_left--dark.svg);--icon-arrow-right:url(icons/arrow_right--dark.svg);--icon-visible:url(icons/visible--dark.svg);--icon-invisible:url(icons/invisible--dark.svg);--icon-loading:url(icons/loading--dark.svg)}html{scroll-behavior:smooth;scroll-padding-top:36px}@media screen and (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}body{background:var(--body-bg);overflow-y:scroll}body.popup{background:var(--content-bg)}#header{background:var(--header-bg);min-height:40px;text-align:left}#header h1{position:absolute}#header h1 a{background:var(--icon-logo) no-repeat 10px center;display:block;font-weight:400;height:16px;padding:12px 12px 12px 42px}#header h1 a .app-title{color:var(--header-text);font-size:17px}@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 .profile button,#tmenu a{display:inline-block;margin:0;padding:13px 12px}#tmenu sup{background:var(--header-text);border-radius:2px;color:var(--header-bg);font-size:.6rem;font-weight:400;left:20px;padding:2px;position:absolute;text-indent:0;top:5px}#tmenu .burger{display:none}#tmenu .burger button{background:none;border:0;padding:8px 10px 9px}#tmenu .burger svg{margin-bottom:-1px;vertical-align:middle}#tmenu .profile button{background:url(icons/chevron-down.svg) right 9px top 14px no-repeat;border:none;cursor:pointer;font-size:.875rem;font-weight:400;padding-right:26px;position:relative}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tmenu .profile button{font-weight:300}}#tmenu .burger button,#tmenu .profile button,#tmenu a{color:var(--header-text);transition:background-color .3s ease}#tmenu .active .profile button,#tmenu .burger button:hover,#tmenu a.hover,#tmenu a:hover,#tmenu li:hover .profile button{background-color:var(--header-bg-hover)}#tmenu ul.menu_level_1{background:var(--content-bg);border:1px solid var(--content-border);box-shadow:0 1px 6px rgba(0,0,0,.2);color:var(--text);margin-top:5px;min-width:150px;opacity:0;position:absolute;right:6px;text-align:left;transition:opacity .3s ease,visibility .3s ease;visibility:hidden;z-index:4}#tmenu .active ul.menu_level_1{opacity:1;visibility:visible}#tmenu ul.menu_level_1 li a{color:inherit;display:block;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{border-bottom:1px solid var(--border);color:var(--info);line-height:1.4;margin-bottom:9px;padding:15px 20px;white-space:nowrap}#tmenu ul.menu_level_1 strong{color:var(--text);display:block}#tmenu ul.menu_level_1:before{border:7px solid transparent;border-bottom:7px solid var(--content-bg);content:"";display:block;height:0;position:absolute;right:9px;top:-14px;width:0}#tmenu ul.menu_level_1:after{border-right:1px solid var(--content-border);border-top:1px solid var(--content-border);content:"";display:block;height:9px;position:absolute;right:11px;top:-6px;transform:rotate(-45deg);width:9px}#tmenu ul.menu_level_1 .logout{border-top:1px solid var(--border);margin-top:9px;padding:6px 0}#tmenu .icon-alert,#tmenu .icon-color-scheme,#tmenu .icon-favorite,#tmenu .icon-manual{margin-bottom:-2px;overflow:hidden;position:relative;text-indent:28px;white-space:nowrap;width:16px}#tmenu .icon-alert{background:var(--icon-alert) center center no-repeat}#tmenu .icon-favorite{background:var(--icon-favorite) center center no-repeat}#tmenu .icon-favorite--active{background:var(--icon-favorite--active) center center no-repeat}#tmenu .icon-manual{background:var(--icon-manual) center center no-repeat}#tmenu .icon-color-scheme{background:var(--icon-color-scheme) center 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{max-width:none;min-height:0;padding:0;width:auto}#left{background:var(--nav-bg);display:flex;flex-direction:column;width:220px}#left .version{font-size:.75rem;line-height:1.4;margin-top:4em;padding:15px 18px}#left .version,#left .version a{color:var(--nav-group)}#main{display:flex;flex-direction:column;width:calc(100% - 220px)}.popup #main{border:0;display:initial;float:none;margin:0;max-width:none;padding:0;width:auto}#main .content{background:var(--content-bg);border:1px solid var(--content-border);margin:0 15px 15px}.popup #main .content{border:0;margin:0}#tl_navigation{flex-grow:1}#tl_navigation .menu_level_0{padding-top:20px}#tl_navigation .menu_level_0>li:after{background:var(--nav-separator);content:"";display:block;height:1px;margin:15px auto;width:calc(100% - 30px)}#tl_navigation .menu_level_0>li.last:after{display:none}#tl_navigation .menu_level_0 a[class^=group-]{color:var(--nav-group);display:block;font-size:.75rem;font-weight:500;margin:0 15px;padding:3px 3px 3px 22px;text-transform:uppercase}@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{color:var(--nav);display:block;font-weight:400;padding:5px 33px 5px 37px;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{background-color:var(--nav-current);color:var(--nav-hover)}#tl_navigation .collapsed .menu_level_1{display:none}#tl_buttons{margin:0;padding:9px 15px;text-align:right}.toggleWrap{cursor:pointer}.opacity{-moz-opacity:.8;opacity:.8}#main_headline{display:flex;font-size:1.1rem;margin:18px 16px}.popup #main_headline{display:none}#main_headline span{display:inline-block;flex:1 0 0;line-height:22px;max-width:max-content;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#main_headline span:nth-child(2n){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(2n){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{background:url(icons/error.svg) no-repeat 0;margin:12px;padding:3px 0 3px 22px}.tl_confirm,.tl_error,.tl_info,.tl_new{line-height:1.3;margin:0 0 1px;padding:11px 18px 11px 32px}.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_error,.tl_error a,.tl_gerror,.tl_gerror a{color:var(--red)}.tl_error a,.tl_gerror 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_confirm,.widget .tl_error,.widget .tl_info,.widget .tl_new{background-position:9px 9px;padding:8px 10px 8px 30px}.tl_confirm strong,.tl_error strong,.tl_info strong,.tl_new strong{color:inherit}.tl_panel,.tl_version_panel{background:var(--panel-bg);border-bottom:1px solid var(--content-border);padding:4px 12px;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_submit{vertical-align:middle}.tl_img_submit,.tl_version_panel .tl_formbody{position:relative}.tl_img_submit{border:0;cursor:pointer;height:16px;margin:0;overflow:hidden;padding:0;text-indent:16px;top:9px;white-space:nowrap;width:16px}.filter_apply{background:url(icons/filter-apply.svg) 50% no-repeat}.filter_reset{background:url(icons/filter-reset.svg) 50% no-repeat}.tl_subpanel{float:right;letter-spacing:-.31em}.tl_subpanel *{letter-spacing:normal}.tl_search span,.tl_subpanel strong{vertical-align:middle}.tl_submit_panel{min-width:32px;padding-left:6px;padding-right:3px}#search .active,.tl_panel .active,.tl_panel_bottom .active{background-color:var(--active-bg)}.tl_filter{width:100%}.tl_filter .tl_select{margin-left:3px;max-width:14.65%}.tl_submit_panel+.tl_filter{width:86%}.tl_limit{width:22%}.tl_limit .tl_select{margin-left:3px;width:52%}.tl_search{width:40%}.tl_search .tl_select{margin-left:3px;margin-right:1%;width:38%}.tl_search .tl_text{-webkit-appearance:textfield;box-sizing:content-box;margin-left:1%;width:30%}.tl_sorting{width:26%}.tl_sorting .tl_select{margin-left:1%;width:60%}.jump-targets{background:var(--panel-bg);border-bottom:1px solid var(--content-border);min-height:30px;padding-top:1px;position:sticky;top:0;z-index:3}.jump-targets .inner{overflow-x:scroll;scrollbar-width:none}.jump-targets .inner::-webkit-scrollbar{display:none}.jump-targets ul{list-style:none;margin:0;padding:0;white-space:nowrap}.jump-targets li{display:inline-block;font-size:.75rem;padding:9px 10px;white-space:nowrap}.jump-targets button{background:none;border:none;padding:0}.jump-targets:after,.jump-targets:before{content:"";display:block;height:100%;position:absolute;top:0;width:10px}.jump-targets:before{background:linear-gradient(-90deg,transparent 0,var(--panel-bg) 50%)}.jump-targets:after{background:linear-gradient(90deg,transparent 0,var(--panel-bg) 50%);right:0}.tl_xpl{padding:0 18px}.tl_box,.tl_tbox{border-bottom:1px solid var(--border);padding:12px 0 25px}.tl_box:last-child,.tl_tbox:last-child{border-bottom:0}.tl_box h3,.tl_tbox h3,.tl_xpl h3{font-size:.875rem;height:16px;margin:0;padding-top:13px}.tl_box h4,.tl_tbox h4{font-size:.875rem;margin:6px 0 0;padding:0}.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{color:var(--info);line-height:1.2;margin-bottom:0}.tl_help a:active,.tl_help a:focus,.tl_help a:hover{text-decoration:underline}#tl_buttons+.tl_edit_form .tl_formbody_edit{border-top:1px solid var(--border)}.tl_formbody_submit{border-top:1px solid var(--content-border);bottom:0;position:sticky;z-index:3}.tl_submit_container{background:var(--panel-bg);padding:8px 12px}.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 .tl_tbox{border:0!important;padding:6px 15px 14px}.maintenance_inactive .tl_message{margin:0 15px 3px}.maintenance_inactive h2.sub_headline{margin:16px 15px 3px}.maintenance_inactive .tl_submit_container{background:none;border:0;padding:0 15px 24px}@keyframes crawl-progress-bar-stripes{0%{background-position-x:1rem}}#tl_crawl .tl_message{margin-bottom:24px}#tl_crawl .tl_message>p{background-color:transparent;background-position-y:center;padding-bottom:0;padding-top:0}#tl_crawl .tl_tbox{margin-top:0;padding-left:0;padding-right:0;padding-top:0}#tl_crawl .tl_checkbox_container{margin-top:6px}#tl_crawl .inner{margin:0 18px 18px;position:relative}#tl_crawl .progress{background-color:var(--tree-header);border-radius:2px;display:flex;height:20px}#tl_crawl .progress-bar{background-size:10px 10px;color:#fff;display:flex;flex-direction:column;justify-content:center;text-align:center;white-space:nowrap}#tl_crawl .progress-bar.running{animation:crawl-progress-bar-stripes 1s linear infinite;background-color:var(--progress-running);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}#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 .crawl-hint{line-height:1.3;margin-top:-2px}#tl_crawl .crawl-hint a{text-decoration:underline}#tl_crawl .subscriber-log{display:none;margin-bottom:0;padding:5px 0}#tl_crawl .wait{color:var(--gray);margin-top:9px}#tl_crawl .debug-log{display:none;margin-top:11px}#tl_crawl .results.finished .show-when-running,#tl_crawl .results.running .show-when-finished{display:none}#tl_crawl .results.finished .show-when-finished,#tl_crawl .results.running .show-when-running{display:block}#tl_crawl .result .summary.success{color:var(--green)}#tl_crawl .result .summary.failure{color:var(--red)}#tl_crawl .result .warning{color:var(--blue);display:none}.two-factor{border-top:1px solid var(--border);padding-bottom:9px}.two-factor h2.sub_headline{margin:18px 15px 3px}.two-factor>p{line-height:1.3;margin:0 15px 12px}.two-factor li{list-style:initial;margin-left:2em}.two-factor .qr-code{margin:0 15px}.two-factor .qr-code img{border:3px solid #fff}.two-factor .tl_listing_container{margin-top:6px}.two-factor .widget{height:auto;margin:15px 15px 12px}.two-factor .widget .tl_error{background:none;font-size:.75rem;line-height:1.25;margin:0;padding:1px 0}.two-factor .tl_submit_container{background:none;border:0;padding:0 15px 10px}.two-factor .submit_container{clear:both;margin:0 15px 12px}.two-factor .tl_message{margin:0 15px 12px}.two-factor .tl_message>p{background-color:transparent;background-position:3px;padding:0 3px 0 27px}.two-factor .tl_backup_codes>p,.two-factor .tl_trusted_devices>p{line-height:1.3;margin:0 15px 12px}.two-factor .backup-codes{display:grid;grid-template-columns:repeat(2,1fr);margin:15px 15px 24px;max-width:224px;padding:0}.two-factor .backup-codes li{list-style:none;margin:0}.two-factor .tl_trusted_devices td,.two-factor .tl_trusted_devices th{line-height:16px}#search{margin:18px 18px -9px;text-align:right}#search .tl_text{-webkit-appearance:textfield;box-sizing:content-box;max-width:160px}.tl_edit_preview{margin-top:18px}.tl_edit_preview img{background:var(--white);border:1px solid var(--content-border);height:auto;max-width:100%;padding:2px}.tl_edit_preview_enabled{cursor:crosshair;display:inline-block;position:relative}.tl_edit_preview_important_part{border:1px solid var(--black);box-shadow:0 0 0 1px var(--white),inset 0 0 0 1px var(--white);margin:-1px;opacity:.5;position:absolute}table.tl_listing{width:100%}.tl_listing_container{margin:18px 0;padding:0 15px}#tl_buttons+.tl_form .tl_listing_container,#tl_buttons+.tl_listing_container{margin-top:12px}#paste_hint+.tl_listing_container{margin-top:36px}.tl_folder_list,.tl_folder_tlist{background:var(--table-header);border-bottom:1px solid var(--border);font-weight:600;padding:6px}@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);line-height:16px}.tl_file,.tl_file_list{background:var(--content-bg);border-bottom:1px solid var(--border);padding:5px 6px;position:relative}.tl_file_list .ellipsis{height:16px;overflow:hidden;padding-right:18px;text-overflow:ellipsis;word-break:break-all}.tl_right_nowrap{padding:6px;text-align:right;vertical-align:top;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,.tl_listing_container.picker .tl_content_header{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-left:8px;margin-top:2px}.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{margin:18px 2%;padding:9px 0 18px;width:96%}.tl_show+.tl_show{margin-top:36px}.tl_show td,.tl_show th{line-height:16px;white-space:pre-line}.tl_show td:first-child{white-space:normal;width:34%}.tl_show td p:last-of-type{margin-bottom:0}.tl_show small{color:var(--info);display:block}.tl_label{font-weight:600;margin-right:12px;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}.tl_radio_reset,.tl_select_trigger{padding:0 6px 3px 0;text-align:right}.tl_radio_reset{margin-top:6px}.tl_radio_label,.tl_select_label{color:var(--gray);font-size:.75rem;margin-right:2px}.tl_header{background:var(--table-header);margin-bottom:18px;padding:10px}.tl_header_table{line-height:1.3}.tl_content_header{background:var(--table-header);border-bottom:1px solid var(--border);font-weight:600;padding:7px 6px}.tl_header+.tl_content_header{border-top:1px solid var(--border)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_content_header{font-weight:500}}.as-grid .tl_content_header{background-color:transparent;border:0;font-size:1rem;margin-top:24px;padding:0 1px}.tl_content{border-bottom:1px solid var(--border);position:relative}.tl_content .inside{background-color:var(--content-bg);padding:6px}.tl_content.draft .inside{min-height:16px}.hover-row.draft>td,.tl_content.draft>*,.tl_file.draft>*,.tl_folder.draft>*{opacity:.5}.as-grid .tl_content{background-color:var(--content-bg);border:1px solid var(--border);margin-top:18px;padding:0}.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{list-style:none;margin:0;padding:0}.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{background:var(--nested-bg);border-width:0 1px;margin:0;padding:15px 15px 0}.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{float:right;margin-bottom:-1px;margin-left:12px;position:relative;text-align:right;z-index:1}.as-grid .tl_content .tl_content_right{background:var(--table-header);border-left:1px solid var(--border);float:none;margin-bottom:0;margin-left:0;order:2;padding:8px 10px}.tl_content_right button,.tl_right button{background:none;border:0;height:16px;margin:0;padding:0}.cte_type{color:var(--info);font-size:.75rem;line-height:16px;margin:0 0 4px}.as-grid .cte_type{background-color:var(--table-header);font-size:.8rem;margin-bottom:0;order:1;padding:8px 10px}.cte_type.published,.cte_type.published a{color:var(--green)}.cte_type.unpublished,.cte_type.unpublished a{color:var(--red)}.cte_type.icon-protected{background:var(--table-header) url(icons/protected.svg) 8px center no-repeat;padding-left:27px}.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}.content-hyperlink,.content-toplink,.cte_preview div.tl_gray,.cte_preview figure,.cte_preview ol,.cte_preview p,.cte_preview table,.cte_preview table caption,.cte_preview ul{margin-bottom:6px}.cte_preview img{height:auto;max-width:320px;padding:6px 0}.cte_preview td,.cte_preview th{border-bottom:1px solid var(--border);padding:3px 6px}.cte_preview th{background:var(--table-header);padding:6px}.cte_preview td{background:var(--content-bg)}.cte_preview table caption{font-size:.75rem;text-align:left}.cte_preview pre{margin-bottom:6px;margin-top:0;white-space:pre-wrap;word-break:break-all}.cte_preview pre.disabled{color:var(--pre-disabled)}.cte_preview .content-gallery ul{display:grid;grid-template-columns:1fr 1fr 1fr;list-style:none;margin:0;padding:0}.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 button,.cte_preview input,.cte_preview select,.cte_preview textarea{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 .checkbox_container legend,.cte_preview .radio_container legend,.cte_preview label{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{border-top:1px solid var(--border);grid-column:1/span 2;order:3;padding:10px 10px 6px}.limit_height{overflow:hidden}.limit_toggler{background:var(--content-bg);bottom:0;left:0;line-height:11px;position:absolute;text-align:center;width:100%}.limit_toggler button{background:var(--content-bg);border:0;border-top-left-radius:2px;border-top-right-radius:2px;color:var(--gray);line-height:8px;margin:0;padding:0;width:24px}.limit_toggler button span{position:relative;top:-4px;z-index:1}.tl_folder_top{background:var(--tree-header);border:solid var(--tree-header-border);border-width:1px 0;padding:5px 6px}.tl_folder{background:var(--table-header);border-bottom:1px solid var(--border);padding:5px 6px}.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{box-sizing:border-box;flex-grow:1;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tl_listing .tl_left.tl_left_dragging{background:var(--drag-bg);border-radius:10px;color:var(--text);margin-left:0;padding:5px 10px!important;position:absolute;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 .tl_gray,.tl_listing .tl_left.tl_left_dragging a{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-bottom:5px;padding-top:5px}.tl_tree_xtnd .tl_file .tl_left img{margin-right:2px}.tl_file_manager .preview-image{height:auto;margin:0 0 2px 22px;max-height:75px;max-width:100px;width:auto}.tl_file_manager .preview-important{height:auto;margin:0 0 2px;max-height:60px;max-width:80px;vertical-align:bottom;width:auto}.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;list-style-type:none;margin:0}.tl_listing li.parent{display:inline;padding-left:0;padding-right:0}label.tl_change_selected{color:var(--gray);font-size:.75rem;margin-right:2px}#tl_breadcrumb{background:var(--active-bg);border:1px solid var(--active-border);border-radius:2px;display:flow-root;line-height:24px;margin:0 0 12px;padding:4px 6px}#tl_breadcrumb li{float:left;list-style-type:none;margin:0;padding:0 3px}#tl_breadcrumb li a{display:inline-block}#tl_breadcrumb li img{height:16px;vertical-align:-3px;width:16px}.selector_container{margin-top:1px;position:relative}.selector_container>ul{list-style-type:none;margin:0 0 1px;padding:0}.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{height:auto;max-width:320px}.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{display:grid;gap:4px;grid-auto-rows:75px;grid-template-columns:repeat(auto-fill,100px);padding:2px 0}ul.sgallery li{-webkit-align-items:center;align-items:center;background:var(--form-button);display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;margin:0;min-height:75px;min-width:100px;padding:0}.popup #tl_soverview{margin-top:15px}#tl_soverview>div{border-bottom:1px solid var(--border);padding:5px 15px}#tl_soverview>div:last-child{border-bottom:0}#tl_messages h2,#tl_shortcuts h2{margin:14px 0 10px}#tl_versions h2{margin:14px 0 12px}#tl_messages p{margin-bottom:.5em}#tl_messages p:last-child{margin-bottom:1em}#tl_messages .tl_confirm,#tl_messages .tl_error,#tl_messages .tl_info,#tl_messages .tl_new{background-color:transparent;background-position:left 1px;padding:0 0 0 21px}#tl_shortcuts p a{text-decoration:underline}#tl_versions{margin-bottom:0}#tl_versions table{margin-bottom:18px;width:100%}#tl_versions td,#tl_versions th{padding:6px}#tl_versions th{line-height:16px}#tl_versions td:first-child{white-space:nowrap}#tl_versions td:last-child{text-align:right;white-space:nowrap;width:32px}#tl_versions .pagination{background:var(--table-header);margin-bottom:14px;margin-top:18px;padding:12px 6px}.tl_chmod{width:100%}.tl_chmod th{background:var(--tree-header);font-weight:400;height:18px;text-align:center}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_chmod th{font-weight:300}}.tl_chmod td{background:var(--table-header);text-align:center}.tl_chmod td,.tl_chmod th{border:1px solid var(--content-bg);padding:6px;width:14.2857%}.tl_checkbox_wizard button,.tl_image_size+button,.tl_key_value_wizard button,.tl_listwizard button,.tl_metawizard button,.tl_modulewizard button,.tl_optionwizard button,.tl_sectionwizard button,.tl_tablewizard button{background:none;border:0;margin:0;padding:0;vertical-align:middle}.tl_modulewizard{margin-top:2px;max-width:800px;width:100%}.tl_modulewizard td{padding:0 3px 0 0;position:relative}.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{white-space:nowrap;width:1%}.tl_modulewizard .tl_select,.tl_modulewizard .tl_select_column{margin:2px 0}.js .tl_modulewizard input.mw_enable,.tl_modulewizard input.mw_enable+button{display:none}.js .tl_modulewizard input.mw_enable+button{background:var(--icon-invisible) 0 0 no-repeat;display:inline;height:16px;width:16px}.js .tl_modulewizard input.mw_enable:checked+button{background-image:var(--icon-visible)}.tl_modulewizard img.mw_enable{display:none}.js .tl_modulewizard img.mw_enable{display:inline;margin-right:1px}.tl_optionwizard{max-width:600px;width:100%}.tl_key_value_wizard{max-width:450px;width:100%}.tl_key_value_wizard,.tl_optionwizard{margin-top:2px}.tl_key_value_wizard label,.tl_optionwizard label{margin-right:3px}.tl_key_value_wizard td,.tl_optionwizard td{padding:0 3px 0 0}.tl_key_value_wizard th,.tl_optionwizard th{font-size:.75rem;font-weight:400;padding:0 6px 1px 0}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_key_value_wizard th,.tl_optionwizard th{font-weight:300}}.tl_key_value_wizard td:nth-child(n+3),.tl_optionwizard td:nth-child(n+3){white-space:nowrap;width:1%}.tl_optionwizard .tl_text{margin:2px 0}.tl_key_value_wizard img,.tl_optionwizard img{position:relative;top:1px}.tl_key_value_wizard .fw_checkbox,.tl_optionwizard .fw_checkbox{margin:0 1px}#ctrl_allowedAttributes{max-width:none}#ctrl_allowedAttributes td:first-child{width:100px}#tl_tablewizard{margin-top:2px;overflow:auto;padding-bottom:2px}.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_tablewizard .tl_textarea{margin:2px 0}.tl_listwizard{list-style:none;margin:1px 0;padding:0}.tl_listwizard .tl_text{margin:2px 0;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{list-style:none;margin:3px 0;padding:0}.tl_metawizard li{margin-bottom:2px;padding:9px}.tl_metawizard li:nth-child(odd){background:var(--table-header)}.tl_metawizard li:nth-child(2n){background:var(--table-even)}.tl_metawizard label{float:left;margin-top:9px;width:18%}.tl_metawizard .tl_text,.tl_metawizard .tl_textarea{float:left;margin:1px 0;width:calc(82% - 20px)}.tl_metawizard .tl_textarea{resize:vertical}.tl_metawizard .tl_text+a{margin-left:4px;position:relative;top:7px}.tl_metawizard br{clear:left}.tl_metawizard .lang{display:block;font-weight:600;margin:3px 0 9px;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;max-width:680px;width:100%}.tl_sectionwizard td{padding:0 3px 0 0;position:relative;width:25%}.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{background:var(--icon-arrow-right) bottom right no-repeat;padding:0 36px 24px 0;right:30px;top:0;transform:rotate(-1deg)}#paste_hint p,.sort_hint{color:var(--paste-hint);font-family:Architects Daughter,cursive;font-size:1rem;position:absolute}.sort_hint{background:var(--icon-arrow-left) 6px bottom no-repeat;left:160px;padding:0 6px 24px 42px;top:-50px;transform:rotate(-2deg)}.widget+.subpal .sort_hint{left:260px}.widget+.widget .sort_hint{left:320px}.serp-preview{background:var(--panel-bg);border-radius:3px;color:var(--serp-preview);font-family:Arial,sans-serif;font-weight:400;margin:2px 0;max-width:600px;padding:5px 7px}.serp-preview p{margin:0}.serp-preview .description,.serp-preview .url{line-height:18px}.serp-preview .url:not(:empty){margin-top:3px}.serp-preview .description:not(:empty){margin-bottom:3px}.serp-preview .title{color:var(--serp-preview-title);font-size:18px;margin:5px 0 4px}.serp-preview .tl_info{background-color:transparent}#tl_ajaxBox{background:var(--white) var(--icon-loading) no-repeat right 2em center;border:2px solid var(--black);border-radius:2px;box-sizing:border-box;font-size:1rem;left:50%;margin-left:-150px;padding:2em;position:absolute;text-align:left;width:300px}#tl_ajaxOverlay{background:var(--white);height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%}.ce_gallery ul{display:flow-root}.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{background:var(--form-button);border:0;border-radius:2px;cursor:pointer;font-size:22px;line-height:9px;margin:0;padding:0 0 3px;position:absolute;right:0;top:0;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:hsla(0,0%,100%,.7)}#picker-menu{border-bottom:1px solid var(--content-border);padding:9px 6px 0}#picker-menu>ul{list-style:none;margin:0;padding:0}#picker-menu li{background-color:var(--table-even);border:1px solid var(--content-border);border-radius:2px 2px 0 0;display:inline-block;padding:8px 0;position:relative;top:1px}#picker-menu li.current,#picker-menu li:hover{background-color:var(--panel-bg)}#picker-menu li.current{border-bottom-color:var(--panel-bg)}#picker-menu a{background:url(icons/manager.svg) 12px no-repeat;padding:3px 12px 3px 32px}#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 *{color:var(--text);font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important;font-size:.75rem!important}.ace-fullsize{overflow:hidden!important}.ace-fullsize .ace_editor{border:0;bottom:0;height:auto!important;left:0;margin:0;position:fixed!important;right:0;top:0;width:auto!important;z-index:10000}div.mce-edit-area{width:99.9%}time[title]{cursor:help}.float_left{float:left}.float_right{float:right}.foldable img{transform:none;transition:transform .2s ease;will-change:transform}.foldable--open img{transform:rotate(90deg)}.foldable--loading{pointer-events:none;position:relative}.foldable--loading img{visibility:hidden}.foldable--loading:after{background:var(--icon-loading) 0 0/contain no-repeat;content:"";height:14px;inset:2px auto auto 2px;position:absolute;width:14px}.header_back,.header_clipboard,.header_css_import,.header_delete_all,.header_edit_all,.header_icon,.header_new,.header_new_folder,.header_rss,.header_store,.header_sync,.header_theme_import,.header_toggle{background-color:transparent;background-position:0;background-repeat:no-repeat;border:none;display:inline-block;margin-left:15px;padding:3px 0 3px 21px}.list_icon{background-position:0;margin-left:-3px;padding-left:20px}.list_icon,.list_icon_new{background-repeat:no-repeat}.list_icon_new{background-position:1px;width:16px}.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{background-image:url(icons/newfolder.svg);padding-left:24px}.header_css_import{background-image:url(icons/cssimport.svg)}.header_theme_import{background-image:url(icons/theme_import.svg)}.header_store{background-image:url(icons/store.svg);padding-left:18px}.header_toggle{background-image:var(--icon-toggle-all)}.header_sync{background-image:url(icons/sync.svg)}#ctrl_playerSize input,.tl_imageSize_0,.tl_imageSize_1,.tl_text_trbl{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}.tl_checkbox_container.error legend,label.error,legend.error{color:var(--red)}.tl_box .tl_error,.tl_tbox .tl_error{background:none;font-size:.75rem;margin-bottom:0;padding:0}.tl_formbody_edit>.tl_error{margin-top:9px}.broken-image{background:var(--error-bg) url(icons/error.svg) no-repeat 9px center;color:var(--red);display:inline-block;padding:12px 12px 12px 30px;text-indent:0}fieldset.tl_box,fieldset.tl_tbox{border-left:0;border-right:0;border-top:none;margin-top:5px;margin-inline:0;padding-top:0}fieldset.tl_box.nolegend,fieldset.tl_tbox.nolegend{border-top:0}fieldset.tl_box>legend,fieldset.tl_tbox>legend{background:url(icons/navcol.svg) 13px 10px no-repeat;box-sizing:border-box;color:var(--legend);cursor:pointer;padding:9px 12px 9px 28px}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;padding:9px 6px}#tl_maintenance_cache td span{color:var(--gray)}#tl_maintenance_cache td:first-child{width:16px}#tl_maintenance_cache .nw{white-space:nowrap}#tl_maintenance_cache .tl_checkbox_container{margin-top:3px}#tl_maintenance_cache .tl_checkbox_container label{font-weight:600;vertical-align:initial}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tl_maintenance_cache .tl_checkbox_container label{font-weight:500}}.pagination{background:var(--panel-bg);border:solid var(--border);border-width:1px 0;display:flow-root;margin-bottom:18px;padding:12px 15px}.pagination ul{float:right;text-align:right;width:60%}.pagination p{float:left;margin-bottom:0;width:30%}.pagination li{display:inline;padding-left:3px}.pagination .active{color:var(--gray)}.pagination-lp{border-bottom:0;margin-bottom:0;padding:15px 12px}#result-list{margin:15px}#result-list .tl_confirm,#result-list .tl_error,#result-list .tl_info,#result-list .tl_new{background:none;padding:3px 0}.dropzone{background:var(--form-bg)!important;border:3px dashed var(--border)!important;border-radius:2px;margin:2px 0;min-height:auto!important}.dropzone-filetree{display:none;height:100%;left:0;opacity:.8;position:absolute;top:0;width:100%;z-index:1}.dropzone-filetree-enabled{display:block}.dz-message span{color:var(--gray);font-size:1.3125rem}.tox-tinymce{border-radius:2px!important;margin:3px 0}.tl_undo_header{grid-column-gap:24px;display:grid;grid-template-columns:2fr 2fr 3fr 3fr;max-width:880px}.hover-row:hover .tl_undo_header{background-color:var(--hover-row)!important}.tl_undo_preview{margin-top:5px;padding:10px 15px;position:relative}.tl_undo_preview td{padding-left:0!important;padding-right:32px!important}.tl_undo_preview td:empty{display:none}.tl_undo_preview img{height:auto;max-width:320px}.tl_undo_preview{font-size:.75rem}.tl_undo_preview .cte_preview h1{font-size:1.15rem}.tl_undo_preview .cte_preview h2{font-size:.9rem}.tl_undo_preview .cte_preview h3{font-size:.8rem}.tl_undo_preview .cte_preview h4,.tl_undo_preview .cte_preview h5,.tl_undo_preview .cte_preview h6{font-size:.775rem}@media (max-width:991px){#container{display:block}#left,#main{float:none}#main{position:relative;-webkit-transform:none;transform:none;transition:transform .2s ease;width:100%!important;will-change:transform}.show-navigation #main{-webkit-transform:translateX(240px);transform:translateX(240px)}#left{position:absolute;top:40px;-webkit-transform:translateX(-240px);transform:translateX(-240px);transition:transform .2s ease,visibility .2s ease;visibility:hidden;width:240px;will-change:transform,visibility}.show-navigation #left{-webkit-transform:none;transform:none;visibility:visible}#tmenu .burger{display:inline}}@media (max-width:767px){#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{background-size:18px!important;margin-bottom:-2px;overflow:hidden;position:relative;text-indent:28px;white-space:nowrap;width:16px}#tmenu sup{font-size:.5rem;top:6px}#tmenu .icon-debug{background:url(icons/debug.svg) 50% no-repeat}#tmenu .icon-preview{background:url(icons/preview.svg) 50% no-repeat}#tmenu .profile button{background:url(icons/profile.svg) 50% no-repeat;background-size:18px;margin:0 0 -2px;overflow:hidden;padding-right:12px;text-indent:28px;white-space:nowrap;width:40px}#main .content{margin:15px 10px}#main_headline{margin:13px 0;padding:0 11px}div.tl_box,div.tl_tbox{position:relative}.tl_content_left{float:none;width:100%}.showColumns td,.showColumns th{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{max-width:283px;width:76%}.tl_search .tl_select{width:36%}.tl_search .tl_text{width:26%}.tl_sorting{max-width:212px;width:60%}.tl_limit{max-width:177px;width:50%}.tl_submit_panel{float:right;z-index:1}input.tl_submit{margin-bottom:3px;margin-top: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 td:last-child,#tl_maintenance_cache tr th: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{display:block;float:none;font-size:.9em;margin-top:3px;width:auto}.tl_metawizard .tl_text{width:100%}}@media (max-width:479px){.tl_modulewizard td:first-child .tl_select{max-width:48vw}} -/*# sourceMappingURL=backend.49ffe8ed.css.map*/ \ No newline at end of file +@font-face{font-family:Architects Daughter;font-style:normal;font-weight:400;src:local("Architects Daughter"),url(fonts/architects-daughter-v6-latin-regular.woff2) format("woff2"),url(fonts/architects-daughter-v6-latin-regular.woff) format("woff")}:root{--text:#222;--body-bg:#eaeaec;--content-bg:#fff;--content-border:#cacacc;--black:#000;--white:#fff;--gray:#999;--green:#589b0e;--red:#c33;--blue:#006494;--orange:#f90;--contao:#f47c00;--border:#eaeaec;--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:#f7f7f8;--table-odd:#fff;--table-even:#fbfbfc;--table-nb-header:#f2f2f3;--table-nb-odd:#fff;--table-nb-even:#f7f7f8;--panel-bg:#f3f3f5;--tree-header:#f3f3f5;--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:#ffe8e5;--diff-del:#ffc1bf;--diff-right:#e0ffe8;--diff-ins:#abf2bc;--code-bg:#f0f0f0;--checkerbox-bg:#ddd;--info:grey;--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]{--text:#ddd;--body-bg:#121416;--content-bg:#1b1d21;--content-border:#414448;--black:#fff;--white:#000;--blue:#0073a8;--orange:#d68c23;--contao:#f47c00;--border:#303236;--nav-bg:#1b1d21;--nav-hover-bg:#1b325f;--nav-current:#272a30;--nav-separator:#3f3f3f;--hover-row:#1b325f;--header-bg:#292c32;--header-bg-hover:#202327;--header-text:#ddd;--invert-bg:#8f96a3;--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:#272a30;--tree-header:#272a30;--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,.17);--diff-del:rgba(248,81,73,.4);--diff-right:rgba(46,160,67,.17);--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;color-scheme:dark}.color-scheme--dark,html[data-color-scheme=dark] .color-scheme--light{display:none}.color-scheme--light,html[data-color-scheme=dark] .color-scheme--dark{display:initial}html{-webkit-text-size-adjust:100%;font-size:100%}article,aside,figcaption,figure,footer,header,main,nav,section{display:block}blockquote,body,dl,figure,h1,h2,h3,h4,p{margin:0}img{border:0}table{border-collapse:collapse;border-spacing:0;empty-cells:show}td,th{text-align:left}.tl_select,a.tl_submit,img,input,label,select{vertical-align:middle}button{cursor:pointer}button[disabled]{cursor:default}nav li,nav ul{list-style:none;margin:0;padding:0}body{color:var(--text);font-family:-apple-system,system-ui,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:.875rem;font-weight:400;line-height:1}b,h1,h2,h3,h4,h5,h6,strong,th{font-weight:600}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body{font-weight:300}b,h1,h2,h3,h4,h5,h6,strong,th{font-weight:500}}.tl_textarea.monospace,code,pre{font:300 .75rem/1.25 SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}h1,h2,h3,h4,h5,h6{font-size:1rem}button,input,select,textarea{color:inherit;font: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:active,a:hover{color:var(--contao)}hr{background:var(--border);border:0;color:var(--border);height:1px;margin:18px 0}p{margin-bottom:1em;padding:0}.hidden{display:none!important}.unselectable{-webkit-touch-callout:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}table.with-border td,table.with-border th{border:solid var(--border);border-width:1px 0}table.with-border th{background-color:var(--table-header)}table.with-padding td,table.with-padding th{padding:6px}table.with-zebra th{background-color:var(--table-nb-header)}table.with-zebra tbody tr:nth-child(odd) td{background-color:var(--table-nb-odd)}table.with-zebra tbody tr:nth-child(2n) td{background-color:var(--table-nb-even)}.clear{clear:both;font-size:.1px;height:.1px;line-height:.1px}.cf:after,.cf:before{content:" ";display:table}.cf:after{clear:both}.invisible{clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.widget{font-size:0;margin-left:15px;margin-right:15px;position:relative}.widget *{font-size:.875rem}.widget>div{font-size:0}.widget>div>*{font-size:.875rem}.widget code,.widget pre{font-size:.7rem}.widget h3{min-height:16px}.widget h3 img{margin-right:3px}.widget legend{padding:0}.widget legend img{vertical-align:-1px}.widget-captcha{display:initial!important}.widget p.info{background:var(--panel-bg);border-radius:3px;line-height:1.3;margin:2px 0;padding:7px}.widget picture{display:contents}optgroup{background:var(--form-bg);font-style:normal;padding-bottom:3px;padding-top:3px}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.tl_checkbox_container button{vertical-align:middle}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_text_interval,.tl_text_trbl,.tl_text_unit,.tl_textarea{-moz-appearance:none;-webkit-appearance:none;background-color:var(--form-bg);border:1px solid var(--form-border);border-radius:2px;box-sizing:border-box;height:30px;margin:3px 0;padding:5px 6px 6px}.tl_text[disabled],.tl_text_2[disabled],.tl_text_3[disabled],.tl_text_4[disabled],.tl_text_interval[disabled],.tl_text_trbl[disabled],.tl_text_unit[disabled],.tl_textarea[disabled]{background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled);color:var(--form-text-disabled);cursor:not-allowed}.tl_text[readonly],.tl_text_2[readonly],.tl_text_3[readonly],.tl_text_4[readonly],.tl_text_interval[readonly],.tl_text_trbl[readonly],.tl_text_unit[readonly],.tl_textarea[readonly]{background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled)}.tl_textarea{height:240px;line-height:1.45;padding:4px 6px}.tl_text_2,.tl_text_3,.tl_text_4,.tl_text_interval,.tl_text_trbl,.tl_text_unit{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-bottom:1px;padding-top:0}input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM3NzciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE5IDYuNDEgMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiLz48L3N2Zz4=");height:14px;margin-right:0;width:14px}@-moz-document url-prefix(){.tl_text::placeholder,.tl_text_2::placeholder,.tl_text_3::placeholder,.tl_text_4::placeholder,.tl_text_interval::placeholder,.tl_text_trbl::placeholder,.tl_text_unit::placeholder,.tl_textarea::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_text_interval::placeholder,.tl_text_trbl::placeholder,.tl_text_unit::placeholder,.tl_textarea::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_text_interval,.tl_text_trbl,.tl_text_unit,.tl_textarea{padding:4px 6px 5px}}select{-moz-appearance:none;-webkit-appearance:none;text-transform:none}select::-ms-expand{display:none}select[multiple]{height:auto}.tl_mselect,.tl_select,.tl_select_column{width:100%}.tl_select_unit{width:20%}.tl_select_interval{width:50%}.tl_mselect,.tl_select,.tl_select_column,.tl_select_interval,.tl_select_unit{background:var(--form-bg) url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDUwMCA1MDAiPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjEzMS41MjMiIHgyPSIzNjguNDc4IiB5MT0iNDIuNjMiIHkyPSIyNzkuNTg0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjYjNiM2IzIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOTk5Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBmaWxsPSJ1cmwoI2EpIiBkPSJNMjUwIDM5Ni42NjZjLTEuMTU1IDAtNC4xMS0xLjgzMi03LjExMy02Ljc1bC0xNjkuNi0yNzcuNDU1Yy0yLjUxNy00LjExNC0zLjE5LTYuOTgtMy4yOC04LjMxNC44MjctLjMzIDIuNTY1LS44MTIgNS42MjctLjgxMmgzNDguNzMzYzMuMDYzIDAgNC43OTguNDgyIDUuNjI3LjgxMi0uMDkgMS4zMzQtLjc2NiA0LjItMy4yOCA4LjMxNWwtMTY5LjYgMjc3LjQ1N2MtMy4wMDUgNC45MTctNS45NiA2Ljc1LTcuMTE0IDYuNzV6Ii8+PC9zdmc+") right -16px top 3px no-repeat;background-origin:content-box;border:1px solid var(--form-border);border-radius:2px;box-sizing:border-box;cursor:pointer;height:30px;margin:3px 0;padding:5px 22px 6px 6px}.tl_mselect[disabled],.tl_mselect[readonly],.tl_select[disabled],.tl_select[readonly],.tl_select_column[disabled],.tl_select_column[readonly],.tl_select_interval[disabled],.tl_select_interval[readonly],.tl_select_unit[disabled],.tl_select_unit[readonly]{background-color:var(--form-bg-disabled);border:1px solid var(--form-border-disabled);color:var(--form-text-disabled);cursor:not-allowed}.tl_mselect[multiple],.tl_select[multiple],.tl_select_column[multiple],.tl_select_interval[multiple],.tl_select_unit[multiple]{background-image:none}@supports (display:-ms-grid){.tl_mselect,.tl_select,.tl_select_column,.tl_select_interval,.tl_select_unit{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{font-weight:600;margin-left:4px;margin-right:3px}@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{font-weight:600;margin-top:3px}@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{margin-right:2px;position:relative;top:-1px}.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}.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{background:var(--form-button);border:1px solid var(--form-border);border-radius:2px;box-sizing:border-box;cursor:pointer;height:30px;padding:7px 12px;transition:background .2s ease}.tl_submit:hover{background-color:var(--form-button-hover);color:inherit}.tl_submit:active{color:var(--form-button-active)}.tl_submit:disabled{background:var(--form-button-disabled)!important;color:var(--gray);cursor:not-allowed}.tl_formbody_submit .tl_submit,.tl_panel .tl_submit,.tl_version_panel .tl_submit{background:var(--form-bg)}.tl_formbody_submit .tl_submit:hover,.tl_panel .tl_submit:hover,.tl_version_panel .tl_submit:hover{background:var(--form-bg-hover)}.split-button,a.tl_submit{display:inline-block}.split-button{position:relative;z-index:1}.split-button li,.split-button ul{list-style:none;margin:0;padding:0}::-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}.w25,.w33,.w50,.w66,.w75{float:left;min-height:80px;width:calc(50% - 30px)}.nogrid .w25,.nogrid .w33,.nogrid .w50,.nogrid .w66,.nogrid .w75{float:none}.long{width:calc(100% - 30px)}.wizard>a{position:relative;top:-2px;vertical-align:middle}.wizard>.image-button{background:none;border:0;padding:0;vertical-align:middle}.wizard .tl_image_size,.wizard .tl_select,.wizard .tl_text{width:calc(100% - 24px)}.wizard .tl_text_2{width:45%}.wizard .tl_image_size{display:inline-block}.wizard img{margin-left:4px}.wizard h3 img{margin-left:0}.long .tl_select,.long .tl_text{width:100%}.m12{margin:0 15px;padding:18px 0 16px}.nogrid .m12{padding:0}.cbx{min-height:46px}.cbx.m12{box-sizing:border-box;min-height:80px}.nogrid .cbx{min-height:32px}.subpal{clear:both}.inline div{display:inline}.autoheight{height:auto}.tl_tip{cursor:help;height:15px;overflow:hidden}.tip{background:var(--invert-bg);border-radius:2px;max-width:320px;padding:6px 9px;position:relative;z-index:99}.tip div{line-height:1.3}.tip a,.tip div,.tip span{color:var(--invert-text)}.tip:before{border-bottom:7px solid var(--invert-bg);border-left:7px solid transparent;border-right:7px solid transparent;content:"";height:6px;left:9px;position:absolute;top:-13px}.tip--rtl:before{left:auto;right:9px}.hover-div:hover,.hover-div:hover .limit_toggler,.hover-row:hover .limit_toggler,.hover-row:hover td{background-color:var(--hover-row)!important}.badge-title{background:var(--invert-bg);border-radius:8px;color:var(--invert-text);float:right;font-size:.75rem;font-weight:600;margin-left:8px;margin-top:-8px;padding:2px 5px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.badge-title{font-weight:500}}@media (min-width:1280px){.w25{width:calc(25% - 30px)}.w33{width:calc(33.3333% - 30px)}.w66{width:calc(66.6666% - 30px)}.w75{width:calc(75% - 30px)}#sbtog{display:none}.split-button ul{clip:auto;display:inline-flex;height:auto;margin:0 0 0 -4px;overflow:initial;position:static;width:auto}.split-button li{margin-left:4px}}@media (max-width:1279px){.split-button{display:inline-flex}.split-button ul{background:var(--form-bg);border:1px solid var(--form-border);border-radius:2px;bottom:20px;box-sizing:border-box;margin-bottom:1em;min-width:100%;padding:3px 0;position:absolute;right:0}.split-button ul button{border:0;text-align:left;white-space:nowrap;width:100%}.split-button ul .tl_submit{background:var(--form-bg);margin-bottom:0;margin-top:0}.split-button ul .tl_submit:hover{background:var(--form-button-hover)}.split-button ul:before{border:6px inset transparent;border-top:6px solid var(--form-bg);bottom:-12px;right:4px;z-index:89}.split-button ul:after,.split-button ul:before{content:"";display:block;height:0;position:absolute;width:0}.split-button ul:after{border:7px inset transparent;border-top:7px solid var(--form-border);bottom:-14px;right:3px;z-index:88}.split-button>button[type=submit]{border-radius:2px 0 0 2px;position:relative}.split-button>button[type=button]{background:var(--form-bg);border:1px solid var(--form-border);border-left:0;border-radius:0 2px 2px 0;box-sizing:border-box;height:30px;margin:2px 0;padding:7px 4px;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:none}}@media (max-width:767px){.w25,.w33,.w50,.w66,.w75{float:none;width:calc(100% - 30px)}.m12{padding-bottom:0;padding-top:0}.cbx,.cbx.m12{min-height:auto}.tip{max-width:80vw}.tl_checkbox_container .tl_checkbox{margin-bottom:1px;margin-top:1px}}: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-logout:url(icons/exit.svg);--icon-toggle-all:url(icons/chevron-right.svg);--icon-alert:url(icons/alert.svg);--icon-favorite:url(icons/favorite.svg);--icon-favorite--active:url(icons/favorite_active.svg);--icon-manual:url(icons/manual.svg);--icon-color-scheme:url(icons/color_scheme.svg);--icon-arrow-left:url(icons/arrow_left.svg);--icon-arrow-right:url(icons/arrow_right.svg);--icon-visible:url(icons/visible.svg);--icon-invisible:url(icons/invisible.svg);--icon-loading:url(icons/loading.svg)}html[data-color-scheme=dark]{--icon-logo:url(icons/logo--dark.svg);--icon-profile:url(icons/profile_small--dark.svg);--icon-security:url(icons/shield_small--dark.svg);--icon-favorites:url(icons/favorites_small--dark.svg);--icon-logout:url(icons/exit--dark.svg);--icon-toggle-all:url(icons/chevron-right--dark.svg);--icon-alert:url(icons/alert--dark.svg);--icon-favorite:url(icons/favorite--dark.svg);--icon-favorite--active:url(icons/favorite_active--dark.svg);--icon-manual:url(icons/manual--dark.svg);--icon-color-scheme:url(icons/color_scheme--dark.svg);--icon-arrow-left:url(icons/arrow_left--dark.svg);--icon-arrow-right:url(icons/arrow_right--dark.svg);--icon-visible:url(icons/visible--dark.svg);--icon-invisible:url(icons/invisible--dark.svg);--icon-loading:url(icons/loading--dark.svg)}html{scroll-behavior:smooth;scroll-padding-top:36px}@media screen and (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}body{background:var(--body-bg);overflow-y:scroll}body.popup{background:var(--content-bg)}#header{background:var(--header-bg);min-height:40px;text-align:left}#header h1{position:absolute}#header h1 a{background:var(--icon-logo) no-repeat 10px center;display:block;font-weight:400;height:16px;padding:12px 12px 12px 42px}#header h1 a .app-title{color:var(--header-text);font-size:17px}@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 .profile button,#tmenu a{display:inline-block;margin:0;padding:13px 12px}#tmenu sup{background:var(--header-text);border-radius:2px;color:var(--header-bg);font-size:.6rem;font-weight:400;left:20px;padding:2px;position:absolute;text-indent:0;top:5px}#tmenu .burger{display:none}#tmenu .burger button{background:none;border:0;padding:8px 10px 9px}#tmenu .burger svg{margin-bottom:-1px;vertical-align:middle}#tmenu .profile button{background:url(icons/chevron-down.svg) right 9px top 14px no-repeat;border:none;cursor:pointer;font-size:.875rem;font-weight:400;padding-right:26px;position:relative}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tmenu .profile button{font-weight:300}}#tmenu .burger button,#tmenu .profile button,#tmenu a{color:var(--header-text);transition:background-color .3s ease}#tmenu .active .profile button,#tmenu .burger button:hover,#tmenu a.hover,#tmenu a:hover,#tmenu li:hover .profile button{background-color:var(--header-bg-hover)}#tmenu ul.menu_level_1{background:var(--content-bg);border:1px solid var(--content-border);box-shadow:0 1px 6px rgba(0,0,0,.2);color:var(--text);margin-top:5px;min-width:150px;opacity:0;position:absolute;right:6px;text-align:left;transition:opacity .3s ease,visibility .3s ease;visibility:hidden;z-index:4}#tmenu .active ul.menu_level_1{opacity:1;visibility:visible}#tmenu ul.menu_level_1 li a{color:inherit;display:block;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{border-bottom:1px solid var(--border);color:var(--info);line-height:1.4;margin-bottom:9px;padding:15px 20px;white-space:nowrap}#tmenu ul.menu_level_1 strong{color:var(--text);display:block}#tmenu ul.menu_level_1:before{border:7px solid transparent;border-bottom:7px solid var(--content-bg);content:"";display:block;height:0;position:absolute;right:9px;top:-14px;width:0}#tmenu ul.menu_level_1:after{border-right:1px solid var(--content-border);border-top:1px solid var(--content-border);content:"";display:block;height:9px;position:absolute;right:11px;top:-6px;transform:rotate(-45deg);width:9px}#tmenu ul.menu_level_1 .logout{border-top:1px solid var(--border);margin-top:9px;padding:6px 0}#tmenu .icon-alert,#tmenu .icon-color-scheme,#tmenu .icon-favorite,#tmenu .icon-manual{margin-bottom:-2px;overflow:hidden;position:relative;text-indent:28px;white-space:nowrap;width:16px}#tmenu .icon-alert{background:var(--icon-alert) center center no-repeat}#tmenu .icon-favorite{background:var(--icon-favorite) center center no-repeat}#tmenu .icon-favorite--active{background:var(--icon-favorite--active) center center no-repeat}#tmenu .icon-manual{background:var(--icon-manual) center center no-repeat}#tmenu .icon-color-scheme{background:var(--icon-color-scheme) center 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{max-width:none;min-height:0;padding:0;width:auto}#left{background:var(--nav-bg);display:flex;flex-direction:column;width:220px}#left .version{font-size:.75rem;line-height:1.4;margin-top:4em;padding:15px 18px}#left .version,#left .version a{color:var(--nav-group)}#main{display:flex;flex-direction:column;width:calc(100% - 220px)}.popup #main{border:0;display:initial;float:none;margin:0;max-width:none;padding:0;width:auto}#main .content{background:var(--content-bg);border:1px solid var(--content-border);margin:0 15px 15px}.popup #main .content{border:0;margin:0}#tl_navigation{flex-grow:1}#tl_navigation .menu_level_0{padding-top:20px}#tl_navigation .menu_level_0>li:after{background:var(--nav-separator);content:"";display:block;height:1px;margin:15px auto;width:calc(100% - 30px)}#tl_navigation .menu_level_0>li.last:after{display:none}#tl_navigation .menu_level_0 a[class^=group-]{color:var(--nav-group);display:block;font-size:.75rem;font-weight:500;margin:0 15px;padding:3px 3px 3px 22px;text-transform:uppercase}@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{color:var(--nav);display:block;font-weight:400;padding:5px 33px 5px 37px;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{background-color:var(--nav-current);color:var(--nav-hover)}#tl_navigation .collapsed .menu_level_1{display:none}#tl_buttons{margin:0;padding:9px 15px;text-align:right}.toggleWrap{cursor:pointer}.opacity{-moz-opacity:.8;opacity:.8}#main_headline{display:flex;font-size:1.1rem;margin:18px 16px}.popup #main_headline{display:none}#main_headline span{display:inline-block;flex:1 0 0;line-height:22px;max-width:max-content;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#main_headline span:nth-child(2n){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(2n){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{background:url(icons/error.svg) no-repeat 0;margin:12px;padding:3px 0 3px 22px}.tl_confirm,.tl_error,.tl_info,.tl_new{line-height:1.3;margin:0 0 1px;padding:11px 18px 11px 32px}.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_error,.tl_error a,.tl_gerror,.tl_gerror a{color:var(--red)}.tl_error a,.tl_gerror 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_confirm,.widget .tl_error,.widget .tl_info,.widget .tl_new{background-position:9px 9px;padding:8px 10px 8px 30px}.tl_confirm strong,.tl_error strong,.tl_info strong,.tl_new strong{color:inherit}.tl_panel,.tl_version_panel{background:var(--panel-bg);border-bottom:1px solid var(--content-border);padding:4px 12px;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_submit{vertical-align:middle}.tl_img_submit,.tl_version_panel .tl_formbody{position:relative}.tl_img_submit{border:0;cursor:pointer;height:16px;margin:0;overflow:hidden;padding:0;text-indent:16px;top:9px;white-space:nowrap;width:16px}.filter_apply{background:url(icons/filter-apply.svg) 50% no-repeat}.filter_reset{background:url(icons/filter-reset.svg) 50% no-repeat}.tl_subpanel{float:right;letter-spacing:-.31em}.tl_subpanel *{letter-spacing:normal}.tl_search span,.tl_subpanel strong{vertical-align:middle}.tl_submit_panel{min-width:32px;padding-left:6px;padding-right:3px}#search .active,.tl_panel .active,.tl_panel_bottom .active{background-color:var(--active-bg)}.tl_filter{width:100%}.tl_filter .tl_select{margin-left:3px;max-width:14.65%}.tl_submit_panel+.tl_filter{width:86%}.tl_limit{width:22%}.tl_limit .tl_select{margin-left:3px;width:52%}.tl_search{width:40%}.tl_search .tl_select{margin-left:3px;margin-right:1%;width:38%}.tl_search .tl_text{-webkit-appearance:textfield;box-sizing:content-box;margin-left:1%;width:30%}.tl_sorting{width:26%}.tl_sorting .tl_select{margin-left:1%;width:60%}.jump-targets{background:var(--panel-bg);border-bottom:1px solid var(--content-border);min-height:30px;padding-top:1px;position:sticky;top:0;z-index:3}.jump-targets .inner{overflow-x:scroll;scrollbar-width:none}.jump-targets .inner::-webkit-scrollbar{display:none}.jump-targets ul{list-style:none;margin:0;padding:0;white-space:nowrap}.jump-targets li{display:inline-block;font-size:.75rem;padding:9px 10px;white-space:nowrap}.jump-targets button{background:none;border:none;padding:0}.jump-targets:after,.jump-targets:before{content:"";display:block;height:100%;position:absolute;top:0;width:10px}.jump-targets:before{background:linear-gradient(-90deg,transparent 0,var(--panel-bg) 50%)}.jump-targets:after{background:linear-gradient(90deg,transparent 0,var(--panel-bg) 50%);right:0}.tl_xpl{padding:0 18px}.tl_box,.tl_tbox{border-bottom:1px solid var(--border);padding:12px 0 25px}.tl_box:last-child,.tl_tbox:last-child{border-bottom:0}.tl_box h3,.tl_tbox h3,.tl_xpl h3{font-size:.875rem;height:16px;margin:0;padding-top:13px}.tl_box h4,.tl_tbox h4{font-size:.875rem;margin:6px 0 0;padding:0}.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{color:var(--info);line-height:1.2;margin-bottom:0}.tl_help a:active,.tl_help a:focus,.tl_help a:hover{text-decoration:underline}#tl_buttons+.tl_edit_form .tl_formbody_edit{border-top:1px solid var(--border)}.tl_formbody_submit{border-top:1px solid var(--content-border);bottom:0;position:sticky;z-index:3}.tl_submit_container{background:var(--panel-bg);padding:8px 12px}.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 .tl_tbox{border:0!important;padding:6px 15px 14px}.maintenance_inactive .tl_message{margin:0 15px 3px}.maintenance_inactive h2.sub_headline{margin:16px 15px 3px}.maintenance_inactive .tl_submit_container{background:none;border:0;padding:0 15px 24px}@keyframes crawl-progress-bar-stripes{0%{background-position-x:1rem}}#tl_crawl .tl_message{margin-bottom:24px}#tl_crawl .tl_message>p{background-color:transparent;background-position-y:center;padding-bottom:0;padding-top:0}#tl_crawl .tl_tbox{margin-top:0;padding-left:0;padding-right:0;padding-top:0}#tl_crawl .tl_checkbox_container{margin-top:6px}#tl_crawl .inner{margin:0 18px 18px;position:relative}#tl_crawl .progress{background-color:var(--tree-header);border-radius:2px;display:flex;height:20px}#tl_crawl .progress-bar{background-size:10px 10px;color:#fff;display:flex;flex-direction:column;justify-content:center;text-align:center;white-space:nowrap}#tl_crawl .progress-bar.running{animation:crawl-progress-bar-stripes 1s linear infinite;background-color:var(--progress-running);background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent)}#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 .crawl-hint{line-height:1.3;margin-top:-2px}#tl_crawl .crawl-hint a{text-decoration:underline}#tl_crawl .subscriber-log{display:none;margin-bottom:0;padding:5px 0}#tl_crawl .wait{color:var(--gray);margin-top:9px}#tl_crawl .debug-log{display:none;margin-top:11px}#tl_crawl .results.finished .show-when-running,#tl_crawl .results.running .show-when-finished{display:none}#tl_crawl .results.finished .show-when-finished,#tl_crawl .results.running .show-when-running{display:block}#tl_crawl .result .summary.success{color:var(--green)}#tl_crawl .result .summary.failure{color:var(--red)}#tl_crawl .result .warning{color:var(--blue);display:none}.two-factor{border-top:1px solid var(--border);padding-bottom:9px}.two-factor h2.sub_headline{margin:18px 15px 3px}.two-factor>p{line-height:1.3;margin:0 15px 12px}.two-factor li{list-style:initial;margin-left:2em}.two-factor .qr-code{margin:0 15px}.two-factor .qr-code img{border:3px solid #fff}.two-factor .tl_listing_container{margin-top:6px}.two-factor .widget{height:auto;margin:15px 15px 12px}.two-factor .widget .tl_error{background:none;font-size:.75rem;line-height:1.25;margin:0;padding:1px 0}.two-factor .tl_submit_container{background:none;border:0;padding:0 15px 10px}.two-factor .submit_container{clear:both;margin:0 15px 12px}.two-factor .tl_message{margin:0 15px 12px}.two-factor .tl_message>p{background-color:transparent;background-position:3px;padding:0 3px 0 27px}.two-factor .tl_backup_codes>p,.two-factor .tl_trusted_devices>p{line-height:1.3;margin:0 15px 12px}.two-factor .backup-codes{display:grid;grid-template-columns:repeat(2,1fr);margin:15px 15px 24px;max-width:224px;padding:0}.two-factor .backup-codes li{list-style:none;margin:0}.two-factor .tl_trusted_devices td,.two-factor .tl_trusted_devices th{line-height:16px}#search{margin:18px 18px -9px;text-align:right}#search .tl_text{-webkit-appearance:textfield;box-sizing:content-box;max-width:160px}.tl_edit_preview{margin-top:18px}.tl_edit_preview img{background:var(--white);border:1px solid var(--content-border);height:auto;max-width:100%;padding:2px}.tl_edit_preview_enabled{cursor:crosshair;display:inline-block;position:relative}.tl_edit_preview_important_part{border:1px solid var(--black);box-shadow:0 0 0 1px var(--white),inset 0 0 0 1px var(--white);margin:-1px;opacity:.5;position:absolute}table.tl_listing{width:100%}.tl_listing_container{margin:18px 0;padding:0 15px}#tl_buttons+.tl_form .tl_listing_container,#tl_buttons+.tl_listing_container{margin-top:12px}#paste_hint+.tl_listing_container{margin-top:36px}.tl_folder_list,.tl_folder_tlist{background:var(--table-header);border-bottom:1px solid var(--border);font-weight:600;padding:6px}@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);line-height:16px}.tl_file,.tl_file_list{background:var(--content-bg);border-bottom:1px solid var(--border);padding:5px 6px}.tl_file_list .ellipsis{height:16px;overflow:hidden;padding-right:18px;text-overflow:ellipsis;word-break:break-all}.tl_right_nowrap{padding:6px;text-align:right;vertical-align:top;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,.tl_listing_container.picker .tl_content_header{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-left:8px;margin-top:2px}.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{margin:18px 2%;padding:9px 0 18px;width:96%}.tl_show+.tl_show{margin-top:36px}.tl_show td,.tl_show th{line-height:16px;white-space:pre-line}.tl_show td:first-child{white-space:normal;width:34%}.tl_show td p:last-of-type{margin-bottom:0}.tl_show small{color:var(--info);display:block}.tl_label{font-weight:600;margin-right:12px;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}.tl_radio_reset,.tl_select_trigger{padding:0 6px 3px 0;text-align:right}.tl_radio_reset{margin-top:6px}.tl_radio_label,.tl_select_label{color:var(--gray);font-size:.75rem;margin-right:2px}.tl_header{background:var(--table-header);margin-bottom:18px;padding:10px}.tl_header_table{line-height:1.3}.tl_content_header{background:var(--table-header);border-bottom:1px solid var(--border);font-weight:600;padding:7px 6px}.tl_header+.tl_content_header{border-top:1px solid var(--border)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_content_header{font-weight:500}}.as-grid .tl_content_header{background-color:transparent;border:0;font-size:1rem;margin-top:24px;padding:0 1px}.tl_content{border-bottom:1px solid var(--border);position:relative}.tl_content .inside{background-color:var(--content-bg);padding:6px}.tl_content.draft .inside{min-height:16px}.hover-row.draft>td,.tl_content.draft>*,.tl_file.draft>*,.tl_folder.draft>*{opacity:.5}.as-grid .tl_content{background-color:var(--content-bg);border:1px solid var(--border);margin-top:18px;padding:0}.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{list-style:none;margin:0;padding:0}.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{background:var(--nested-bg);border-width:0 1px;margin:0;padding:15px 15px 0}.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{float:right;margin-bottom:-1px;margin-left:12px;position:relative;text-align:right;z-index:1}.as-grid .tl_content .tl_content_right{background:var(--table-header);border-left:1px solid var(--border);float:none;margin-bottom:0;margin-left:0;order:2;padding:8px 10px}.tl_content_right button,.tl_right button{background:none;border:0;height:16px;margin:0;padding:0}.cte_type{color:var(--info);font-size:.75rem;line-height:16px;margin:0 0 4px}.as-grid .cte_type{background-color:var(--table-header);font-size:.8rem;margin-bottom:0;order:1;padding:8px 10px}.cte_type.published,.cte_type.published a{color:var(--green)}.cte_type.unpublished,.cte_type.unpublished a{color:var(--red)}.cte_type.icon-protected{background:var(--table-header) url(icons/protected.svg) 8px center no-repeat;padding-left:27px}.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}.content-hyperlink,.content-toplink,.cte_preview div.tl_gray,.cte_preview figure,.cte_preview ol,.cte_preview p,.cte_preview table,.cte_preview table caption,.cte_preview ul{margin-bottom:6px}.cte_preview img{height:auto;max-width:320px;padding:6px 0}.cte_preview td,.cte_preview th{border-bottom:1px solid var(--border);padding:3px 6px}.cte_preview th{background:var(--table-header);padding:6px}.cte_preview td{background:var(--content-bg)}.cte_preview table caption{font-size:.75rem;text-align:left}.cte_preview pre{margin-bottom:6px;margin-top:0;white-space:pre-wrap;word-break:break-all}.cte_preview pre.disabled{color:var(--pre-disabled)}.cte_preview .content-gallery ul{display:grid;grid-template-columns:1fr 1fr 1fr;list-style:none;margin:0;padding:0}.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 button,.cte_preview input,.cte_preview select,.cte_preview textarea{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 .checkbox_container legend,.cte_preview .radio_container legend,.cte_preview label{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{border-top:1px solid var(--border);grid-column:1/span 2;order:3;padding:10px 10px 6px}.limit_height{overflow:hidden}.limit_toggler{background:var(--content-bg);bottom:0;left:0;line-height:11px;position:absolute;text-align:center;width:100%}.limit_toggler button{background:var(--content-bg);border:0;border-top-left-radius:2px;border-top-right-radius:2px;color:var(--gray);line-height:8px;margin:0;padding:0;width:24px}.limit_toggler button span{position:relative;top:-4px;z-index:1}.tl_folder_top{background:var(--tree-header);border:solid var(--tree-header-border);border-width:1px 0;padding:5px 6px}.tl_folder{background:var(--table-header);border-bottom:1px solid var(--border);padding:5px 6px}.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{box-sizing:border-box;flex-grow:1;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tl_listing .tl_left.tl_left_dragging{background:var(--drag-bg);border-radius:10px;color:var(--text);margin-left:0;padding:5px 10px!important;position:absolute;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 .tl_gray,.tl_listing .tl_left.tl_left_dragging a{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-bottom:5px;padding-top:5px}.tl_tree_xtnd .tl_file .tl_left img{margin-right:2px}.tl_file_manager .preview-image{height:auto;margin:0 0 2px 22px;max-height:75px;max-width:100px;width:auto}.tl_file_manager .preview-important{height:auto;margin:0 0 2px;max-height:60px;max-width:80px;vertical-align:bottom;width:auto}.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;list-style-type:none;margin:0}.tl_listing li.parent{display:inline;padding-left:0;padding-right:0}label.tl_change_selected{color:var(--gray);font-size:.75rem;margin-right:2px}#tl_breadcrumb{background:var(--active-bg);border:1px solid var(--active-border);border-radius:2px;display:flow-root;line-height:24px;margin:0 0 12px;padding:4px 6px}#tl_breadcrumb li{float:left;list-style-type:none;margin:0;padding:0 3px}#tl_breadcrumb li a{display:inline-block}#tl_breadcrumb li img{height:16px;vertical-align:-3px;width:16px}.selector_container{margin-top:1px;position:relative}.selector_container>ul{list-style-type:none;margin:0 0 1px;padding:0}.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{height:auto;max-width:320px}.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{display:grid;gap:4px;grid-auto-rows:75px;grid-template-columns:repeat(auto-fill,100px);padding:2px 0}ul.sgallery li{-webkit-align-items:center;align-items:center;background:var(--form-button);display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;margin:0;min-height:75px;min-width:100px;padding:0}.popup #tl_soverview{margin-top:15px}#tl_soverview>div{border-bottom:1px solid var(--border);padding:5px 15px}#tl_soverview>div:last-child{border-bottom:0}#tl_messages h2,#tl_shortcuts h2{margin:14px 0 10px}#tl_versions h2{margin:14px 0 12px}#tl_messages p{margin-bottom:.5em}#tl_messages p:last-child{margin-bottom:1em}#tl_messages .tl_confirm,#tl_messages .tl_error,#tl_messages .tl_info,#tl_messages .tl_new{background-color:transparent;background-position:left 1px;padding:0 0 0 21px}#tl_shortcuts p a{text-decoration:underline}#tl_versions{margin-bottom:0}#tl_versions table{margin-bottom:18px;width:100%}#tl_versions td,#tl_versions th{padding:6px}#tl_versions th{line-height:16px}#tl_versions td:first-child{white-space:nowrap}#tl_versions td:last-child{text-align:right;white-space:nowrap;width:32px}#tl_versions .pagination{background:var(--table-header);margin-bottom:14px;margin-top:18px;padding:12px 6px}.tl_chmod{width:100%}.tl_chmod th{background:var(--tree-header);font-weight:400;height:18px;text-align:center}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_chmod th{font-weight:300}}.tl_chmod td{background:var(--table-header);text-align:center}.tl_chmod td,.tl_chmod th{border:1px solid var(--content-bg);padding:6px;width:14.2857%}.tl_checkbox_wizard button,.tl_image_size+button,.tl_key_value_wizard button,.tl_listwizard button,.tl_metawizard button,.tl_modulewizard button,.tl_optionwizard button,.tl_sectionwizard button,.tl_tablewizard button{background:none;border:0;margin:0;padding:0;vertical-align:middle}.tl_modulewizard{margin-top:2px;max-width:800px;width:100%}.tl_modulewizard td{padding:0 3px 0 0;position:relative}.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{white-space:nowrap;width:1%}.tl_modulewizard .tl_select,.tl_modulewizard .tl_select_column{margin:2px 0}.js .tl_modulewizard input.mw_enable,.tl_modulewizard input.mw_enable+button{display:none}.js .tl_modulewizard input.mw_enable+button{background:var(--icon-invisible) 0 0 no-repeat;display:inline;height:16px;width:16px}.js .tl_modulewizard input.mw_enable:checked+button{background-image:var(--icon-visible)}.tl_modulewizard img.mw_enable{display:none}.js .tl_modulewizard img.mw_enable{display:inline;margin-right:1px}.tl_optionwizard{max-width:600px;width:100%}.tl_key_value_wizard{max-width:450px;width:100%}.tl_key_value_wizard,.tl_optionwizard{margin-top:2px}.tl_key_value_wizard label,.tl_optionwizard label{margin-right:3px}.tl_key_value_wizard td,.tl_optionwizard td{padding:0 3px 0 0}.tl_key_value_wizard th,.tl_optionwizard th{font-size:.75rem;font-weight:400;padding:0 6px 1px 0}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.tl_key_value_wizard th,.tl_optionwizard th{font-weight:300}}.tl_key_value_wizard td:nth-child(n+3),.tl_optionwizard td:nth-child(n+3){white-space:nowrap;width:1%}.tl_optionwizard .tl_text{margin:2px 0}.tl_key_value_wizard img,.tl_optionwizard img{position:relative;top:1px}.tl_key_value_wizard .fw_checkbox,.tl_optionwizard .fw_checkbox{margin:0 1px}#ctrl_allowedAttributes{max-width:none}#ctrl_allowedAttributes td:first-child{width:100px}#tl_tablewizard{margin-top:2px;overflow:auto;padding-bottom:2px}.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_tablewizard .tl_textarea{margin:2px 0}.tl_listwizard{list-style:none;margin:1px 0;padding:0}.tl_listwizard .tl_text{margin:2px 0;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{list-style:none;margin:3px 0;padding:0}.tl_metawizard li{margin-bottom:2px;padding:9px}.tl_metawizard li:nth-child(odd){background:var(--table-header)}.tl_metawizard li:nth-child(2n){background:var(--table-even)}.tl_metawizard label{float:left;margin-top:9px;width:18%}.tl_metawizard .tl_text,.tl_metawizard .tl_textarea{float:left;margin:1px 0;width:calc(82% - 20px)}.tl_metawizard .tl_textarea{resize:vertical}.tl_metawizard .tl_text+a{margin-left:4px;position:relative;top:7px}.tl_metawizard br{clear:left}.tl_metawizard .lang{display:block;font-weight:600;margin:3px 0 9px;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;max-width:680px;width:100%}.tl_sectionwizard td{padding:0 3px 0 0;position:relative;width:25%}.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{background:var(--icon-arrow-right) bottom right no-repeat;padding:0 36px 24px 0;right:30px;top:0;transform:rotate(-1deg)}#paste_hint p,.sort_hint{color:var(--paste-hint);font-family:Architects Daughter,cursive;font-size:1rem;position:absolute}.sort_hint{background:var(--icon-arrow-left) 6px bottom no-repeat;left:160px;padding:0 6px 24px 42px;top:-50px;transform:rotate(-2deg)}.widget+.subpal .sort_hint{left:260px}.widget+.widget .sort_hint{left:320px}.serp-preview{background:var(--panel-bg);border-radius:3px;color:var(--serp-preview);font-family:Arial,sans-serif;font-weight:400;margin:2px 0;max-width:600px;padding:5px 7px}.serp-preview p{margin:0}.serp-preview .description,.serp-preview .url{line-height:18px}.serp-preview .url:not(:empty){margin-top:3px}.serp-preview .description:not(:empty){margin-bottom:3px}.serp-preview .title{color:var(--serp-preview-title);font-size:18px;margin:5px 0 4px}.serp-preview .tl_info{background-color:transparent}#tl_ajaxBox{background:var(--white) var(--icon-loading) no-repeat right 2em center;border:2px solid var(--black);border-radius:2px;box-sizing:border-box;font-size:1rem;left:50%;margin-left:-150px;padding:2em;position:absolute;text-align:left;width:300px}#tl_ajaxOverlay{background:var(--white);height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%}.ce_gallery ul{display:flow-root}.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{background:var(--form-button);border:0;border-radius:2px;cursor:pointer;font-size:22px;line-height:9px;margin:0;padding:0 0 3px;position:absolute;right:0;top:0;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:hsla(0,0%,100%,.7)}#picker-menu{border-bottom:1px solid var(--content-border);padding:9px 6px 0}#picker-menu>ul{list-style:none;margin:0;padding:0}#picker-menu li{background-color:var(--table-even);border:1px solid var(--content-border);border-radius:2px 2px 0 0;display:inline-block;padding:8px 0;position:relative;top:1px}#picker-menu li.current,#picker-menu li:hover{background-color:var(--panel-bg)}#picker-menu li.current{border-bottom-color:var(--panel-bg)}#picker-menu a{background:url(icons/manager.svg) 12px no-repeat;padding:3px 12px 3px 32px}#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 *{color:var(--text);font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important;font-size:.75rem!important}.ace-fullsize{overflow:hidden!important}.ace-fullsize .ace_editor{border:0;bottom:0;height:auto!important;left:0;margin:0;position:fixed!important;right:0;top:0;width:auto!important;z-index:10000}div.mce-edit-area{width:99.9%}time[title]{cursor:help}.float_left{float:left}.float_right{float:right}.foldable img{transform:none;transition:transform .2s ease;will-change:transform}.foldable--open img{transform:rotate(90deg)}.foldable--loading{pointer-events:none;position:relative}.foldable--loading img{visibility:hidden}.foldable--loading:after{background:var(--icon-loading) 0 0/contain no-repeat;content:"";height:14px;inset:2px auto auto 2px;position:absolute;width:14px}.header_back,.header_clipboard,.header_css_import,.header_delete_all,.header_edit_all,.header_icon,.header_new,.header_new_folder,.header_rss,.header_store,.header_sync,.header_theme_import,.header_toggle{background-color:transparent;background-position:0;background-repeat:no-repeat;border:none;display:inline-block;margin-left:15px;padding:3px 0 3px 21px}.list_icon{background-position:0;margin-left:-3px;padding-left:20px}.list_icon,.list_icon_new{background-repeat:no-repeat}.list_icon_new{background-position:1px;width:16px}.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{background-image:url(icons/newfolder.svg);padding-left:24px}.header_css_import{background-image:url(icons/cssimport.svg)}.header_theme_import{background-image:url(icons/theme_import.svg)}.header_store{background-image:url(icons/store.svg);padding-left:18px}.header_toggle{background-image:var(--icon-toggle-all)}.header_sync{background-image:url(icons/sync.svg)}#ctrl_playerSize input,.tl_imageSize_0,.tl_imageSize_1,.tl_text_trbl{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}.tl_checkbox_container.error legend,label.error,legend.error{color:var(--red)}.tl_box .tl_error,.tl_tbox .tl_error{background:none;font-size:.75rem;margin-bottom:0;padding:0}.tl_formbody_edit>.tl_error{margin-top:9px}.broken-image{background:var(--error-bg) url(icons/error.svg) no-repeat 9px center;color:var(--red);display:inline-block;padding:12px 12px 12px 30px;text-indent:0}fieldset.tl_box,fieldset.tl_tbox{border-left:0;border-right:0;border-top:none;margin-top:5px;margin-inline:0;padding-top:0}fieldset.tl_box.nolegend,fieldset.tl_tbox.nolegend{border-top:0}fieldset.tl_box>legend,fieldset.tl_tbox>legend{background:url(icons/navcol.svg) 13px 10px no-repeat;box-sizing:border-box;color:var(--legend);cursor:pointer;padding:9px 12px 9px 28px}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;padding:9px 6px}#tl_maintenance_cache td span{color:var(--gray)}#tl_maintenance_cache td:first-child{width:16px}#tl_maintenance_cache .nw{white-space:nowrap}#tl_maintenance_cache .tl_checkbox_container{margin-top:3px}#tl_maintenance_cache .tl_checkbox_container label{font-weight:600;vertical-align:initial}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#tl_maintenance_cache .tl_checkbox_container label{font-weight:500}}.pagination{background:var(--panel-bg);border:solid var(--border);border-width:1px 0;display:flow-root;margin-bottom:18px;padding:12px 15px}.pagination ul{float:right;text-align:right;width:60%}.pagination p{float:left;margin-bottom:0;width:30%}.pagination li{display:inline;padding-left:3px}.pagination .active{color:var(--gray)}.pagination-lp{border-bottom:0;margin-bottom:0;padding:15px 12px}#result-list{margin:15px}#result-list .tl_confirm,#result-list .tl_error,#result-list .tl_info,#result-list .tl_new{background:none;padding:3px 0}.dropzone{background:var(--form-bg)!important;border:3px dashed var(--border)!important;border-radius:2px;margin:2px 0;min-height:auto!important}.dropzone-filetree{display:none;height:100%;left:0;opacity:.8;position:absolute;top:0;width:100%;z-index:1}.dropzone-filetree-enabled{display:block}.dz-message span{color:var(--gray);font-size:1.3125rem}.tox-tinymce{border-radius:2px!important;margin:3px 0}.tl_undo_header{grid-column-gap:24px;display:grid;grid-template-columns:2fr 2fr 3fr 3fr;max-width:880px}.hover-row:hover .tl_undo_header{background-color:var(--hover-row)!important}.tl_undo_preview{margin-top:5px;padding:10px 15px;position:relative}.tl_undo_preview td{padding-left:0!important;padding-right:32px!important}.tl_undo_preview td:empty{display:none}.tl_undo_preview img{height:auto;max-width:320px}.tl_undo_preview{font-size:.75rem}.tl_undo_preview .cte_preview h1{font-size:1.15rem}.tl_undo_preview .cte_preview h2{font-size:.9rem}.tl_undo_preview .cte_preview h3{font-size:.8rem}.tl_undo_preview .cte_preview h4,.tl_undo_preview .cte_preview h5,.tl_undo_preview .cte_preview h6{font-size:.775rem}@media (max-width:991px){#container{display:block}#left,#main{float:none}#main{position:relative;-webkit-transform:none;transform:none;transition:transform .2s ease;width:100%!important;will-change:transform}.show-navigation #main{-webkit-transform:translateX(240px);transform:translateX(240px)}#left{position:absolute;top:40px;-webkit-transform:translateX(-240px);transform:translateX(-240px);transition:transform .2s ease,visibility .2s ease;visibility:hidden;width:240px;will-change:transform,visibility}.show-navigation #left{-webkit-transform:none;transform:none;visibility:visible}#tmenu .burger{display:inline}}@media (max-width:767px){#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{background-size:18px!important;margin-bottom:-2px;overflow:hidden;position:relative;text-indent:28px;white-space:nowrap;width:16px}#tmenu sup{font-size:.5rem;top:6px}#tmenu .icon-debug{background:url(icons/debug.svg) 50% no-repeat}#tmenu .icon-preview{background:url(icons/preview.svg) 50% no-repeat}#tmenu .profile button{background:url(icons/profile.svg) 50% no-repeat;background-size:18px;margin:0 0 -2px;overflow:hidden;padding-right:12px;text-indent:28px;white-space:nowrap;width:40px}#main .content{margin:15px 10px}#main_headline{margin:13px 0;padding:0 11px}div.tl_box,div.tl_tbox{position:relative}.tl_content_left{float:none;width:100%}.showColumns td,.showColumns th{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{max-width:283px;width:76%}.tl_search .tl_select{width:36%}.tl_search .tl_text{width:26%}.tl_sorting{max-width:212px;width:60%}.tl_limit{max-width:177px;width:50%}.tl_submit_panel{float:right;z-index:1}input.tl_submit{margin-bottom:3px;margin-top: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 td:last-child,#tl_maintenance_cache tr th: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{display:block;float:none;font-size:.9em;margin-top:3px;width:auto}.tl_metawizard .tl_text{width:100%}}@media (max-width:479px){.tl_modulewizard td:first-child .tl_select{max-width:48vw}} +/*# sourceMappingURL=backend.509d1d15.css.map*/ \ No newline at end of file diff --git a/contao/themes/flexible/backend.509d1d15.css.map b/contao/themes/flexible/backend.509d1d15.css.map new file mode 100644 index 0000000000..075d888c81 --- /dev/null +++ b/contao/themes/flexible/backend.509d1d15.css.map @@ -0,0 +1 @@ +{"version":3,"file":"backend.509d1d15.css","mappings":"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","sources":["webpack:///./core-bundle/contao/themes/flexible/styles/fonts.css","webpack:///./core-bundle/contao/themes/flexible/styles/basic.css","webpack:///./core-bundle/contao/themes/flexible/styles/main.css"],"sourcesContent":["/* Architects Daughter (https://google-webfonts-helper.herokuapp.com/fonts/architects-daughter?subsets=latin) */\n@font-face {\n\tfont-family: \"Architects Daughter\";\n\tsrc: local(\"Architects Daughter\"),\n\t\turl(\"fonts/architects-daughter-v6-latin-regular.woff2\") format(\"woff2\"),\n\t\turl(\"fonts/architects-daughter-v6-latin-regular.woff\") format(\"woff\");\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n","/* Appearance */\n:root {\n\t--text: #222;\n\t--body-bg: #eaeaec;\n\t--content-bg: #fff;\n\t--content-border: #cacacc;\n\t--black: #000;\n\t--white: #fff;\n\t--gray: #999;\n\t--green: #589b0e;\n\t--red: #c33;\n\t--blue: #006494;\n\t--orange: #f90;\n\t--contao: #f47c00;\n\t--border: #eaeaec;\n\t--nav: #d3d6da;\n\t--nav-hover: #eaedf1;\n\t--nav-bg: #0f1c26;\n\t--nav-hover-bg: #eaedf1;\n\t--nav-current: #172b3b;\n\t--nav-group: #9fa4a8;\n\t--nav-separator: #3a454d;\n\t--hover-row: #fffce1;\n\t--header-bg: #f47c00;\n\t--header-bg-hover: #e67300;\n\t--header-text: #fff;\n\t--invert-bg: #333;\n\t--invert-text: #fff;\n\t--table-header: #f7f7f8;\n\t--table-odd: #fff;\n\t--table-even: #fbfbfc;\n\t--table-nb-header: #f2f2f3;\n\t--table-nb-odd: #fff;\n\t--table-nb-even: #f7f7f8;\n\t--panel-bg: #f3f3f5;\n\t--tree-header: #f3f3f5;\n\t--tree-header-border: #dddddf;\n\t--form-text-disabled: #bbb;\n\t--form-border: #aaa;\n\t--form-border-disabled: #c8c8c8;\n\t--form-bg: #fff;\n\t--form-bg-hover: #f6f6f6;\n\t--form-bg-disabled: #f9f9f9;\n\t--form-button: #eee;\n\t--form-button-hover: #f6f6f6;\n\t--form-button-active: #aaa;\n\t--form-button-disabled: #e9e9e9;\n\t--diff-left: #ffe8e5;\n\t--diff-del: #ffc1bf;\n\t--diff-right: #e0ffe8;\n\t--diff-ins: #abf2bc;\n\t--code-bg: #f0f0f0;\n\t--checkerbox-bg: #ddd;\n\t--info: #808080;\n\t--active-bg: #fffce1;\n\t--active-border: #e7b36a;\n\t--pre-disabled: #a6a6a6;\n\t--error-bg: rgba(204,51,51,.15);\n\t--confirm-bg: rgba(88,155,14,.15);\n\t--info-bg: rgba(0,100,148,.15);\n\t--new-bg: rgba(224,149,21,.15);\n\t--progress-running: #f47c00;\n\t--progress-finished: #589b0e;\n\t--drag-bg: #a3c2db;\n\t--legend: #6a6a6c;\n\t--paste-hint: #838990;\n\t--serp-preview: #3c4043;\n\t--serp-preview-title: #1a0dab;\n\t--nested-bg: #fbfbfd;\n}\n\nhtml[data-color-scheme=\"dark\"] {\n\tcolor-scheme: dark;\n\t--text: #ddd;\n\t--body-bg: #121416;\n\t--content-bg: #1b1d21;\n\t--content-border: #414448;\n\t--black: #fff;\n\t--white: #000;\n\t--blue: #0073a8;\n\t--orange: #d68c23;\n\t--contao: #f47c00;\n\t--border: #303236;\n\t--nav-bg: #1b1d21;\n\t--nav-hover-bg: #1b325f;\n\t--nav-current: #272a30;\n\t--nav-separator: #3f3f3f;\n\t--hover-row: #1b325f;\n\t--header-bg: #292c32;\n\t--header-bg-hover: #202327;\n\t--header-text: #ddd;\n\t--invert-bg: #8f96a3;\n\t--invert-text: #222;\n\t--table-header: #232529;\n\t--table-odd: #1b1d21;\n\t--table-even: #1e2024;\n\t--table-nb-header: #292c32;\n\t--table-nb-odd: #1b1d21;\n\t--table-nb-even: #23252a;\n\t--panel-bg: #272a30;\n\t--tree-header: #272a30;\n\t--tree-header-border: #3f4146;\n\t--form-text-disabled: #666;\n\t--form-border: #44464b;\n\t--form-border-disabled: #3a3c40;\n\t--form-bg: #151619;\n\t--form-bg-hover: #1e2024;\n\t--form-bg-disabled: #1e2024;\n\t--form-button: #31333a;\n\t--form-button-hover: #383a42;\n\t--form-button-active: #777;\n\t--form-button-disabled: #26272c;\n\t--diff-left: rgba(248,81,73,.17);\n\t--diff-del: rgba(248,81,73,.4);\n\t--diff-right: rgba(46,160,67,.17);\n\t--diff-ins: rgba(46,160,67,.4);\n\t--code-bg: #30343b;\n\t--checkerbox-bg: #30343b;\n\t--info: #9095a2;\n\t--active-bg: #1b325f;\n\t--active-border: #264787;\n\t--drag-bg: #1b325f;\n\t--legend: #747b8b;\n\t--serp-preview: #bdc1c6;\n\t--serp-preview-title: #8ab4f8;\n\t--nested-bg: #1e2024;\n}\n\nhtml[data-color-scheme=\"dark\"] .color-scheme--light, .color-scheme--dark {\n\tdisplay: none;\n}\n\nhtml[data-color-scheme=\"dark\"] .color-scheme--dark, .color-scheme--light {\n\tdisplay: initial;\n}\n\n/* HTML */\nhtml {\n\tfont-size: 100%;\n\t-webkit-text-size-adjust: 100%;\n}\n\n/* General */\nheader, footer, nav, section, aside, main, article, figure, figcaption {\n\tdisplay: block;\n}\n\nbody, h1, h2, h3, h4, p, figure, blockquote, dl {\n\tmargin: 0;\n}\n\nimg {\n\tborder: 0;\n}\n\ntable {\n\tborder-spacing: 0;\n\tborder-collapse: collapse;\n\tempty-cells: show;\n}\n\nth, td {\n\ttext-align: left;\n}\n\ninput, select, label, img, a.tl_submit, .tl_select {\n\tvertical-align: middle;\n}\n\nbutton {\n\tcursor: pointer;\n}\n\nbutton[disabled] {\n\tcursor: default;\n}\n\nnav ul, nav li {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n\n/* Font */\nbody {\n\tfont-family: -apple-system, system-ui, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n\tfont-weight: 400;\n\tfont-size: .875rem;\n\tline-height: 1;\n\tcolor: var(--text);\n}\n\nh1, h2, h3, h4, h5, h6, strong, b, th {\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\tbody {\n\t\tfont-weight: 300;\n\t}\n\n\th1, h2, h3, h4, h5, h6, strong, b, th {\n\t\tfont-weight: 500;\n\t}\n}\n\npre, code, .tl_textarea.monospace {\n\tfont: 300 .75rem/1.25 SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tfont-size: 1rem;\n}\n\ninput, textarea, select, button {\n\tfont: inherit;\n\tcolor: inherit;\n\tline-height: inherit;\n}\n\ninput, select {\n\tline-height: 17px; /* see #501 and #79 */\n}\n\n@supports (display:-ms-grid) {\n\tinput, select {\n\t\tline-height: 1.1;\n\t}\n}\n\n.tl_gray {\n\tcolor: var(--gray);\n}\n\n.tl_green {\n\tcolor: var(--green);\n}\n\n.tl_red {\n\tcolor: var(--red);\n}\n\n.tl_blue {\n\tcolor: var(--blue);\n}\n\n.tl_orange {\n\tcolor: var(--orange);\n}\n\nspan.mandatory {\n\tcolor: var(--red);\n}\n\n.upper {\n\ttext-transform: uppercase;\n}\n\n/* Basic elements */\na {\n\tcolor: var(--text);\n\ttext-decoration: none;\n}\n\na:hover, a:active {\n\tcolor: var(--contao);\n}\n\nhr {\n\theight: 1px;\n\tmargin: 18px 0;\n\tborder: 0;\n\tbackground: var(--border);\n\tcolor: var(--border);\n}\n\np {\n\tmargin-bottom: 1em;\n\tpadding: 0;\n}\n\n.hidden {\n\tdisplay: none !important;\n}\n\n.unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\t-webkit-touch-callout: none;\n}\n\n/* Tables */\ntable.with-border th, table.with-border td {\n\tborder: solid var(--border);\n\tborder-width: 1px 0;\n}\n\ntable.with-border th {\n\tbackground-color: var(--table-header);\n}\n\ntable.with-padding th, table.with-padding td {\n\tpadding: 6px;\n}\n\ntable.with-zebra th {\n\tbackground-color: var(--table-nb-header);\n}\n\ntable.with-zebra tbody tr:nth-child(odd) td {\n\tbackground-color: var(--table-nb-odd);\n}\n\ntable.with-zebra tbody tr:nth-child(even) td {\n\tbackground-color: var(--table-nb-even);\n}\n\n/* Invisible elements */\n.clear {\n\tclear: both;\n\theight: 0.1px;\n\tline-height: 0.1px;\n\tfont-size: 0.1px;\n}\n\n.cf:before, .cf:after {\n\tcontent: \" \";\n\tdisplay: table;\n}\n\n.cf:after {\n\tclear: both;\n}\n\n.invisible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n\n/* Widgets */\n.widget {\n\tmargin-left: 15px;\n\tmargin-right: 15px;\n\tposition: relative;\n}\n\n.widget {\n\tfont-size: 0;\n}\n\n.widget * {\n\tfont-size: .875rem;\n}\n\n.widget > div {\n\tfont-size: 0;\n}\n\n.widget > div > * {\n\tfont-size: .875rem;\n}\n\n.widget pre, .widget code {\n\tfont-size: .7rem;\n}\n\n.widget h3 {\n\tmin-height: 16px;\n}\n\n.widget h3 img {\n\tmargin-right: 3px;\n}\n\n.widget legend {\n\tpadding: 0;\n}\n\n.widget legend img {\n\tvertical-align: -1px;\n}\n\n.widget-captcha {\n\tdisplay: initial !important;\n}\n\n.widget p.info {\n\tmargin: 2px 0;\n\tpadding: 7px;\n\tbackground: var(--panel-bg);\n\tline-height: 1.3;\n\tborder-radius: 3px;\n}\n\n.widget picture {\n\tdisplay: contents;\n}\n\n/* Forms */\noptgroup {\n\tpadding-top: 3px;\n\tpadding-bottom: 3px;\n\tfont-style: normal;\n\tbackground: var(--form-bg);\n}\n\nfieldset.tl_checkbox_container, fieldset.tl_radio_container {\n\tborder: 0;\n\tmargin: 15px 0 1px;\n\tpadding: 0;\n}\n\nfieldset.tl_checkbox_container {\n\tline-height: 15px;\n}\n\nfieldset.tl_radio_container {\n\tline-height: 16px;\n}\n\nfieldset.tl_checkbox_container legend, fieldset.tl_radio_container legend {\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\tfieldset.tl_checkbox_container legend, fieldset.tl_radio_container legend {\n\t\tfont-weight: 500;\n\t}\n}\n\nfieldset.tl_checkbox_container .check-all {\n\tcolor: var(--gray);\n}\n\nfieldset.tl_checkbox_container button {\n\tvertical-align: middle;\n}\n\nfieldset.checkbox_container, fieldset.radio_container {\n\tborder: 0;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n/* Text fields */\n.tl_text {\n\twidth: 100%;\n}\n\n.tl_text_2, .tl_text_interval {\n\twidth: 49%;\n}\n\n.tl_text_3 {\n\twidth: 32.333%;\n}\n\n.tl_text_4 {\n\twidth: 24%;\n}\n\n.tl_textarea {\n\twidth: 100%;\n}\n\n.tl_text_unit {\n\twidth: 79%;\n}\n\n.tl_text_trbl {\n\twidth: 19%;\n}\n\n.tl_text, .tl_text_2, .tl_text_3, .tl_text_4, .tl_textarea, .tl_text_unit, .tl_text_trbl, .tl_text_interval {\n\theight: 30px;\n\tmargin: 3px 0;\n\tbox-sizing: border-box;\n\tpadding: 5px 6px 6px;\n\tborder: 1px solid var(--form-border);\n\tborder-radius: 2px;\n\tbackground-color: var(--form-bg);\n\t-moz-appearance: none;\n\t-webkit-appearance: none;\n}\n\n.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] {\n\tcolor: var(--form-text-disabled);\n\tbackground-color: var(--form-bg-disabled);\n\tborder: 1px solid var(--form-border-disabled);\n\tcursor: not-allowed;\n}\n\n.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] {\n\tbackground-color: var(--form-bg-disabled);\n\tborder: 1px solid var(--form-border-disabled);\n}\n\n.tl_textarea {\n\theight: 240px;\n\tpadding: 4px 6px;\n\tline-height: 1.45;\n}\n\n.tl_text_2, .tl_text_3, .tl_text_4, .tl_text_unit, .tl_text_trbl, .tl_text_interval {\n\tmargin-right: 1%;\n}\n\n.tl_text_2:last-child, .tl_text_3:last-child, .tl_text_4:last-child, .tl_text_trbl:last-child {\n\tmargin-right: 0;\n}\n\n.tl_text_field .tl_text_2 {\n\twidth: 49.5%;\n}\n\n.tl_imageSize_0 {\n\tmargin-left: 1%;\n}\n\ninput[type=\"search\"] {\n\theight: 27px;\n\tpadding-top: 0;\n\tpadding-bottom: 1px;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button {\n\t-webkit-appearance: none;\n\theight: 14px;\n\twidth: 14px;\n\tmargin-right: 0;\n\tbackground-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzc3NyI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiLz48L3N2Zz4=\");\n}\n\n@-moz-document url-prefix() {\n\t.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 {\n\t\tline-height: 18px;\n\t}\n}\n\n@media not all and (min-resolution: .001dpcm) {\n\t@supports (-webkit-appearance:none) {\n\t\t.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 {\n\t\t\tline-height: 16px;\n\t\t}\n\n\t\tinput[type=\"search\"] {\n\t\t\tpadding-right: 0;\n\t\t}\n\n\t\tinput[type=\"search\"]::-webkit-search-cancel-button {\n\t\t\tmargin: 7px 4px 0 0;\n\t\t}\n\t}\n}\n\n@supports (display:-ms-grid) {\n\t.tl_text, .tl_text_2, .tl_text_3, .tl_text_4, .tl_textarea, .tl_text_unit, .tl_text_trbl, .tl_text_interval {\n\t\tpadding: 4px 6px 5px;\n\t}\n}\n\n/* Select menus */\nselect {\n\ttext-transform: none;\n\t-moz-appearance: none;\n\t-webkit-appearance: none;\n}\n\nselect::-ms-expand {\n\tdisplay: none;\n}\n\nselect[multiple] {\n\theight: auto;\n}\n\n.tl_select, .tl_mselect, .tl_select_column {\n\twidth: 100%;\n}\n\n.tl_select_unit {\n\twidth: 20%;\n}\n\n.tl_select_interval {\n\twidth: 50%;\n}\n\n.tl_select, .tl_mselect, .tl_select_column, .tl_select_unit, .tl_select_interval {\n\theight: 30px;\n\tmargin: 3px 0;\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--form-border);\n\tpadding: 5px 22px 6px 6px;\n\tborder-radius: 2px;\n\tbackground: var(--form-bg) url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDUwMCA1MDAiPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMzEuNTIzIiB5MT0iNDIuNjMiIHgyPSIzNjguNDc4IiB5Mj0iMjc5LjU4NCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjYjNiM2IzIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOTk5Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBmaWxsPSJ1cmwoI2EpIiBkPSJNMjUwIDM5Ni42NjZjLTEuMTU1IDAtNC4xMS0xLjgzMi03LjExMy02Ljc1bC0xNjkuNi0yNzcuNDU1Yy0yLjUxNy00LjExNC0zLjE5LTYuOTgtMy4yOC04LjMxNC44MjctLjMzIDIuNTY1LS44MTIgNS42MjctLjgxMmgzNDguNzMzYzMuMDYzIDAgNC43OTguNDgyIDUuNjI3LjgxMi0uMDkgMS4zMzQtLjc2NiA0LjItMy4yOCA4LjMxNWwtMTY5LjYgMjc3LjQ1N2MtMy4wMDUgNC45MTctNS45NiA2Ljc1LTcuMTE0IDYuNzV6Ii8+PC9zdmc+\") right -16px top 3px no-repeat;\n\tbackground-origin: content-box;\n\tcursor: pointer;\n}\n\n.tl_select[disabled], .tl_mselect[disabled], .tl_select_column[disabled], .tl_select_unit[disabled], .tl_select_interval[disabled],\n.tl_select[readonly], .tl_mselect[readonly], .tl_select_column[readonly], .tl_select_unit[readonly], .tl_select_interval[readonly] {\n\tcolor: var(--form-text-disabled);\n\tbackground-color: var(--form-bg-disabled);\n\tborder: 1px solid var(--form-border-disabled);\n\tcursor: not-allowed;\n}\n\n.tl_select[multiple], .tl_mselect[multiple], .tl_select_column[multiple], .tl_select_unit[multiple], .tl_select_interval[multiple] {\n\tbackground-image: none;\n}\n\n@supports (display:-ms-grid) {\n\t.tl_select, .tl_mselect, .tl_select_column, .tl_select_unit, .tl_select_interval {\n\t\tpadding: 5px 18px 5px 2px;\n\t}\n}\n\n/* Checkboxes */\n.tl_checkbox {\n\tmargin: 0 1px 0 0;\n}\n\n.tl_tree_checkbox {\n\tmargin: 1px 1px 1px 0;\n}\n\n.tl_checkbox_single_container {\n\theight: 16px;\n\tmargin: 14px 0 1px;\n}\n\n.tl_checkbox_single_container label {\n\tmargin-left: 4px;\n\tmargin-right: 3px;\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_checkbox_single_container label {\n\t\tfont-weight: 500;\n\t}\n}\n\n/* Grouped checkboxes */\n.checkbox_toggler {\n\tfont-weight: 600;\n}\n\n.checkbox_toggler_first {\n\tmargin-top: 3px;\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.checkbox_toggler, .checkbox_toggler_first {\n\t\tfont-weight: 500;\n\t}\n}\n\n.checkbox_toggler img, .checkbox_toggler_first img {\n\tposition: relative;\n\ttop: -1px;\n\tmargin-right: 2px;\n}\n\n.checkbox_options {\n\tmargin: 0 0 6px 21px !important;\n}\n\n.tl_checkbox_container .checkbox_options:last-of-type {\n\tmargin-bottom: 0 !important;\n}\n\n/* Radio buttons */\n.tl_radio {\n\tmargin: 0 1px 0 0;\n}\n\n.tl_tree_radio {\n\tmargin: 1px 1px 1px 0;\n}\n\n/* Radio table */\n.tl_radio_table {\n\tmargin-top: 3px;\n}\n\n.tl_radio_table td {\n\tpadding: 0 24px 0 0;\n}\n\n/* Upload fields */\n.tl_upload_field {\n\tmargin: 1px 0;\n}\n\n/* Submit buttons */\n.tl_submit {\n\theight: 30px;\n\tpadding: 7px 12px;\n\tborder: 1px solid var(--form-border);\n\tborder-radius: 2px;\n\tbox-sizing: border-box;\n\tcursor: pointer;\n\tbackground: var(--form-button);\n\ttransition: background .2s ease;\n}\n\n.tl_submit:hover {\n\tcolor: inherit;\n\tbackground-color: var(--form-button-hover);\n}\n\n.tl_submit:active {\n\tcolor: var(--form-button-active);\n}\n\n.tl_submit:disabled {\n\tcolor: var(--gray);\n\tbackground: var(--form-button-disabled) !important;\n\tcursor: not-allowed;\n}\n\n.tl_panel .tl_submit, .tl_version_panel .tl_submit, .tl_formbody_submit .tl_submit {\n\tbackground: var(--form-bg);\n}\n\n.tl_panel .tl_submit:hover, .tl_version_panel .tl_submit:hover, .tl_formbody_submit .tl_submit:hover {\n\tbackground: var(--form-bg-hover);\n}\n\na.tl_submit {\n\tdisplay: inline-block;\n}\n\n/* Split buttons */\n.split-button {\n\tdisplay: inline-block;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.split-button ul, .split-button li {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n/* Placeholders */\n::-moz-placeholder {\n\tpadding-top: 1px;\n}\n\n::-webkit-input-placeholder {\n\tpadding-top: 1px;\n}\n\n/* Floats */\n.clr {\n\tclear: both;\n\twidth: calc(100% - 30px);\n}\n\n.clr:not(.widget) {\n\twidth: 100%;\n}\n\n.clr:before {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.w25, .w33, .w50, .w66, .w75 {\n\twidth: calc(50% - 30px);\n\tfloat: left;\n\tmin-height: 80px;\n}\n\n.nogrid .w25, .nogrid .w33, .nogrid .w50, .nogrid .w66, .nogrid .w75 {\n\tfloat: none;\n}\n\n.long {\n\twidth: calc(100% - 30px); /* see #6320 */\n}\n\n.wizard > a {\n\tposition: relative;\n\ttop: -2px;\n\tvertical-align: middle;\n}\n\n.wizard > .image-button {\n\tpadding: 0;\n\tborder: 0;\n\tbackground: none;\n\tvertical-align: middle;\n}\n\n.wizard .tl_text, .wizard .tl_select, .wizard .tl_image_size {\n\twidth: calc(100% - 24px);\n}\n\n.wizard .tl_text_2 {\n\twidth: 45%;\n}\n\n.wizard .tl_image_size {\n\tdisplay: inline-block;\n}\n\n.wizard img {\n\tmargin-left: 4px;\n}\n\n.wizard h3 img {\n\tmargin-left: 0;\n}\n\n.long .tl_text, .long .tl_select {\n\twidth: 100%;\n}\n\n.m12 {\n\tmargin: 0 15px;\n\tpadding: 18px 0 16px;\n}\n\n.nogrid .m12 {\n\tpadding: 0;\n}\n\n.cbx {\n\tmin-height: 46px;\n}\n\n.cbx.m12 {\n\tmin-height: 80px;\n\tbox-sizing: border-box;\n}\n\n.nogrid .cbx {\n\tmin-height: 32px;\n}\n\n.subpal {\n\tclear: both;\n}\n\n.inline div {\n\tdisplay: inline;\n}\n\n.autoheight {\n\theight: auto;\n}\n\n/* Tips */\n.tl_tip {\n\theight: 15px;\n\toverflow: hidden;\n\tcursor: help;\n}\n\n.tip {\n\tposition: relative;\n\tmax-width: 320px;\n\tpadding: 6px 9px;\n\tborder-radius: 2px;\n\tbackground: var(--invert-bg);\n\tz-index: 99;\n}\n\n.tip div {\n\tline-height: 1.3;\n}\n\n.tip div, .tip a, .tip span {\n\tcolor: var(--invert-text);\n}\n\n.tip:before {\n\tcontent: \"\";\n\theight: 6px;\n\tposition: absolute;\n\ttop: -13px;\n\tleft: 9px;\n\tborder-left: 7px solid transparent;\n\tborder-right: 7px solid transparent;\n\tborder-bottom: 7px solid var(--invert-bg);\n}\n\n.tip--rtl:before {\n\tleft: auto;\n\tright: 9px;\n}\n\n/* Row highlighting */\n.hover-div:hover, .hover-row:hover td, .hover-div:hover .limit_toggler, .hover-row:hover .limit_toggler {\n\tbackground-color: var(--hover-row) !important;\n}\n\n/* Badge */\n.badge-title {\n\tfloat: right;\n\tmargin-left: 8px;\n\tmargin-top: -8px;\n\tborder-radius: 8px;\n\tpadding: 2px 5px;\n\tbackground: var(--invert-bg);\n\tcolor: var(--invert-text);\n\tfont-size: .75rem;\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.badge-title {\n\t\tfont-weight: 500;\n\t}\n}\n\n/* Large screens */\n@media (min-width: 1280px) {\n\t.w25 {\n\t\twidth: calc(25% - 30px);\n\t}\n\n\t.w33 {\n\t\twidth: calc(33.3333% - 30px);\n\t}\n\n\t.w66 {\n\t\twidth: calc(66.6666% - 30px);\n\t}\n\n\t.w75 {\n\t\twidth: calc(75% - 30px);\n\t}\n\n\t#sbtog {\n\t\tdisplay: none;\n\t}\n\n\t.split-button ul {\n\t\tdisplay: inline-flex;\n\t\tclip: initial;\n\t\theight: auto;\n\t\tmargin: 0 0 0 -4px;\n\t\toverflow: initial;\n\t\tposition: initial;\n\t\twidth: auto;\n\t}\n\n\t.split-button li {\n\t\tmargin-left: 4px;\n\t}\n}\n\n/* Split button */\n@media (max-width: 1279px) {\n\t.split-button {\n\t\tdisplay: inline-flex;\n\t}\n\n\t.split-button ul {\n\t\tposition: absolute;\n\t\tright: 0;\n\t\tbottom: 20px;\n\t\tmin-width: 100%;\n\t\tbackground: var(--form-bg);\n\t\tborder: 1px solid var(--form-border);\n\t\tborder-radius: 2px;\n\t\tbox-sizing: border-box;\n\t\tpadding: 3px 0;\n\t\tmargin-bottom: 1em;\n\t}\n\n\t.split-button ul button {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t\ttext-align: left;\n\t\twhite-space: nowrap;\n\t}\n\n\t.split-button ul .tl_submit {\n\t\tmargin-top: 0;\n\t\tmargin-bottom: 0;\n\t\tbackground: var(--form-bg);\n\t}\n\n\t.split-button ul .tl_submit:hover {\n\t\tbackground: var(--form-button-hover);\n\t}\n\n\t.split-button ul:before {\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 0;\n\t\twidth: 0;\n\t\tposition: absolute;\n\t\tright: 4px;\n\t\tbottom: -12px;\n\t\tz-index: 89;\n\t\tborder: 6px inset transparent;\n\t\tborder-top: 6px solid var(--form-bg);\n\t}\n\n\t.split-button ul:after {\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 0;\n\t\twidth: 0;\n\t\tposition: absolute;\n\t\tright: 3px;\n\t\tbottom: -14px;\n\t\tz-index: 88;\n\t\tborder: 7px inset transparent;\n\t\tborder-top: 7px solid var(--form-border);\n\t}\n\n\t.split-button > button[type=\"submit\"] {\n\t\tposition: relative;\n\t\tborder-radius: 2px 0 0 2px;\n\t}\n\n\t.split-button > button[type=\"button\"] {\n\t\theight: 30px;\n\t\tmargin: 2px 0;\n\t\tpadding: 7px 4px;\n\t\tbackground: var(--form-bg);\n\t\tborder: 1px solid var(--form-border);\n\t\tborder-left: 0;\n\t\tborder-radius: 0 2px 2px 0;\n\t\tbox-sizing: border-box;\n\t\ttransition: background .2s ease;\n\t}\n\n\t.split-button > button[type=\"button\"].active, .split-button > button[type=\"button\"]:hover {\n\t\tbackground: var(--form-button-hover);\n\t}\n\n\t.split-button > button[type=\"button\"]:focus {\n\t\toutline: none;\n\t}\n}\n\n/* Handheld */\n@media (max-width: 767px) {\n\t.w25, .w33, .w50, .w66, .w75 {\n\t\tfloat: none;\n\t\twidth: calc(100% - 30px);\n\t}\n\n\t.m12 {\n\t\tpadding-top: 0;\n\t\tpadding-bottom: 0;\n\t}\n\n\t.cbx, .cbx.m12 {\n\t\tmin-height: auto;\n\t}\n\n\t.tip {\n\t\tmax-width: 80vw;\n\t}\n\n\t.tl_checkbox_container .tl_checkbox {\n\t\tmargin-top: 1px;\n\t\tmargin-bottom: 1px;\n\t}\n}\n","@import 'fonts.css';\n@import 'basic.css';\n\n/* Icons */\n:root {\n\t--icon-logo: url(\"icons/logo.svg\");\n\t--icon-profile: url(\"icons/profile_small.svg\");\n\t--icon-security: url(\"icons/shield_small.svg\");\n\t--icon-favorites: url(\"icons/favorites_small.svg\");\n\t--icon-logout: url(\"icons/exit.svg\");\n\t--icon-toggle-all: url(\"icons/chevron-right.svg\");\n\t--icon-alert: url(\"icons/alert.svg\");\n\t--icon-favorite: url(\"icons/favorite.svg\");\n\t--icon-favorite--active: url(\"icons/favorite_active.svg\");\n\t--icon-manual: url(\"icons/manual.svg\");\n\t--icon-color-scheme: url(\"icons/color_scheme.svg\");\n\t--icon-arrow-left: url(\"icons/arrow_left.svg\");\n\t--icon-arrow-right: url(\"icons/arrow_right.svg\");\n\t--icon-visible: url(\"icons/visible.svg\");\n\t--icon-invisible: url(\"icons/invisible.svg\");\n\t--icon-loading: url(\"icons/loading.svg\");\n}\n\nhtml[data-color-scheme=\"dark\"] {\n\t--icon-logo: url(\"icons/logo--dark.svg\");\n\t--icon-profile: url(\"icons/profile_small--dark.svg\");\n\t--icon-security: url(\"icons/shield_small--dark.svg\");\n\t--icon-favorites: url(\"icons/favorites_small--dark.svg\");\n\t--icon-logout: url(\"icons/exit--dark.svg\");\n\t--icon-toggle-all: url(\"icons/chevron-right--dark.svg\");\n\t--icon-alert: url(\"icons/alert--dark.svg\");\n\t--icon-favorite: url(\"icons/favorite--dark.svg\");\n\t--icon-favorite--active: url(\"icons/favorite_active--dark.svg\");\n\t--icon-manual: url(\"icons/manual--dark.svg\");\n\t--icon-color-scheme: url(\"icons/color_scheme--dark.svg\");\n\t--icon-arrow-left: url(\"icons/arrow_left--dark.svg\");\n\t--icon-arrow-right: url(\"icons/arrow_right--dark.svg\");\n\t--icon-visible: url(\"icons/visible--dark.svg\");\n\t--icon-invisible: url(\"icons/invisible--dark.svg\");\n\t--icon-loading: url(\"icons/loading--dark.svg\");\n}\n\n/* Account for the jump links bar */\nhtml {\n\tscroll-padding-top: 36px;\n\tscroll-behavior: smooth;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n\thtml {\n\t\tscroll-behavior: auto;\n\t}\n}\n\n/* Body */\nbody {\n\tbackground: var(--body-bg);\n\toverflow-y: scroll;\n}\n\nbody.popup {\n\tbackground: var(--content-bg);\n}\n\n/* Header */\n#header {\n\tmin-height: 40px;\n\ttext-align: left;\n\tbackground: var(--header-bg);\n}\n\n#header h1 {\n\tposition: absolute;\n}\n\n#header h1 a {\n\tdisplay: block;\n\theight: 16px;\n\tpadding: 12px 12px 12px 42px;\n\tbackground: var(--icon-logo) no-repeat 10px center;\n\tfont-weight: 400;\n}\n\n#header h1 a .app-title {\n\tfont-size: 17px;\n\tcolor: var(--header-text);\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#header h1 a {\n\t\tfont-weight: 300;\n\t}\n}\n\n#tmenu {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n}\n\n#tmenu li {\n\tposition: relative;\n}\n\n#tmenu a, #tmenu .profile button {\n\tmargin: 0;\n\tpadding: 13px 12px;\n\tdisplay: inline-block;\n}\n\n#tmenu sup {\n\tposition: absolute;\n\ttop: 5px;\n\tleft: 20px;\n\tfont-size: .6rem;\n\tcolor: var(--header-bg);\n\tbackground: var(--header-text);\n\tpadding: 2px;\n\tborder-radius: 2px;\n\ttext-indent: 0;\n\tfont-weight: 400;\n}\n\n#tmenu .burger {\n\tdisplay: none;\n}\n\n#tmenu .burger button {\n\tpadding: 8px 10px 9px;\n\tbackground: none;\n\tborder: 0;\n}\n\n#tmenu .burger svg {\n\tmargin-bottom: -1px;\n\tvertical-align: middle;\n}\n\n#tmenu .profile button {\n\tposition: relative;\n\tcursor: pointer;\n\tfont-size: .875rem;\n\tfont-weight: 400;\n\tborder: none;\n\tpadding-right: 26px;\n\tbackground: url(\"icons/chevron-down.svg\") right 9px top 14px no-repeat;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#tmenu .profile button {\n\t\tfont-weight: 300;\n\t}\n}\n\n#tmenu a, #tmenu .profile button, #tmenu .burger button {\n\tcolor: var(--header-text);\n\ttransition: background-color .3s ease;\n}\n\n#tmenu a:hover, #tmenu a.hover, #tmenu li:hover .profile button, #tmenu .active .profile button, #tmenu .burger button:hover {\n\tbackground-color: var(--header-bg-hover);\n}\n\n#tmenu ul.menu_level_1 {\n\tmin-width: 150px;\n\tposition: absolute;\n\tright: 6px;\n\tmargin-top: 5px;\n\tbackground: var(--content-bg);\n\tborder: 1px solid var(--content-border);\n\tbox-shadow: 0 1px 6px rgba(0,0,0,.2);\n\tz-index: 4; /* Above .jump-targets */\n\tcolor: var(--text);\n\ttext-align: left;\n\topacity: 0;\n\tvisibility: hidden;\n\ttransition: opacity .3s ease, visibility .3s ease;\n}\n\n#tmenu .active ul.menu_level_1 {\n\topacity: 1;\n\tvisibility: visible;\n}\n\n#tmenu ul.menu_level_1 li a {\n\tdisplay: block;\n\tcolor: inherit;\n\tpadding: 6px 20px 6px 40px;\n\twhite-space: nowrap;\n}\n\n#tmenu ul.menu_level_1 li a:hover {\n\tbackground-color: var(--nav-hover-bg);\n}\n\n#tmenu ul.menu_level_1 .info {\n\tcolor: var(--info);\n\tpadding: 15px 20px;\n\tborder-bottom: 1px solid var(--border);\n\tline-height: 1.4;\n\tmargin-bottom: 9px;\n\twhite-space: nowrap;\n}\n\n#tmenu ul.menu_level_1 strong {\n\tcolor: var(--text);\n\tdisplay: block;\n}\n\n#tmenu ul.menu_level_1:before {\n\tcontent: \"\";\n\tdisplay: block;\n\twidth: 0;\n\theight: 0;\n\tposition: absolute;\n\tright: 9px;\n\ttop: -14px;\n\tborder: 7px solid transparent;\n\tborder-bottom-color: var(--content-bg);\n}\n\n#tmenu ul.menu_level_1:after {\n\tcontent: \"\";\n\tdisplay: block;\n\twidth: 9px;\n\theight: 9px;\n\tposition: absolute;\n\ttop: -6px;\n\tright: 11px;\n\tborder-top: 1px solid var(--content-border);\n\tborder-right: 1px solid var(--content-border);\n\ttransform: rotateZ(-45deg);\n}\n\n#tmenu ul.menu_level_1 .logout {\n\tmargin-top: 9px;\n\tpadding: 6px 0;\n\tborder-top: 1px solid var(--border);\n}\n\n#tmenu .icon-alert, #tmenu .icon-favorite, #tmenu .icon-manual, #tmenu .icon-color-scheme {\n\twidth: 16px;\n\tmargin-bottom: -2px;\n\tposition: relative;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-indent: 28px; /* 16px width + 12px padding */\n}\n\n#tmenu .icon-alert {\n\tbackground: var(--icon-alert) center center no-repeat;\n}\n\n#tmenu .icon-favorite {\n\tbackground: var(--icon-favorite) center center no-repeat;\n}\n\n#tmenu .icon-favorite--active {\n\tbackground: var(--icon-favorite--active) center center no-repeat;\n}\n\n#tmenu .icon-manual {\n\tbackground: var(--icon-manual) center center no-repeat;\n}\n\n#tmenu .icon-color-scheme {\n\tbackground: var(--icon-color-scheme) center center no-repeat;\n}\n\n#tmenu .icon-profile {\n\tbackground: var(--icon-profile) 20px center no-repeat;\n}\n\n#tmenu .icon-security {\n\tbackground: var(--icon-security) 20px center no-repeat;\n}\n\n#tmenu .icon-favorites {\n\tbackground: var(--icon-favorites) 20px center no-repeat;\n}\n\n#tmenu .icon-logout {\n\tbackground: var(--icon-logout) 20px center no-repeat;\n}\n\n/* Container */\n#container {\n\tdisplay: flex;\n\tmin-height: calc(100vh - 40px);\n}\n\n.popup #container {\n\tpadding: 0;\n\twidth: auto;\n\tmin-height: 0;\n\tmax-width: none;\n}\n\n/* Left */\n#left {\n\twidth: 220px;\n\tbackground: var(--nav-bg);\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n#left .version {\n\tmargin-top: 4em;\n\tpadding: 15px 18px;\n\tfont-size: .75rem;\n\tline-height: 1.4;\n}\n\n#left .version, #left .version a {\n\tcolor: var(--nav-group);\n}\n\n/* Main */\n#main {\n\twidth: calc(100% - 220px);\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.popup #main {\n\tfloat: none;\n\twidth: auto;\n\tmax-width: none;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tdisplay: initial;\n}\n\n#main .content {\n\tmargin: 0 15px 15px;\n}\n\n#main .content {\n\tbackground: var(--content-bg);\n\tborder: 1px solid var(--content-border);\n}\n\n.popup #main .content {\n\tmargin: 0;\n\tborder: 0;\n}\n\n/* Navigation */\n#tl_navigation {\n\tflex-grow: 1;\n}\n\n#tl_navigation .menu_level_0 {\n\tpadding-top: 20px;\n}\n\n#tl_navigation .menu_level_0 > li:after {\n\tcontent: \"\";\n\twidth: calc(100% - 30px);\n\theight: 1px;\n\tdisplay: block;\n\tmargin: 15px auto;\n\tbackground: var(--nav-separator);\n}\n\n#tl_navigation .menu_level_0 > li.last:after {\n\tdisplay: none;\n}\n\n#tl_navigation .menu_level_0 a[class^=\"group-\"] {\n\tdisplay: block;\n\tmargin: 0 15px;\n\tpadding: 3px 3px 3px 22px;\n\tcolor: var(--nav-group);\n\tfont-size: .75rem;\n\ttext-transform: uppercase;\n\tfont-weight: 500;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#tl_navigation .menu_level_0 a[class^=\"group-\"] {\n\t\tfont-weight: 400;\n\t}\n}\n\n#tl_navigation .group-favorites {\n\tbackground: url(\"icons/favorites_group.svg\") 3px 2px no-repeat;\n}\n\n#tl_navigation .group-content {\n\tbackground: url(\"icons/content.svg\") 3px 2px no-repeat;\n}\n\n#tl_navigation .group-design {\n\tbackground: url(\"icons/monitor.svg\") 3px 2px no-repeat;\n}\n\n#tl_navigation .group-accounts {\n\tbackground: url(\"icons/person.svg\") 3px 2px no-repeat;\n}\n\n#tl_navigation .group-system {\n\tbackground: url(\"icons/wrench.svg\") 3px 2px no-repeat;\n}\n\n#tl_navigation .menu_level_1 {\n\tpadding-top: 5px;\n}\n\n#tl_navigation [class^=\"menu_level_\"] a {\n\tdisplay: block;\n\tpadding: 5px 33px 5px 37px;\n\tfont-weight: 400;\n\tcolor: var(--nav);\n\ttransition: color .2s ease;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#tl_navigation [class^=\"menu_level_\"] a {\n\t\tfont-weight: 300;\n\t}\n}\n\n#tl_navigation [class^=\"menu_level_\"] > li.current > a {\n\tbackground-color: var(--nav-current);\n\tborder-left: 4px solid var(--contao);\n}\n\n#tl_navigation .menu_level_1 > li.current > a {\n\tpadding-left: 33px;\n}\n\n#tl_navigation .menu_level_2 a {\n\tpadding-left: 49px;\n}\n\n#tl_navigation .menu_level_2 > li.current > a {\n\tpadding-left: 45px;\n}\n\n#tl_navigation .menu_level_3 a {\n\tpadding-left: 61px;\n}\n\n#tl_navigation .menu_level_3 > li.current > a {\n\tpadding-left: 57px;\n}\n\n#tl_navigation .menu_level_4 a {\n\tpadding-left: 73px;\n}\n\n#tl_navigation .menu_level_4 > li.current > a {\n\tpadding-left: 69px;\n}\n\n#tl_navigation .menu_level_5 a {\n\tpadding-left: 85px;\n}\n\n#tl_navigation .menu_level_5 > li.current > a {\n\tpadding-left: 81px;\n}\n\n#tl_navigation .menu_level_2 a {\n\tfont-size: .75rem;\n}\n\n#tl_navigation .menu_level_1 li.has-children:not(.first) {\n\tpadding-top: 5px;\n}\n\n#tl_navigation .menu_level_1 li.has-children:not(.last) {\n\tpadding-bottom: 5px;\n}\n\n#tl_navigation .menu_level_1 a:hover, #tl_navigation .menu_level_1 li.current > a {\n\tcolor: var(--nav-hover);\n\tbackground-color: var(--nav-current);\n}\n\n#tl_navigation .collapsed .menu_level_1 {\n\tdisplay: none;\n}\n\n/* Buttons */\n#tl_buttons {\n\tmargin: 0;\n\tpadding: 9px 15px;\n\ttext-align: right;\n}\n\n.toggleWrap {\n\tcursor: pointer;\n}\n\n.opacity {\n\t-moz-opacity: .8;\n\topacity: .8;\n}\n\n/* Data container */\n#main_headline {\n\tmargin: 18px 16px;\n\tfont-size: 1.1rem;\n\tdisplay: flex;\n}\n\n.popup #main_headline {\n\tdisplay: none;\n}\n\n#main_headline span {\n\tdisplay: inline-block;\n\tmax-width: max-content;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tline-height: 22px;\n\tflex: 1 0 0;\n}\n\n#main_headline span:nth-child(even) {\n\tfont-weight: 400;\n}\n\n#main_headline span + span::before {\n\tcontent: \"\\A0› \"; /* Non-breaking-space to prevent collapsing whitespace */\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#main_headline span:nth-child(even) {\n\t\tfont-weight: 300;\n\t}\n\n\t#main_headline span + span::before {\n\t\tfont-weight: 500;\n\t}\n}\n\nh2.sub_headline {\n\tmargin: 3px 18px;\n\tpadding: 7px 0;\n}\n\n.label-info {\n\tcolor: var(--gray);\n\tpadding-left: 3px;\n}\n\n.label-date {\n\tcolor: var(--gray);\n\tpadding-right: 3px;\n}\n\n.tl_gerror {\n\tmargin: 12px;\n\tpadding: 3px 0 3px 22px;\n\tbackground: url(\"icons/error.svg\") no-repeat left center;\n}\n\n.tl_error, .tl_confirm, .tl_info, .tl_new {\n\tmargin: 0 0 1px;\n\tpadding: 11px 18px 11px 32px;\n\tline-height: 1.3;\n}\n\n.tl_error {\n\tbackground: var(--error-bg) url(\"icons/error.svg\") no-repeat 11px 12px;\n}\n\n.tl_confirm {\n\tbackground: var(--confirm-bg) url(\"icons/ok.svg\") no-repeat 11px 12px;\n}\n\n.tl_info {\n\tbackground: var(--info-bg) url(\"icons/show.svg\") no-repeat 11px 12px;\n}\n\n.tl_new {\n\tbackground: var(--new-bg) url(\"icons/featured.svg\") no-repeat 11px 12px;\n}\n\n.tl_gerror, .tl_gerror a, .tl_error, .tl_error a {\n\tcolor: var(--red);\n}\n\n.tl_gerror a, .tl_error a {\n\ttext-decoration: underline;\n}\n\n.tl_confirm, .tl_confirm a {\n\tcolor: var(--green);\n}\n\n.tl_info, .tl_info a {\n\tcolor: var(--blue);\n}\n\n.tl_new, .tl_new a {\n\tcolor: var(--orange);\n}\n\n.widget .tl_error, .widget .tl_confirm, .widget .tl_info, .widget .tl_new {\n\tpadding: 8px 10px 8px 30px;\n\tbackground-position: 9px 9px;\n}\n\n.tl_error strong, .tl_confirm strong, .tl_info strong, .tl_new strong {\n\tcolor: inherit;\n}\n\n/* Filter */\n.tl_panel, .tl_version_panel {\n\tpadding: 4px 12px;\n\tbackground: var(--panel-bg);\n\tborder-bottom: 1px solid var(--content-border);\n\ttext-align: right;\n}\n\n.tl_version_panel {\n\tpadding: 8px 12px;\n}\n\n.tl_panel .tl_select {\n\ttext-align: left;\n}\n\n.tl_version_panel .tl_select {\n\tmax-width: 280px;\n}\n\n.tl_version_panel .tl_submit {\n\tvertical-align: middle;\n}\n\n.tl_version_panel .tl_formbody {\n\tposition: relative;\n}\n\n.tl_img_submit {\n\twidth: 16px;\n\theight: 16px;\n\tborder: 0;\n\tmargin: 0;\n\tpadding: 0;\n\ttext-indent: 16px; /* 16px width */\n\twhite-space: nowrap;\n\toverflow: hidden;\n\tposition: relative;\n\ttop: 9px;\n\tcursor: pointer;\n}\n\n.filter_apply {\n\tbackground: url(\"icons/filter-apply.svg\") center center no-repeat;\n}\n\n.filter_reset {\n\tbackground: url(\"icons/filter-reset.svg\") center center no-repeat;\n}\n\n.tl_subpanel {\n\tfloat: right;\n\tletter-spacing: -.31em;\n}\n\n.tl_subpanel * {\n\tletter-spacing: normal;\n}\n\n.tl_subpanel strong, .tl_search span {\n\tvertical-align: middle;\n}\n\n.tl_submit_panel {\n\tmin-width: 32px;\n\tpadding-left: 6px;\n\tpadding-right: 3px;\n}\n\n.tl_panel .active, .tl_panel_bottom .active, #search .active {\n\tbackground-color: var(--active-bg);\n}\n\n.tl_filter {\n\twidth: 100%;\n}\n\n.tl_filter .tl_select {\n\tmax-width: 14.65%;\n\tmargin-left: 3px;\n}\n\n.tl_submit_panel + .tl_filter {\n\twidth: 86%;\n}\n\n.tl_limit {\n\twidth: 22%;\n}\n\n.tl_limit .tl_select {\n\twidth: 52%;\n\tmargin-left: 3px;\n}\n\n.tl_search {\n\twidth: 40%;\n}\n\n.tl_search .tl_select {\n\twidth: 38%;\n\tmargin-left: 3px;\n\tmargin-right: 1%;\n}\n\n.tl_search .tl_text {\n\twidth: 30%;\n\tmargin-left: 1%;\n\t-webkit-appearance: textfield;\n\tbox-sizing: content-box;\n}\n\n.tl_sorting {\n\twidth: 26%;\n}\n\n.tl_sorting .tl_select {\n\twidth: 60%;\n\tmargin-left: 1%;\n}\n\n/* Jump targets */\n.jump-targets {\n\tmin-height: 30px;\n\tpadding-top: 1px;\n\tbackground: var(--panel-bg);\n\tborder-bottom: 1px solid var(--content-border);\n\tposition: sticky;\n\ttop: 0;\n\tz-index: 3; /* Above TinyMCE */\n}\n\n.jump-targets .inner {\n\toverflow-x: scroll;\n\tscrollbar-width: none;\n}\n\n.jump-targets .inner::-webkit-scrollbar {\n\tdisplay: none;\n}\n\n.jump-targets ul {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n\twhite-space: nowrap;\n}\n\n.jump-targets li {\n\tdisplay: inline-block;\n\tpadding: 9px 10px;\n\twhite-space: nowrap;\n\tfont-size: .75rem;\n}\n\n.jump-targets button {\n\tpadding: 0;\n\tbackground: none;\n\tborder: none;\n}\n\n.jump-targets:before, .jump-targets:after {\n\tcontent: \"\";\n\tdisplay: block;\n\twidth: 10px;\n\theight: 100%;\n\tposition: absolute;\n\ttop: 0;\n}\n\n.jump-targets:before {\n\tbackground: linear-gradient(-90deg, transparent 0, var(--panel-bg) 50%);\n}\n\n.jump-targets:after {\n\tright: 0;\n\tbackground: linear-gradient(90deg, transparent 0, var(--panel-bg) 50%);\n}\n\n/* Boxes */\n.tl_xpl {\n\tpadding: 0 18px;\n}\n\n.tl_tbox, .tl_box {\n\tpadding: 12px 0 25px;\n\tborder-bottom: 1px solid var(--border);\n}\n\n.tl_tbox:last-child, .tl_box:last-child {\n\tborder-bottom: 0;\n}\n\n.tl_box h3, .tl_tbox h3, .tl_xpl h3 {\n\tmargin: 0;\n\tpadding-top: 13px;\n\theight: 16px;\n\tfont-size: .875rem;\n}\n\n.tl_box h4, .tl_tbox h4 {\n\tmargin: 6px 0 0;\n\tpadding: 0;\n\tfont-size: .875rem;\n}\n\n.tl_tbox.theme_import {\n\tpadding-left: 15px;\n\tpadding-right: 15px;\n}\n\n.tl_tbox.theme_import h3, .tl_tbox.theme_import h4, .tl_tbox.theme_import p {\n\tline-height: 1.3;\n}\n\n.tl_help, .tl_help * {\n\tfont-size: .75rem;\n}\n\n.tl_help, .tl_help a {\n\tmargin-bottom: 0;\n\tline-height: 1.2;\n\tcolor: var(--info);\n}\n\n.tl_help a:hover, .tl_help a:focus, .tl_help a:active {\n\ttext-decoration: underline;\n}\n\n#tl_buttons + .tl_edit_form .tl_formbody_edit {\n\tborder-top: 1px solid var(--border);\n}\n\n.tl_formbody_submit {\n\tborder-top: 1px solid var(--content-border);\n\tposition: sticky;\n\tbottom: 0;\n\tz-index: 3; /* Above TinyMCE */\n}\n\n.tl_submit_container {\n\tpadding: 8px 12px;\n\tbackground: var(--panel-bg);\n}\n\n.tl_submit_container .tl_submit {\n\tmargin: 2px 0;\n}\n\n/* Maintenance */\n.maintenance_active {\n\tpadding-top: 12px;\n}\n\n.maintenance_active, .maintenance_inactive {\n\tborder-top: 1px solid var(--border);\n}\n\n.maintenance_inactive .tl_tbox {\n\tborder: 0 !important;\n\tpadding: 6px 15px 14px;\n}\n\n.maintenance_inactive .tl_message {\n\tmargin: 0 15px 3px;\n}\n\n.maintenance_inactive h2.sub_headline {\n\tmargin: 16px 15px 3px;\n}\n\n.maintenance_inactive .tl_submit_container {\n\tbackground: none;\n\tpadding: 0 15px 24px;\n\tborder: 0;\n}\n\n/* Crawler */\n@keyframes crawl-progress-bar-stripes {\n\t0% {\n\t\tbackground-position-x: 1rem;\n\t}\n}\n\n#tl_crawl .tl_message {\n\tmargin-bottom: 24px;\n}\n\n#tl_crawl .tl_message > p {\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\tbackground-color: transparent;\n\tbackground-position-y: center;\n}\n\n#tl_crawl .tl_tbox {\n\tmargin-top: 0;\n\tpadding-top: 0;\n\tpadding-right: 0;\n\tpadding-left: 0;\n}\n\n#tl_crawl .tl_checkbox_container {\n\tmargin-top: 6px;\n}\n\n#tl_crawl .inner {\n\tposition: relative;\n\tmargin: 0 18px 18px;\n}\n\n#tl_crawl .progress {\n\tdisplay: flex;\n\theight: 20px;\n\tbackground-color: var(--tree-header);\n\tborder-radius: 2px;\n}\n\n#tl_crawl .progress-bar {\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\tcolor: white;\n\ttext-align: center;\n\twhite-space: nowrap;\n\tbackground-size: 10px 10px;\n}\n\n#tl_crawl .progress-bar.running {\n\tbackground-color: var(--progress-running);\n\tbackground-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);\n\tanimation: crawl-progress-bar-stripes 1s linear infinite;\n}\n\n#tl_crawl .progress-bar.finished {\n\tbackground-color: var(--progress-finished);\n}\n\n#tl_crawl .progress-count {\n\tmargin: 6px 0 24px;\n}\n\n#tl_crawl .results h3 {\n\tfont-size: .9rem;\n\tmargin: 18px 0 9px;\n}\n\n#tl_crawl .results p {\n\tmargin-bottom: 6px;\n}\n\n#tl_crawl .crawl-hint {\n\tmargin-top: -2px;\n\tline-height: 1.3;\n}\n\n#tl_crawl .crawl-hint a {\n\ttext-decoration: underline;\n}\n\n#tl_crawl .subscriber-log {\n\tdisplay: none;\n\tpadding: 5px 0;\n\tmargin-bottom: 0;\n}\n\n#tl_crawl .wait {\n\tmargin-top: 9px;\n\tcolor: var(--gray);\n}\n\n#tl_crawl .debug-log {\n\tdisplay: none;\n\tmargin-top: 11px;\n}\n\n#tl_crawl .results.running .show-when-finished, #tl_crawl .results.finished .show-when-running {\n\tdisplay: none;\n}\n\n#tl_crawl .results.running .show-when-running, #tl_crawl .results.finished .show-when-finished {\n\tdisplay: block;\n}\n\n#tl_crawl .result .summary.success {\n\tcolor: var(--green);\n}\n\n#tl_crawl .result .summary.failure {\n\tcolor: var(--red);\n}\n\n#tl_crawl .result .warning {\n\tdisplay: none;\n\tcolor: var(--blue);\n}\n\n/* Two-factor */\n.two-factor {\n\tborder-top: 1px solid var(--border);\n\tpadding-bottom: 9px;\n}\n\n.two-factor h2.sub_headline {\n\tmargin: 18px 15px 3px;\n}\n\n.two-factor > p {\n\tmargin: 0 15px 12px;\n\tline-height: 1.3;\n}\n\n.two-factor li {\n\tmargin-left: 2em;\n\tlist-style: initial;\n}\n\n.two-factor .qr-code {\n\tmargin: 0 15px;\n}\n\n.two-factor .qr-code img {\n\tborder: 3px solid #fff;\n}\n\n.two-factor .tl_listing_container {\n\tmargin-top: 6px;\n}\n\n.two-factor .widget {\n\theight: auto;\n\tmargin: 15px 15px 12px;\n}\n\n.two-factor .widget .tl_error {\n\tmargin: 0;\n\tpadding: 1px 0;\n\tbackground: none;\n\tfont-size: .75rem;\n\tline-height: 1.25;\n}\n\n.two-factor .tl_submit_container {\n\tbackground: none;\n\tpadding: 0 15px 10px;\n\tborder: 0;\n}\n\n.two-factor .submit_container {\n\tclear: both;\n\tmargin: 0 15px 12px;\n}\n\n.two-factor .tl_message {\n\tmargin: 0 15px 12px;\n}\n\n.two-factor .tl_message > p {\n\tpadding: 0 3px 0 27px;\n\tbackground-color: transparent;\n\tbackground-position: 3px center;\n}\n\n.two-factor .tl_backup_codes > p, .two-factor .tl_trusted_devices > p {\n\tmargin: 0 15px 12px;\n\tline-height: 1.3;\n}\n\n.two-factor .backup-codes {\n\tmax-width: 224px;\n\tmargin: 15px 15px 24px;\n\tpadding: 0;\n\tdisplay: grid;\n\tgrid-template-columns:repeat(2, 1fr);\n}\n\n.two-factor .backup-codes li {\n\tmargin: 0;\n\tlist-style: none;\n}\n\n.two-factor .tl_trusted_devices th, .two-factor .tl_trusted_devices td {\n\tline-height: 16px;\n}\n\n/* Picker search */\n#search {\n\tmargin: 18px 18px -9px;\n\ttext-align: right;\n}\n\n#search .tl_text {\n\tmax-width: 160px;\n\t-webkit-appearance: textfield;\n\tbox-sizing: content-box;\n}\n\n/* Preview image */\n.tl_edit_preview {\n\tmargin-top: 18px;\n}\n\n.tl_edit_preview img {\n\tmax-width: 100%;\n\theight: auto;\n\tpadding: 2px;\n\tborder: 1px solid var(--content-border);\n\tbackground: var(--white);\n}\n\n.tl_edit_preview_enabled {\n\tposition: relative;\n\tcursor: crosshair;\n\tdisplay: inline-block;\n}\n\n.tl_edit_preview_important_part {\n\tposition: absolute;\n\tmargin: -1px;\n\tborder: 1px solid var(--black);\n\tbox-shadow: 0 0 0 1px var(--white), inset 0 0 0 1px var(--white);\n\topacity: 0.5;\n}\n\n/* Listing */\ntable.tl_listing {\n\twidth: 100%;\n}\n\n.tl_listing_container {\n\tmargin: 18px 0;\n\tpadding: 0 15px;\n}\n\n#tl_buttons + .tl_listing_container, #tl_buttons + .tl_form .tl_listing_container {\n\tmargin-top: 12px;\n}\n\n#paste_hint + .tl_listing_container {\n\tmargin-top: 36px;\n}\n\n.tl_folder_list, .tl_folder_tlist {\n\tpadding: 6px;\n\tborder-bottom: 1px solid var(--border);\n\tbackground: var(--table-header);\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_folder_list, .tl_folder_tlist {\n\t\tfont-weight: 500;\n\t}\n}\n\n.tl_folder_tlist {\n\tline-height: 16px;\n\tborder-top: 1px solid var(--border);\n}\n\n.tl_file, .tl_file_list {\n\tpadding: 5px 6px;\n\tborder-bottom: 1px solid var(--border);\n\tbackground: var(--content-bg);\n}\n\n.tl_file_list .ellipsis {\n\theight: 16px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tpadding-right: 18px;\n\tword-break: break-all;\n}\n\n.tl_right_nowrap {\n\tpadding: 6px;\n\tvertical-align: top;\n\ttext-align: right;\n\twhite-space: nowrap;\n}\n\n.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 {\n\tbackground-image: linear-gradient(90deg, transparent calc(100% - 26px), var(--tree-header) 26px);\n}\n\n.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 {\n\tmargin-top: 2px;\n\tmargin-left: 8px;\n}\n\n.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 {\n\tvisibility: hidden;\n}\n\n.tl_listing_container.picker div[class^=\"ce_\"] {\n\tpadding-right: 24px;\n}\n\n.tl_listing_container.picker .limit_toggler {\n\twidth: calc(100% - 26px);\n}\n\n/* List view */\n.list_view .tl_listing img.theme_preview {\n\tmargin-right: 9px;\n}\n\n.tl_show {\n\twidth: 96%;\n\tmargin: 18px 2%;\n\tpadding: 9px 0 18px;\n}\n\n.tl_show + .tl_show {\n\tmargin-top: 36px;\n}\n\n.tl_show th, .tl_show td {\n\tline-height: 16px;\n\twhite-space: pre-line;\n}\n\n.tl_show td:first-child {\n\twidth: 34%;\n\twhite-space: normal;\n}\n\n.tl_show td p:last-of-type {\n\tmargin-bottom: 0;\n}\n\n.tl_show small {\n\tdisplay: block;\n\tcolor: var(--info);\n}\n\n.tl_label {\n\tmargin-right: 12px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n\n.tl_label small {\n\tfont-weight: 400;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_label {\n\t\tfont-weight: 500;\n\t}\n\n\t.tl_label small {\n\t\tfont-weight: 300;\n\t}\n}\n\n.tl_empty {\n\tmargin: 0;\n\tpadding: 18px;\n}\n\n.tl_empty_parent_view {\n\tmargin: 0;\n\tpadding: 18px 0 0;\n}\n\n.tl_listing_container + .tl_empty {\n\tmargin-top: -18px;\n}\n\n.tl_noopt {\n\tmargin: 0 0 -1px;\n}\n\n.tl_select_trigger {\n\tmargin-top: -9px;\n\tpadding: 0 6px 3px 0;\n\ttext-align: right;\n}\n\n.tl_radio_reset {\n\tmargin-top: 6px;\n\tpadding: 0 6px 3px 0;\n\ttext-align: right;\n}\n\n.tl_select_label, .tl_radio_label {\n\tmargin-right: 2px;\n\tcolor: var(--gray);\n\tfont-size: .75rem;\n}\n\n/* Parent view */\n.tl_header {\n\tmargin-bottom: 18px;\n\tpadding: 10px;\n\tbackground: var(--table-header);\n}\n\n.tl_header_table {\n\tline-height: 1.3;\n}\n\n.tl_content_header {\n\tpadding: 7px 6px;\n\tborder-bottom: 1px solid var(--border);\n\tbackground: var(--table-header);\n\tfont-weight: 600;\n}\n\n.tl_header + .tl_content_header {\n\tborder-top: 1px solid var(--border);\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_content_header {\n\t\tfont-weight: 500;\n\t}\n}\n\n.as-grid .tl_content_header {\n\tmargin-top: 24px;\n\tpadding: 0 1px;\n\tborder: 0;\n\tbackground-color: transparent;\n\tfont-size: 1rem;\n}\n\n.tl_content {\n\tborder-bottom: 1px solid var(--border);\n\tposition: relative;\n}\n\n.tl_content .inside {\n\tpadding: 6px;\n\tbackground-color: var(--content-bg);\n}\n\n.tl_content.draft .inside {\n\tmin-height: 16px;\n}\n\n.tl_content.draft > *, .tl_folder.draft > *, .tl_file.draft > *, .hover-row.draft > td {\n\topacity: 0.5;\n}\n\n.as-grid .tl_content {\n\tmargin-top: 18px;\n\tpadding: 0;\n\tborder: 1px solid var(--border);\n\tbackground-color: var(--content-bg);\n}\n\n.as-grid .tl_content .inside {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr auto;\n}\n\n.as-grid .tl_content_header + .tl_content {\n\tmargin-top: 12px;\n}\n\n.parent_view > ul {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.parent_view:not(.as-grid) > ul {\n\tbackground-color: var(--table-header);\n}\n\n.tl_content.indent_1 {\n\tmargin-left: 20px;\n}\n\n.tl_content.indent_2 {\n\tmargin-left: 40px;\n}\n\n.tl_content.indent_3 {\n\tmargin-left: 60px;\n}\n\n.tl_content.indent_4 {\n\tmargin-left: 80px;\n}\n\n.tl_content.indent_5 {\n\tmargin-left: 100px;\n}\n\n.as-grid .tl_content .inside {\n\tpadding: 0;\n}\n\n.as-grid .tl_content.indent {\n\tmargin: 0;\n\tpadding: 15px 15px 0;\n\tborder-width: 0 1px;\n\tbackground: var(--nested-bg);\n}\n\n.as-grid .tl_content.indent_2 {\n\tpadding-left: 30px;\n\tpadding-right: 30px;\n}\n\n.as-grid .tl_content.indent_3 {\n\tpadding-left: 45px;\n\tpadding-right: 45px;\n}\n\n.as-grid .tl_content.indent_4 {\n\tpadding-left: 60px;\n\tpadding-right: 60px;\n}\n\n.as-grid .tl_content.indent_5 {\n\tpadding-left: 75px;\n\tpadding-right: 75px;\n}\n\n.as-grid .tl_content.indent_last {\n\tpadding-bottom: 15px;\n}\n\n.as-grid .tl_content.indent .inside {\n\tborder: 1px solid var(--border);\n}\n\n.as-grid .tl_content.wrapper_stop {\n\tmargin-top: 0;\n}\n\n.as-grid .tl_content.indent.wrapper_stop {\n\tpadding-top: 0;\n}\n\n.tl_content_left {\n\tline-height: 16px;\n}\n\n.as-grid .tl_content_left {\n\tpadding: 8px 10px;\n}\n\n.tl_content_right {\n\tposition: relative;\n\tz-index: 1;\n\tfloat: right;\n\ttext-align: right;\n\tmargin-left: 12px;\n\tmargin-bottom: -1px;\n}\n\n.as-grid .tl_content .tl_content_right {\n\torder: 2;\n\tfloat: none;\n\tmargin-left: 0;\n\tmargin-bottom: 0;\n\tpadding: 8px 10px;\n\tborder-left: 1px solid var(--border);\n\tbackground: var(--table-header);\n}\n\n.tl_right button, .tl_content_right button {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\theight: 16px;\n\tbackground: none;\n}\n\n.cte_type {\n\tmargin: 0 0 4px;\n\tfont-size: .75rem;\n\tcolor: var(--info);\n\tline-height: 16px;\n}\n\n.as-grid .cte_type {\n\torder: 1;\n\tmargin-bottom: 0;\n\tpadding: 8px 10px;\n\tbackground-color: var(--table-header);\n\tfont-size: .8rem;\n}\n\n.cte_type.published, .cte_type.published a {\n\tcolor: var(--green);\n}\n\n.cte_type.unpublished, .cte_type.unpublished a {\n\tcolor: var(--red);\n}\n\n.cte_type.icon-protected {\n\tpadding-left: 27px;\n\tbackground: var(--table-header) url(\"icons/protected.svg\") 8px center no-repeat;\n}\n\n.cte_type .visibility {\n\tcolor: var(--gray);\n}\n\n.cte_preview {\n\tline-height: 1.25;\n\tposition: relative;\n}\n\n.cte_preview h1 {\n\tfont-size: 1.25rem;\n\tmargin-bottom: 6px;\n}\n\n.cte_preview h2 {\n\tfont-size: 1rem;\n\tmargin-bottom: 6px;\n}\n\n.cte_preview h3 {\n\tfont-size: .9rem;\n\tmargin-bottom: 6px;\n}\n\n.cte_preview h4, .cte_preview h5, .cte_preview h6 {\n\tfont-size: .875rem;\n\tmargin-bottom: 6px;\n}\n\n.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 {\n\tmargin-bottom: 6px;\n}\n\n.cte_preview img {\n\tmax-width: 320px;\n\theight: auto;\n\tpadding: 6px 0;\n}\n\n.cte_preview th, .cte_preview td {\n\tpadding: 3px 6px;\n\tborder-bottom: 1px solid var(--border);\n}\n\n.cte_preview th {\n\tpadding: 6px;\n\tbackground: var(--table-header);\n}\n\n.cte_preview td {\n\tbackground: var(--content-bg);\n}\n\n.cte_preview table caption {\n\ttext-align: left;\n\tfont-size: .75rem;\n}\n\n.cte_preview pre {\n\tmargin-top: 0;\n\tmargin-bottom: 6px;\n\tword-break: break-all;\n\twhite-space: pre-wrap;\n}\n\n.cte_preview pre.disabled {\n\tcolor: var(--pre-disabled);\n}\n\n.cte_preview .content-gallery ul {\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 1fr;\n\tlist-style: none;\n}\n\n.cte_preview a {\n\tcolor: var(--green);\n}\n\n.cte_preview div.tl_gray a {\n\tcolor: var(--gray);\n}\n\n.cte_preview span.comment {\n\tcolor: var(--blue);\n\tdisplay: inline-block;\n\tmargin-bottom: 3px;\n}\n\n.cte_preview input, .cte_preview select, .cte_preview textarea, .cte_preview button {\n\tbackground: var(--form-bg);\n\tborder: 1px solid var(--form-border);\n}\n\n.cte_preview input[type=\"file\"] {\n\tposition: relative;\n}\n\n.cte_preview select {\n\t-moz-appearance: menulist;\n\t-webkit-appearance: menulist;\n}\n\n.cte_preview label, .cte_preview .checkbox_container legend, .cte_preview .radio_container legend {\n\tdisplay: block;\n\tmargin-bottom: 6px;\n}\n\n.cte_preview .widget {\n\tmargin: 0 0 6px;\n}\n\n.cte_preview .checkbox_container label, .cte_preview .radio_container label {\n\tdisplay: initial;\n}\n\n.cte_preview .widget-captcha {\n\tdisplay: block !important;\n}\n\n.cte_preview .widget-captcha .captcha_text {\n\tpadding-left: 3px;\n\tvertical-align: middle;\n}\n\n.cte_preview.empty {\n\tdisplay: none;\n}\n\n.as-grid .cte_preview {\n\torder: 3;\n\tgrid-column: 1 / span 2;\n\tpadding: 10px 10px 6px;\n\tborder-top: 1px solid var(--border);\n}\n\n/* Backwards compatibility */\n.limit_height {\n\toverflow: hidden;\n}\n\n.limit_toggler {\n\twidth: 100%;\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tbackground: var(--content-bg);\n\tline-height: 11px;\n\ttext-align: center;\n}\n\n.limit_toggler button {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: var(--content-bg);\n\twidth: 24px;\n\tline-height: 8px;\n\tcolor: var(--gray);\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n}\n\n.limit_toggler button span {\n\tposition: relative;\n\ttop: -4px;\n\tz-index: 1;\n}\n\n/* Tree view */\n.tl_folder_top {\n\tpadding: 5px 6px;\n\tborder: solid var(--tree-header-border);\n\tborder-width: 1px 0;\n\tbackground: var(--tree-header);\n}\n\n.tl_folder {\n\tpadding: 5px 6px;\n\tborder-bottom: 1px solid var(--border);\n\tbackground: var(--table-header);\n}\n\n.tl_folder.tl_folder_dropping, .tl_folder_top.tl_folder_dropping {\n\tbackground-color: var(--drag-bg) !important;\n\tcolor: var(--text) !important;\n}\n\n.tl_folder.tl_folder_dropping a, .tl_folder_top.tl_folder_dropping a {\n\tcolor: inherit;\n}\n\n.tl_listing .tl_left {\n\tflex-grow: 1;\n\tbox-sizing: border-box;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tline-height: normal;\n}\n\n.tl_listing .tl_left.tl_left_dragging {\n\tposition: absolute;\n\tbackground: var(--drag-bg);\n\tborder-radius: 10px;\n\tcolor: var(--text);\n\tpadding: 5px 10px !important;\n\tmargin-left: 0;\n\ttext-indent: 0;\n\twhite-space: nowrap;\n}\n\n.tl_listing .tl_left.tl_left_dragging .preview-image, .tl_listing .tl_left.tl_left_dragging a img {\n\tdisplay: none;\n}\n\n.tl_listing .tl_left.tl_left_dragging a, .tl_listing .tl_left.tl_left_dragging .tl_gray {\n\tcolor: inherit;\n}\n\n.tl_listing_dragging .hover-div:not(.tl_folder):hover {\n\tbackground-color: transparent !important;\n}\n\n.tl_listing .tl_left * {\n\tvertical-align: text-top;\n}\n\n.tl_listing .tl_left a:hover {\n\tcolor: var(--text);\n}\n\n.tl_tree_xtnd .tl_file {\n\tpadding-top: 5px;\n\tpadding-bottom: 5px;\n}\n\n.tl_tree_xtnd .tl_file .tl_left img {\n\tmargin-right: 2px;\n}\n\n.tl_file_manager .preview-image {\n\tmax-width: 100px;\n\tmax-height: 75px;\n\twidth: auto;\n\theight: auto;\n\tmargin: 0 0 2px 22px;\n}\n\n.tl_file_manager .preview-important {\n\tmax-width: 80px;\n\tmax-height: 60px;\n\twidth: auto;\n\theight: auto;\n\tmargin: 0 0 2px 0;\n\tvertical-align: bottom;\n}\n\n.tl_listing .tl_right {\n\tpadding: 1px 0 0 9px;\n\twhite-space: nowrap;\n}\n\n@-moz-document url-prefix() {\n\t.tl_listing .tl_right {\n\t\tpadding-top: 0;\n\t}\n}\n\n.tl_listing, .tl_listing ul {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.tl_listing li {\n\tdisplay: flex;\n\tmargin: 0;\n\tlist-style-type: none;\n}\n\n.tl_listing li.parent {\n\tdisplay: inline;\n\tpadding-left: 0;\n\tpadding-right: 0;\n}\n\nlabel.tl_change_selected {\n\tmargin-right: 2px;\n\tcolor: var(--gray);\n\tfont-size: .75rem;\n}\n\n/* Breadcrumb */\n#tl_breadcrumb {\n\tmargin: 0 0 12px;\n\tpadding: 4px 6px;\n\tdisplay: flow-root;\n\tbackground: var(--active-bg);\n\tborder: 1px solid var(--active-border);\n\tborder-radius: 2px;\n\tline-height: 24px;\n}\n\n#tl_breadcrumb li {\n\tmargin: 0;\n\tpadding: 0 3px;\n\tlist-style-type: none;\n\tfloat: left;\n}\n\n#tl_breadcrumb li a {\n\tdisplay: inline-block;\n}\n\n#tl_breadcrumb li img {\n\twidth: 16px;\n\theight: 16px;\n\tvertical-align: -3px;\n}\n\n/* Picker */\n.selector_container {\n\tmargin-top: 1px;\n\tposition: relative;\n}\n\n.selector_container > ul {\n\tmargin: 0 0 1px;\n\tpadding: 0;\n\tlist-style-type: none;\n}\n\n.selector_container > ul > li {\n\tmargin: 0 9px 0 0;\n\tpadding: 2px 0;\n}\n\n.selector_container p {\n\tmargin-bottom: 1px;\n}\n\n.selector_container ul:not(.sgallery) img {\n\tmargin-right: 1px;\n\tvertical-align: text-top;\n}\n\n.selector_container img {\n\tmax-width: 320px;\n\theight: auto;\n}\n\n.selector_container .limit_height {\n\theight: auto !important;\n\tmax-height: 190px;\n}\n\n.selector_container .limit_toggler {\n\tdisplay: none;\n}\n\n.selector_container h1, .selector_container h2, .selector_container h3, .selector_container h4 {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.selector_container pre {\n\twhite-space: pre-wrap;\n}\n\n.selector_container table.showColumns {\n\tmargin: 2px 0 3px;\n}\n\n.selector_container table.sortable td {\n\tcursor: move;\n}\n\nul.sgallery {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fill, 100px);\n\tgrid-auto-rows: 75px;\n\tgap: 4px;\n\tpadding: 2px 0;\n}\n\nul.sgallery li {\n\tmin-width: 100px;\n\tmin-height: 75px;\n\tmargin: 0;\n\tpadding: 0;\n\tbackground: var(--form-button);\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n\t-webkit-align-items: center;\n\talign-items: center;\n\t-webkit-justify-content: center;\n\tjustify-content: center;\n}\n\n/* Welcome screen */\n.popup #tl_soverview {\n\tmargin-top: 15px;\n}\n\n#tl_soverview > div {\n\tpadding: 5px 15px;\n\tborder-bottom: 1px solid var(--border);\n}\n\n#tl_soverview > div:last-child {\n\tborder-bottom: 0;\n}\n\n#tl_messages h2, #tl_shortcuts h2 {\n\tmargin: 14px 0 10px;\n}\n\n#tl_versions h2 {\n\tmargin: 14px 0 12px;\n}\n\n#tl_messages p {\n\tmargin-bottom: .5em;\n}\n\n#tl_messages p:last-child {\n\tmargin-bottom: 1em;\n}\n\n#tl_messages .tl_error, #tl_messages .tl_confirm, #tl_messages .tl_info, #tl_messages .tl_new {\n\tpadding: 0 0 0 21px;\n\tbackground-position: left 1px;\n\tbackground-color: transparent;\n}\n\n#tl_shortcuts p a {\n\ttext-decoration: underline;\n}\n\n#tl_versions {\n\tmargin-bottom: 0;\n}\n\n#tl_versions table {\n\twidth: 100%;\n\tmargin-bottom: 18px;\n}\n\n#tl_versions th, #tl_versions td {\n\tpadding: 6px;\n}\n\n#tl_versions th {\n\tline-height: 16px;\n}\n\n#tl_versions td:first-child {\n\twhite-space: nowrap;\n}\n\n#tl_versions td:last-child {\n\twidth: 32px;\n\twhite-space: nowrap;\n\ttext-align: right;\n}\n\n#tl_versions .pagination {\n\tmargin-top: 18px;\n\tmargin-bottom: 14px;\n\tpadding: 12px 6px;\n\tbackground: var(--table-header);\n}\n\n/* CHMOD table */\n.tl_chmod {\n\twidth: 100%;\n}\n\n.tl_chmod th {\n\theight: 18px;\n\ttext-align: center;\n\tfont-weight: 400;\n\tbackground: var(--tree-header);\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_chmod th {\n\t\tfont-weight: 300;\n\t}\n}\n\n.tl_chmod td {\n\ttext-align: center;\n\tbackground: var(--table-header);\n}\n\n.tl_chmod th, .tl_chmod td {\n\twidth: 14.2857%;\n\tpadding: 6px;\n\tborder: 1px solid var(--content-bg);\n}\n\n/* Wizards */\n.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 {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: none;\n\tvertical-align: middle;\n}\n\n/* Module wizard */\n.tl_modulewizard {\n\twidth: 100%;\n\tmax-width: 800px;\n\tmargin-top: 2px;\n}\n\n.tl_modulewizard td {\n\tposition: relative;\n\tpadding: 0 3px 0 0;\n}\n\n.tl_modulewizard th {\n\tfont-size: .75rem;\n\tfont-weight: 400;\n\tpadding: 0 6px 1px 0;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_modulewizard th {\n\t\tfont-weight: 300;\n\t}\n}\n\n.tl_modulewizard td:last-child {\n\twidth: 1%;\n\twhite-space: nowrap;\n}\n\n.tl_modulewizard .tl_select, .tl_modulewizard .tl_select_column {\n\tmargin: 2px 0;\n}\n\n.tl_modulewizard input.mw_enable + button, .js .tl_modulewizard input.mw_enable {\n\tdisplay: none;\n}\n\n.js .tl_modulewizard input.mw_enable + button {\n\tdisplay: inline;\n\twidth: 16px;\n\theight: 16px;\n\tbackground: var(--icon-invisible) 0 0 no-repeat;\n}\n\n.js .tl_modulewizard input.mw_enable:checked + button {\n\tbackground-image: var(--icon-visible);\n}\n\n.tl_modulewizard img.mw_enable {\n\tdisplay: none;\n}\n\n.js .tl_modulewizard img.mw_enable {\n\tdisplay: inline;\n\tmargin-right: 1px;\n}\n\n/* Options and key/value wizard */\n.tl_optionwizard {\n\twidth: 100%;\n\tmax-width: 600px;\n}\n\n.tl_key_value_wizard {\n\twidth: 100%;\n\tmax-width: 450px;\n}\n\n.tl_optionwizard, .tl_key_value_wizard {\n\tmargin-top: 2px;\n}\n\n.tl_optionwizard label, .tl_key_value_wizard label {\n\tmargin-right: 3px;\n}\n\n.tl_optionwizard td, .tl_key_value_wizard td {\n\tpadding: 0 3px 0 0;\n}\n\n.tl_optionwizard th, .tl_key_value_wizard th {\n\tfont-size: .75rem;\n\tfont-weight: 400;\n\tpadding: 0 6px 1px 0;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_optionwizard th, .tl_key_value_wizard th {\n\t\tfont-weight: 300;\n\t}\n}\n\n.tl_optionwizard td:nth-child(n+3), .tl_key_value_wizard td:nth-child(n+3) {\n\twidth: 1%;\n\twhite-space: nowrap;\n}\n\n.tl_optionwizard .tl_text {\n\tmargin: 2px 0;\n}\n\n.tl_optionwizard img, .tl_key_value_wizard img {\n\tposition: relative;\n\ttop: 1px;\n}\n\n.tl_optionwizard .fw_checkbox, .tl_key_value_wizard .fw_checkbox {\n\tmargin: 0 1px;\n}\n\n#ctrl_allowedAttributes {\n\tmax-width: none;\n}\n\n#ctrl_allowedAttributes td:first-child {\n\twidth: 100px;\n}\n\n/* Table wizard */\n#tl_tablewizard {\n\tmargin-top: 2px;\n\tpadding-bottom: 2px;\n\toverflow: auto;\n}\n\n.tl_tablewizard td {\n\tpadding: 0 3px 0 0;\n}\n\n.tl_tablewizard thead td {\n\tpadding-bottom: 3px;\n\ttext-align: center;\n\twhite-space: nowrap;\n}\n\n.tl_tablewizard tbody td:last-child {\n\twhite-space: nowrap;\n}\n\n.tl_tablewizard td.tcontainer {\n\tvertical-align: top;\n}\n\n.tl_tablewizard .tl_textarea {\n\tmargin: 2px 0;\n}\n\n/* List wizard */\n.tl_listwizard {\n\tmargin: 1px 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.tl_listwizard .tl_text {\n\twidth: 78%;\n\tmargin: 2px 0;\n}\n\n/* Checkbox wizard */\n.tl_checkbox_wizard .fixed {\n\tdisplay: block;\n\tmargin-top: 1px;\n}\n\n.tl_checkbox_wizard .sortable span {\n\tdisplay: block;\n}\n\n.tl_checkbox_wizard .sortable img {\n\tvertical-align: bottom;\n}\n\n/* Meta wizard */\n.tl_metawizard {\n\tmargin: 3px 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.tl_metawizard li {\n\tmargin-bottom: 2px;\n\tpadding: 9px;\n}\n\n.tl_metawizard li:nth-child(odd) {\n\tbackground: var(--table-header);\n}\n\n.tl_metawizard li:nth-child(even) {\n\tbackground: var(--table-even);\n}\n\n.tl_metawizard label {\n\tfloat: left;\n\twidth: 18%;\n\tmargin-top: 9px;\n}\n\n.tl_metawizard .tl_text, .tl_metawizard .tl_textarea {\n\tfloat: left;\n\twidth: calc(82% - 20px);\n\tmargin: 1px 0;\n}\n\n.tl_metawizard .tl_textarea {\n\tresize: vertical;\n}\n\n.tl_metawizard .tl_text + a {\n\tposition: relative;\n\ttop: 7px;\n\tmargin-left: 4px;\n}\n\n.tl_metawizard br {\n\tclear: left;\n}\n\n.tl_metawizard .lang {\n\tdisplay: block;\n\tmargin: 3px 0 9px;\n\tfont-weight: 600;\n\tposition: relative;\n}\n\n.tl_metawizard .lang button {\n\tposition: absolute;\n\tright: 0;\n\ttop: -1px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_metawizard .lang {\n\t\tfont-weight: 500;\n\t}\n}\n\n/* Section wizard */\n.tl_sectionwizard {\n\tmargin-top: 2px;\n\twidth: 100%;\n\tmax-width: 680px;\n}\n\n.tl_sectionwizard td {\n\twidth: 25%;\n\tposition: relative;\n\tpadding: 0 3px 0 0;\n}\n\n.tl_sectionwizard th {\n\tfont-size: .75rem;\n\tfont-weight: 400;\n\tpadding: 0 4px 1px 0;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t.tl_sectionwizard th {\n\t\tfont-weight: 300;\n\t}\n}\n\n.tl_sectionwizard td:last-child {\n\twhite-space: nowrap;\n}\n\n/* Paste/sort hint */\n#paste_hint {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.tl_message + #paste_hint {\n\tmargin-top: -12px;\n}\n\n#paste_hint p {\n\tposition: absolute;\n\tfont-family: \"Architects Daughter\", cursive;\n\tfont-size: 1rem;\n\tcolor: var(--paste-hint);\n\ttop: 0;\n\tright: 30px;\n\tpadding: 0 36px 24px 0;\n\tbackground: var(--icon-arrow-right) bottom right no-repeat;\n\ttransform: rotate(-1deg);\n}\n\n.sort_hint {\n\tposition: absolute;\n\tfont-family: \"Architects Daughter\", cursive;\n\tfont-size: 1rem;\n\tcolor: var(--paste-hint);\n\ttop: -50px;\n\tleft: 160px;\n\tpadding: 0 6px 24px 42px;\n\tbackground: var(--icon-arrow-left) 6px bottom no-repeat;\n\ttransform: rotate(-2deg);\n}\n\n.widget + .subpal .sort_hint {\n\tleft: 260px;\n}\n\n.widget + .widget .sort_hint {\n\tleft: 320px;\n}\n\n/* SERP preview */\n.serp-preview {\n\tmax-width: 600px;\n\tmargin: 2px 0;\n\tpadding: 5px 7px;\n\tfont-family: Arial, sans-serif;\n\tfont-weight: 400;\n\tcolor: var(--serp-preview);\n\tbackground: var(--panel-bg);\n\tborder-radius: 3px;\n}\n\n.serp-preview p {\n\tmargin: 0;\n}\n\n.serp-preview .url, .serp-preview .description {\n\tline-height: 18px;\n}\n\n.serp-preview .url:not(:empty) {\n\tmargin-top: 3px;\n}\n\n.serp-preview .description:not(:empty) {\n\tmargin-bottom: 3px;\n}\n\n.serp-preview .title {\n\tmargin: 5px 0 4px;\n\tfont-size: 18px;\n\tcolor: var(--serp-preview-title);\n}\n\n.serp-preview .tl_info {\n\tbackground-color: transparent;\n}\n\n/* Ajax box */\n#tl_ajaxBox {\n\twidth: 300px;\n\tpadding: 2em;\n\tbox-sizing: border-box;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -150px;\n\tbackground: var(--white) var(--icon-loading) no-repeat right 2em center;\n\tborder: 2px solid var(--black);\n\tborder-radius: 2px;\n\tfont-size: 1rem;\n\ttext-align: left;\n}\n\n#tl_ajaxOverlay {\n\twidth: 100%;\n\theight: 100%;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbackground: var(--white);\n\topacity: 0.5;\n}\n\n/* Misc */\n.ce_gallery ul {\n\tdisplay: flow-root;\n}\n\n.ce_gallery li {\n\tfloat: left;\n\tmargin: 0 6px 6px 0;\n}\n\n.drag-handle {\n\tcursor: move;\n}\n\nul.sortable li {\n\tcursor: move;\n\tposition: relative;\n}\n\nul.sortable li .dirname {\n\tdisplay: none;\n}\n\nul.sortable li:hover .dirname {\n\tdisplay: inline;\n}\n\nul.sortable button {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tborder: 0;\n\tborder-radius: 2px;\n\tbackground: var(--form-button);\n\tmargin: 0;\n\tpadding: 0 0 3px;\n\tfont-size: 22px;\n\tline-height: 9px;\n\tcursor: pointer;\n\ttransition: all .1s linear;\n}\n\nul.sortable button:hover {\n\tbackground: var(--form-button-hover);\n}\n\nul.sortable button[disabled] {\n\tcolor: var(--gray);\n\tcursor: not-allowed;\n}\n\nul.sortable button[disabled]:hover {\n\tbackground: rgba(255,255,255,.7);\n}\n\n#picker-menu {\n\tpadding: 9px 6px 0;\n\tborder-bottom: 1px solid var(--content-border);\n}\n\n#picker-menu > ul {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n#picker-menu li {\n\tdisplay: inline-block;\n\tpadding: 8px 0;\n\tbackground-color: var(--table-even);\n\tborder: 1px solid var(--content-border);\n\tborder-radius: 2px 2px 0 0;\n\tposition: relative;\n\ttop: 1px;\n}\n\n#picker-menu li:hover {\n\tbackground-color: var(--panel-bg);\n}\n\n#picker-menu li.current {\n\tbackground-color: var(--panel-bg);\n\tborder-bottom-color: var(--panel-bg);\n}\n\n#picker-menu a {\n\tpadding: 3px 12px 3px 32px;\n\tbackground: url(\"icons/manager.svg\") 12px center no-repeat;\n}\n\n#picker-menu a:hover {\n\tcolor: var(--text);\n}\n\n#picker-menu a.pagePicker {\n\tbackground-image: url(\"icons/pagemounts.svg\");\n\tbackground-size: 16px;\n}\n\n#picker-menu a.filePicker {\n\tbackground-image: url(\"icons/filemounts.svg\");\n\tbackground-size: 14px;\n}\n\n#picker-menu a.articlePicker {\n\tbackground-image: url(\"icons/articles.svg\");\n\tbackground-size: 16px;\n}\n\n#picker-menu a.close {\n\tbackground-image: url(\"icons/back.svg\");\n}\n\n.ace_editor {\n\tpadding: 3px;\n\tz-index: 0;\n}\n\n.ace_editor, .ace_editor * {\n\tfont-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n\tfont-size: .75rem !important;\n\tcolor: var(--text);\n}\n\n.ace-fullsize {\n\toverflow: hidden !important;\n}\n\n.ace-fullsize .ace_editor {\n\tposition: fixed !important;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\twidth: auto !important;\n\theight: auto !important;\n\tmargin: 0;\n\tborder: 0;\n\tz-index: 10000;\n}\n\ndiv.mce-edit-area {\n\twidth: 99.9%;\n}\n\ntime[title] {\n\tcursor: help;\n}\n\n.float_left {\n\tfloat: left;\n}\n\n.float_right {\n\tfloat: right;\n}\n\n.foldable img {\n\ttransition: transform .2s ease;\n\ttransform: none;\n\twill-change: transform;\n}\n\n.foldable--open img {\n\ttransform: rotateZ(90deg);\n}\n\n.foldable--loading {\n\tposition: relative;\n\tpointer-events: none;\n}\n\n.foldable--loading img {\n\tvisibility: hidden;\n}\n\n.foldable--loading::after {\n\tcontent: \"\";\n\tposition: absolute;\n\tinset: 2px auto auto 2px;\n\twidth: 14px;\n\theight: 14px;\n\tbackground: var(--icon-loading) 0 0/contain no-repeat\n}\n\n/* Default icon classes */\n.header_icon, .header_clipboard, .header_back, .header_new, .header_rss, .header_edit_all, .header_delete_all,\n.header_new_folder, .header_css_import, .header_theme_import, .header_store, .header_toggle, .header_sync {\n\tdisplay: inline-block;\n\tpadding: 3px 0 3px 21px;\n\tbackground-color: transparent;\n\tbackground-position: left center;\n\tbackground-repeat: no-repeat;\n\tborder: none;\n\tmargin-left: 15px;\n}\n\n.list_icon {\n\tmargin-left: -3px;\n\tpadding-left: 20px;\n\tbackground-position: left center;\n\tbackground-repeat: no-repeat;\n}\n\n.list_icon_new {\n\twidth: 16px;\n\tbackground-position: 1px center;\n\tbackground-repeat: no-repeat;\n}\n\n/* Header icons */\n.header_clipboard {\n\tbackground-image: url(\"icons/clipboard.svg\");\n}\n\n.header_back {\n\tbackground-image: url(\"icons/back.svg\");\n}\n\n.header_new {\n\tbackground-image: url(\"icons/new.svg\");\n}\n\n.header_rss {\n\tbackground-image: url(\"icons/rss.svg\");\n}\n\n.header_edit_all {\n\tbackground-image: url(\"icons/all.svg\");\n}\n\n.header_new_folder {\n\tpadding-left: 24px;\n\tbackground-image: url(\"icons/newfolder.svg\");\n}\n\n.header_css_import {\n\tbackground-image: url(\"icons/cssimport.svg\");\n}\n\n.header_theme_import {\n\tbackground-image: url(\"icons/theme_import.svg\");\n}\n\n.header_store {\n\tpadding-left: 18px;\n\tbackground-image: url(\"icons/store.svg\");\n}\n\n.header_toggle {\n\tbackground-image: var(--icon-toggle-all);\n}\n\n.header_sync {\n\tbackground-image: url(\"icons/sync.svg\");\n}\n\n/* Visual hint for TRBL fields - thanks to Eugene Rybyakov */\n.tl_text_trbl, .tl_imageSize_0, .tl_imageSize_1, #ctrl_playerSize input {\n\tbackground: var(--form-bg) url(\"icons/hints.svg\") no-repeat right 1px top 2px;\n}\n\n#ctrl_playerSize_1, .tl_imageSize_1 {\n\tbackground-position: right 1px top -28px !important;\n}\n\n.trbl_top {\n\tbackground-position: right 1px top -59px !important;\n}\n\n.trbl_right {\n\tbackground-position: right 1px top -89px !important;\n}\n\n.trbl_bottom {\n\tbackground-position: right 1px top -119px !important;\n}\n\n.trbl_left {\n\tbackground-position: right 1px top -149px !important;\n}\n\n#ctrl_shadowsize_top {\n\tbackground-position: right 1px top -179px !important;\n}\n\n#ctrl_shadowsize_right {\n\tbackground-position: right 1px top -209px !important;\n}\n\n#ctrl_shadowsize_bottom {\n\tbackground-position: right 1px top -238px !important;\n}\n\n#ctrl_shadowsize_left {\n\tbackground-position: right 1px top -269px !important;\n}\n\n#ctrl_borderradius_top {\n\tbackground-position: left -299px !important;\n}\n\n#ctrl_borderradius_right {\n\tbackground-position: right 1px top -329px !important;\n}\n\n#ctrl_borderradius_bottom {\n\tbackground-position: right 1px top -352px !important;\n}\n\n#ctrl_borderradius_left {\n\tbackground-position: left -382px !important;\n}\n\n/* Error messages */\nlabel.error, legend.error, .tl_checkbox_container.error legend {\n\tcolor: var(--red);\n}\n\n.tl_tbox .tl_error, .tl_box .tl_error {\n\tbackground: none;\n\tpadding: 0;\n\tmargin-bottom: 0;\n\tfont-size: .75rem;\n}\n\n.tl_formbody_edit > .tl_error {\n\tmargin-top: 9px;\n}\n\n.broken-image {\n\tdisplay: inline-block;\n\tpadding: 12px 12px 12px 30px;\n\tbackground: var(--error-bg) url(\"icons/error.svg\") no-repeat 9px center;\n\tcolor: var(--red);\n\ttext-indent: 0;\n}\n\n/* Fieldsets */\nfieldset.tl_tbox, fieldset.tl_box {\n\tmargin-top: 5px;\n\tpadding-top: 0;\n\tborder-top: none;\n\tborder-left: 0;\n\tborder-right: 0;\n\tmargin-inline: 0;\n}\n\nfieldset.tl_tbox.nolegend, fieldset.tl_box.nolegend {\n\tborder-top: 0;\n}\n\nfieldset.tl_tbox > legend, fieldset.tl_box > legend {\n\tbox-sizing: border-box;\n\tcolor: var(--legend);\n\tpadding: 9px 12px 9px 28px;\n\tbackground: url(\"icons/navcol.svg\") 13px 10px no-repeat;\n\tcursor: pointer;\n}\n\nfieldset.collapsed {\n\tmargin-bottom: 0;\n\tpadding-bottom: 5px;\n}\n\nfieldset.collapsed div {\n\tdisplay: none !important;\n}\n\nfieldset.collapsed > legend {\n\tbackground: url(\"icons/navexp.svg\") 13px 10px no-repeat;\n}\n\n/* Maintenance */\n#tl_maintenance_cache table {\n\twidth: 100%;\n}\n\n#tl_maintenance_cache td {\n\tline-height: 1.2;\n\tpadding: 9px 6px;\n}\n\n#tl_maintenance_cache td span {\n\tcolor: var(--gray);\n}\n\n#tl_maintenance_cache td:first-child {\n\twidth: 16px;\n}\n\n#tl_maintenance_cache .nw {\n\twhite-space: nowrap;\n}\n\n#tl_maintenance_cache .tl_checkbox_container {\n\tmargin-top: 3px;\n}\n\n#tl_maintenance_cache .tl_checkbox_container label {\n\tvertical-align: initial;\n\tfont-weight: 600;\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n\t#tl_maintenance_cache .tl_checkbox_container label {\n\t\tfont-weight: 500;\n\t}\n}\n\n/* Pagination */\n.pagination {\n\tdisplay: flow-root;\n\tbackground: var(--panel-bg);\n\tmargin-bottom: 18px;\n\tborder: solid var(--border);\n\tborder-width: 1px 0;\n\tpadding: 12px 15px;\n}\n\n.pagination ul {\n\twidth: 60%;\n\tfloat: right;\n\ttext-align: right;\n}\n\n.pagination p {\n\twidth: 30%;\n\tfloat: left;\n\tmargin-bottom: 0;\n}\n\n.pagination li {\n\tdisplay: inline;\n\tpadding-left: 3px;\n}\n\n.pagination .active {\n\tcolor: var(--gray);\n}\n\n.pagination-lp {\n\tmargin-bottom: 0;\n\tborder-bottom: 0;\n\tpadding: 15px 12px;\n}\n\n/* File synchronization */\n#result-list {\n\tmargin: 15px;\n}\n\n#result-list .tl_error, #result-list .tl_confirm, #result-list .tl_info, #result-list .tl_new {\n\tpadding: 3px 0;\n\tbackground: none;\n}\n\n/* DropZone */\n.dropzone {\n\tmargin: 2px 0;\n\tmin-height: auto !important;\n\tborder: 3px dashed var(--border) !important;\n\tborder-radius: 2px;\n\tbackground: var(--form-bg) !important;\n}\n\n.dropzone-filetree {\n\tdisplay: none;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\topacity: .8;\n\tz-index: 1;\n}\n\n.dropzone-filetree-enabled {\n\tdisplay: block;\n}\n\n.dz-message span {\n\tfont-size: 1.3125rem;\n\tcolor: var(--gray);\n}\n\n/* TinyMCE */\n.tox-tinymce {\n\tmargin: 3px 0;\n\tborder-radius: 2px !important;\n}\n\n/* Undo */\n.tl_undo_header {\n\tmax-width: 880px;\n\tdisplay: grid;\n\tgrid-template-columns:2fr 2fr 3fr 3fr;\n\tgrid-column-gap: 24px;\n}\n\n.hover-row:hover .tl_undo_header {\n\tbackground-color: var(--hover-row) !important;\n}\n\n.tl_undo_preview {\n\tmargin-top: 5px;\n\tpadding: 10px 15px;\n\tposition: relative;\n}\n\n.tl_undo_preview td {\n\tpadding-left: 0 !important;\n\tpadding-right: 32px !important;\n}\n\n.tl_undo_preview td:empty {\n\tdisplay: none;\n}\n\n.tl_undo_preview img {\n\tmax-width: 320px;\n\theight: auto;\n}\n\n.tl_undo_preview {\n\tfont-size: .75rem;\n}\n\n.tl_undo_preview .cte_preview h1 {\n\tfont-size: 1.15rem;\n}\n\n.tl_undo_preview .cte_preview h2 {\n\tfont-size: .9rem;\n}\n\n.tl_undo_preview .cte_preview h3 {\n\tfont-size: .8rem;\n}\n\n.tl_undo_preview .cte_preview h4, .tl_undo_preview .cte_preview h5, .tl_undo_preview .cte_preview h6 {\n\tfont-size: .775rem;\n}\n\n\n/* Tablet */\n@media (max-width: 991px) {\n\t#container {\n\t\tdisplay: block;\n\t}\n\n\t#main, #left {\n\t\tfloat: none;\n\t}\n\n\t#main {\n\t\twidth: 100% !important;\n\t\tposition: relative;\n\t\ttransition: transform .2s ease;\n\t\t-webkit-transform: none;\n\t\ttransform: none;\n\t\twill-change: transform;\n\t}\n\n\t.show-navigation #main {\n\t\t-webkit-transform: translateX(240px);\n\t\ttransform: translateX(240px);\n\t}\n\n\t#left {\n\t\tvisibility: hidden;\n\t\tposition: absolute;\n\t\ttop: 40px;\n\t\twidth: 240px;\n\t\ttransition: transform .2s ease, visibility .2s ease;\n\t\t-webkit-transform: translateX(-240px);\n\t\ttransform: translateX(-240px);\n\t\twill-change: transform, visibility;\n\t}\n\n\t.show-navigation #left {\n\t\tvisibility: visible;\n\t\t-webkit-transform: none;\n\t\ttransform: none;\n\t}\n\n\t#tmenu .burger {\n\t\tdisplay: inline;\n\t}\n}\n\n/* Handheld */\n@media (max-width: 767px) {\n\t#header h1 a {\n\t\tmin-width: 22px;\n\t\tpadding: 12px;\n\t}\n\n\t#header h1 a .app-title {\n\t\tdisplay: none;\n\t}\n\n\t#header h1 a .badge-title {\n\t\tmargin-left: 32px;\n\t}\n\n\t#tmenu > li > a {\n\t\twidth: 16px;\n\t\tmargin-bottom: -2px;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-indent: 28px; /* 16px width + 12px padding */\n\t\tbackground-size: 18px !important;\n\t}\n\n\t#tmenu sup {\n\t\ttop: 6px;\n\t\tfont-size: .5rem;\n\t}\n\n\t#tmenu .icon-debug {\n\t\tbackground: url(\"icons/debug.svg\") center center no-repeat;\n\t}\n\n\t#tmenu .icon-preview {\n\t\tbackground: url(\"icons/preview.svg\") center center no-repeat;\n\t}\n\n\t#tmenu .profile button {\n\t\twidth: 40px;\n\t\tmargin: 0 0 -2px;\n\t\tpadding-right: 12px;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-indent: 28px; /* 16px width + 12px padding */\n\t\tbackground: url(\"icons/profile.svg\") center center no-repeat;\n\t\tbackground-size: 18px;\n\t}\n\n\t#main .content {\n\t\tmargin: 15px 10px;\n\t}\n\n\t#main_headline {\n\t\tmargin: 13px 0;\n\t\tpadding: 0 11px;\n\t}\n\n\tdiv.tl_tbox, div.tl_box {\n\t\tposition: relative;\n\t}\n\n\t.tl_content_left {\n\t\twidth: 100%;\n\t\tfloat: none;\n\t}\n\n\t.showColumns th, .showColumns td {\n\t\tdisplay: block;\n\t}\n\n\t.showColumns th:empty {\n\t\tdisplay: none;\n\t}\n\n\t.tl_label {\n\t\twhite-space: normal;\n\t}\n\n\t.list_view .tl_listing img.theme_preview {\n\t\tdisplay: none;\n\t}\n\n\t.tl_filter {\n\t\tbox-sizing: border-box;\n\t\tpadding: 0 3px 0 7px;\n\t}\n\n\t.tl_filter strong {\n\t\tdisplay: none;\n\t}\n\n\t.tl_filter .tl_select {\n\t\tdisplay: block;\n\t\tmax-width: 100%;\n\t}\n\n\t.tl_search {\n\t\twidth: 76%;\n\t\tmax-width: 283px;\n\t}\n\n\t.tl_search .tl_select {\n\t\twidth: 36%;\n\t}\n\n\t.tl_search .tl_text {\n\t\twidth: 26%;\n\t}\n\n\t.tl_sorting {\n\t\twidth: 60%;\n\t\tmax-width: 212px;\n\t}\n\n\t.tl_limit {\n\t\twidth: 50%;\n\t\tmax-width: 177px;\n\t}\n\n\t.tl_submit_panel {\n\t\tfloat: right;\n\t\tz-index: 1;\n\t}\n\n\tinput.tl_submit {\n\t\tmargin-top: 3px;\n\t\tmargin-bottom: 3px;\n\t\tpadding-left: 6px !important;\n\t\tpadding-right: 7px !important;\n\t}\n\n\t.tl_listing .tl_left, .tl_show td {\n\t\tword-break: break-word;\n\t}\n\n\t#tl_breadcrumb li {\n\t\tpadding: 3px;\n\t}\n\n\t#tl_versions {\n\t\tdisplay: none;\n\t}\n\n\t.tl_version_panel .tl_select {\n\t\twidth: 44%;\n\t}\n\n\t.tl_modulewizard td:first-child {\n\t\twidth: 1%;\n\t}\n\n\t.tl_modulewizard td:first-child .tl_select {\n\t\tmax-width: 52vw;\n\t}\n\n\t#paste_hint, .sort_hint {\n\t\tdisplay: none;\n\t}\n\n\t#tl_maintenance_cache table {\n\t\twidth: 100%;\n\t}\n\n\t#tl_maintenance_cache tr th:last-child, #tl_maintenance_cache tr td:last-child {\n\t\tdisplay: none;\n\t}\n\n\t.tl_file_list .ellipsis {\n\t\tpadding-right: 10px;\n\t}\n\n\t.tl_undo_header {\n\t\tgrid-template-columns:2fr 3fr;\n\t}\n\n\t.tl_undo_header div:not(.tstamp):not(.source) {\n\t\tdisplay: none;\n\t}\n}\n\n/* Phones */\n@media (max-width: 599px) {\n\t.tl_metawizard label {\n\t\twidth: auto;\n\t\tfloat: none;\n\t\tfont-size: .9em;\n\t\tdisplay: block;\n\t\tmargin-top: 3px;\n\t}\n\n\t.tl_metawizard .tl_text {\n\t\twidth: 100%;\n\t}\n}\n\n@media (max-width: 479px) {\n\t.tl_modulewizard td:first-child .tl_select {\n\t\tmax-width: 48vw;\n\t}\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/contao/themes/flexible/entrypoints.json b/contao/themes/flexible/entrypoints.json index 1f750e7f42..5f0d8eba27 100644 --- a/contao/themes/flexible/entrypoints.json +++ b/contao/themes/flexible/entrypoints.json @@ -2,7 +2,7 @@ "entrypoints": { "backend": { "css": [ - "/system/themes/flexible/backend.49ffe8ed.css" + "/system/themes/flexible/backend.509d1d15.css" ] }, "confirm": { diff --git a/contao/themes/flexible/manifest.json b/contao/themes/flexible/manifest.json index 16e250b9c9..0d28629824 100644 --- a/contao/themes/flexible/manifest.json +++ b/contao/themes/flexible/manifest.json @@ -1,5 +1,5 @@ { - "backend.css": "/system/themes/flexible/backend.49ffe8ed.css", + "backend.css": "/system/themes/flexible/backend.509d1d15.css", "confirm.css": "/system/themes/flexible/confirm.c2996dd4.css", "conflict.css": "/system/themes/flexible/conflict.aa6b9c95.css", "diff.css": "/system/themes/flexible/diff.171af75f.css", @@ -8,7 +8,7 @@ "popup.css": "/system/themes/flexible/popup.4728c2fc.css", "tinymce.css": "/system/themes/flexible/tinymce.e5009f94.css", "tinymce-dark.css": "/system/themes/flexible/tinymce-dark.596023db.css", - "backend.49ffe8ed.css.map": "/system/themes/flexible/backend.49ffe8ed.css.map", + "backend.509d1d15.css.map": "/system/themes/flexible/backend.509d1d15.css.map", "confirm.c2996dd4.css.map": "/system/themes/flexible/confirm.c2996dd4.css.map", "conflict.aa6b9c95.css.map": "/system/themes/flexible/conflict.aa6b9c95.css.map", "diff.171af75f.css.map": "/system/themes/flexible/diff.171af75f.css.map", diff --git a/contao/themes/flexible/styles/main.css b/contao/themes/flexible/styles/main.css index 03fd4a2c67..5b48b7beed 100644 --- a/contao/themes/flexible/styles/main.css +++ b/contao/themes/flexible/styles/main.css @@ -1172,7 +1172,6 @@ table.tl_listing { } .tl_file, .tl_file_list { - position: relative; padding: 5px 6px; border-bottom: 1px solid var(--border); background: var(--content-bg); diff --git a/public/backend.69d856f0.js b/public/backend.147aae9f.js similarity index 96% rename from public/backend.69d856f0.js rename to public/backend.147aae9f.js index f3c52557bb..156f7f502d 100644 --- a/public/backend.69d856f0.js +++ b/public/backend.147aae9f.js @@ -1,3 +1,3 @@ -/*! For license information please see backend.69d856f0.js.LICENSE.txt */ -(()=>{var e={441:(e,t,n)=>{"use strict";n.d(t,{lg:()=>Z,xI:()=>ce});class r{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,r=t.index;return nr?1:0}))}}class o{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:r}=e,o=this.fetchEventListenerMapForEventTarget(t),i=this.cacheKey(n,r);o.delete(i),0==o.size&&this.eventListenerMaps.delete(t)}fetchEventListenerForBinding(e){const{eventTarget:t,eventName:n,eventOptions:r}=e;return this.fetchEventListener(t,n,r)}fetchEventListener(e,t,n){const r=this.fetchEventListenerMapForEventTarget(e),o=this.cacheKey(t,n);let i=r.get(o);return i||(i=this.createEventListener(e,t,n),r.set(o,i)),i}createEventListener(e,t,n){const o=new r(e,t,n);return this.started&&o.connect(),o}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 i={stop:({event:e,value:t})=>(t&&e.stopPropagation(),!0),prevent:({event:e,value:t})=>(t&&e.preventDefault(),!0),self:({event:e,value:t,element:n})=>!t||n===e.target},s=/^(?:(?:([^.]+?)\+)?(.+?)(?:\.(.+?))?(?:@(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 u(e){return e.charAt(0).toUpperCase()+e.slice(1)}function d(e){return e.replace(/([A-Z])/g,((e,t)=>`-${t.toLowerCase()}`))}function h(e){return null!=e}function f(e,t){return Object.prototype.hasOwnProperty.call(e,t)}const p=["meta","ctrl","alt","shift"];class g{constructor(e,t,n,r){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 m)return m[t](e)}(e)||v("missing event name"),this.eventOptions=n.eventOptions||{},this.identifier=n.identifier||v("missing identifier"),this.methodName=n.methodName||v("missing method name"),this.keyFilter=n.keyFilter||"",this.schema=r}static forToken(e,t){return new this(e.element,e.index,function(e){const t=e.trim().match(s)||[];let n=t[2],r=t[3];return r&&!["keydown","keyup","keypress"].includes(n)&&(n+=`.${r}`,r=""),{eventTarget:a(t[4]),eventName:n,eventOptions:t[7]?(o=t[7],o.split(":").reduce(((e,t)=>Object.assign(e,{[t.replace(/^!/,"")]:!/^!/.test(t)})),{})):{},identifier:t[5],methodName:t[6],keyFilter:t[1]||r};var o}(e.content),t)}toString(){const e=this.keyFilter?`.${this.keyFilter}`:"",t=this.eventTargetName?`@${this.eventTargetName}`:"";return`${this.eventName}${e}${t}->${this.identifier}#${this.methodName}`}shouldIgnoreKeyboardEvent(e){if(!this.keyFilter)return!1;const t=this.keyFilter.split("+");if(this.keyFilterDissatisfied(e,t))return!0;const n=t.filter((e=>!p.includes(e)))[0];return!!n&&(f(this.keyMappings,n)||v(`contains unknown key filter: ${this.keyFilter}`),this.keyMappings[n].toLowerCase()!==e.key.toLowerCase())}shouldIgnoreMouseEvent(e){if(!this.keyFilter)return!1;const t=[this.keyFilter];return!!this.keyFilterDissatisfied(e,t)}get params(){const e={},t=new RegExp(`^data-${this.identifier}-(.+)-param$`,"i");for(const{name:n,value:r}of Array.from(this.element.attributes)){const o=n.match(t),i=o&&o[1];i&&(e[l(i)]=y(r))}return e}get eventTargetName(){return(e=this.eventTarget)==window?"window":e==document?"document":void 0;var e}get keyMappings(){return this.schema.keyMappings}keyFilterDissatisfied(e,t){const[n,r,o,i]=p.map((e=>t.includes(e)));return e.metaKey!==n||e.ctrlKey!==r||e.altKey!==o||e.shiftKey!==i}}const m={a:()=>"click",button:()=>"click",form:()=>"submit",details:()=>"toggle",input:e=>"submit"==e.getAttribute("type")?"click":"input",select:()=>"change",textarea:()=>"input"};function v(e){throw new Error(e)}function y(e){try{return JSON.parse(e)}catch(t){return e}}class b{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){const t=this.prepareActionEvent(e);this.willBeInvokedByEvent(e)&&this.applyEventModifiers(t)&&this.invokeWithEvent(t)}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,{controller:r}=this.context;let o=!0;for(const[i,s]of Object.entries(this.eventOptions))if(i in n){const a=n[i];o=o&&a({name:i,value:s,event:e,element:t,controller:r})}return o}prepareActionEvent(e){return Object.assign(e,{params:this.action.params})}invokeWithEvent(e){const{target:t,currentTarget:n}=e;try{this.method.call(this.controller,e),this.context.logDebugActivity(this.methodName,{event:e,target:t,currentTarget:n,action:this.methodName})}catch(t){const{identifier:n,controller:r,element:o,index:i}=this,s={identifier:n,controller:r,element:o,index:i,event:e};this.context.handleError(t,`invoking action "${this.action}"`,s)}}willBeInvokedByEvent(e){const t=e.target;return!(e instanceof KeyboardEvent&&this.action.shouldIgnoreKeyboardEvent(e))&&(!(e instanceof MouseEvent&&this.action.shouldIgnoreMouseEvent(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 w{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){this.elements.has(e)?this.delegate.elementAttributeChanged&&this.matchElement(e)?this.delegate.elementAttributeChanged(e,t):this.removeElement(e):this.matchElement(e)&&this.addElement(e)}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 E{constructor(e,t,n){this.attributeName=t,this.delegate=n,this.elementObserver=new w(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 O(e,t,n){S(e,t).add(n)}function k(e,t,n){S(e,t).delete(n),function(e,t){const n=e.get(t);null!=n&&0==n.size&&e.delete(t)}(e,t)}function S(e,t){let n=e.get(t);return n||(n=new Set,e.set(t,n)),n}class x{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){O(this.valuesByKey,e,t)}delete(e,t){k(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 C{constructor(e,t,n,r){this._selector=t,this.details=r,this.elementObserver=new w(e,this),this.delegate=n,this.matchesByElement=new x}get started(){return this.elementObserver.started}get selector(){return this._selector}set selector(e){this._selector=e,this.refresh()}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{selector:t}=this;if(t){const n=e.matches(t);return this.delegate.selectorMatchElement?n&&this.delegate.selectorMatchElement(e,this.details):n}return!1}matchElementsInTree(e){const{selector:t}=this;if(t){const n=this.matchElement(e)?[e]:[],r=Array.from(e.querySelectorAll(t)).filter((e=>this.matchElement(e)));return n.concat(r)}return[]}elementMatched(e){const{selector:t}=this;t&&this.selectorMatched(e,t)}elementUnmatched(e){const t=this.matchesByElement.getKeysForValue(e);for(const n of t)this.selectorUnmatched(e,n)}elementAttributeChanged(e,t){const{selector:n}=this;if(n){const t=this.matchElement(e),r=this.matchesByElement.has(n,e);t&&!r?this.selectorMatched(e,n):!t&&r&&this.selectorUnmatched(e,n)}}selectorMatched(e,t){this.delegate.selectorMatched(e,t,this.details),this.matchesByElement.add(t,e)}selectorUnmatched(e,t){this.delegate.selectorUnmatched(e,t,this.details),this.matchesByElement.delete(t,e)}}class A{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 r=this.element.getAttribute(e);if(this.stringMap.get(e)!=r&&this.stringMapValueChanged(r,n,t),null==r){const t=this.stringMap.get(e);this.stringMap.delete(e),t&&this.stringMapKeyRemoved(n,e,t)}else this.stringMap.set(e,r)}}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 T{constructor(e,t,n){this.attributeObserver=new E(e,t,this),this.delegate=n,this.tokensByElement=new x}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),r=function(e,t){const n=Math.max(e.length,t.length);return Array.from({length:n},((n,r)=>[e[r],t[r]]))}(t,n).findIndex((([e,t])=>{return r=t,!((n=e)&&r&&n.index==r.index&&n.content==r.content);var n,r}));return-1==r?[[],[]]:[t.slice(r),n.slice(r)]}readTokensForElement(e){const t=this.attributeName;return function(e,t,n){return e.trim().split(/\s+/).filter((e=>e.length)).map(((e,r)=>({element:t,attributeName:n,content:e,index:r})))}(e.getAttribute(t)||"",e,t)}}class j{constructor(e,t,n){this.tokenListObserver=new T(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 _{constructor(e,t){this.context=e,this.delegate=t,this.bindingsByAction=new Map}start(){this.valueListObserver||(this.valueListObserver=new j(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 b(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=g.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 A(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 r=this.valueDescriptorNameMap[t];null!==e&&(null===n&&(n=r.writer(r.defaultValue)),this.invokeChangedCallback(t,e,n))}stringMapKeyRemoved(e,t,n){const r=this.valueDescriptorNameMap[e];this.hasValue(e)?this.invokeChangedCallback(e,r.writer(this.receiver[e]),n):this.invokeChangedCallback(e,r.writer(r.defaultValue),n)}invokeChangedCallbacksForDefaultValues(){for(const{key:e,name:t,defaultValue:n,writer:r}of this.valueDescriptors)null==n||this.controller.data.has(e)||this.invokeChangedCallback(t,r(n),void 0)}invokeChangedCallback(e,t,n){const r=`${e}Changed`,o=this.receiver[r];if("function"==typeof o){const r=this.valueDescriptorNameMap[e];try{const e=r.reader(t);let i=n;n&&(i=r.reader(n)),o.call(this.receiver,e,i)}catch(e){throw e instanceof TypeError&&(e.message=`Stimulus Value "${this.context.identifier}.${r.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${u(this.valueDescriptorNameMap[e].name)}`;return this.receiver[t]}}class P{constructor(e,t){this.context=e,this.delegate=t,this.targetsByName=new x}start(){this.tokenListObserver||(this.tokenListObserver=new T(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 F(e,t){const n=N(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 $(e,t){return N(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 N(e){const t=[];for(;e;)t.push(e),e=Object.getPrototypeOf(e);return t.reverse()}class L{constructor(e,t){this.started=!1,this.context=e,this.delegate=t,this.outletsByName=new x,this.outletElementsByName=new x,this.selectorObserverMap=new Map,this.attributeObserverMap=new Map}start(){this.started||(this.outletDefinitions.forEach((e=>{this.setupSelectorObserverForOutlet(e),this.setupAttributeObserverForOutlet(e)})),this.started=!0,this.dependentContexts.forEach((e=>e.refresh())))}refresh(){this.selectorObserverMap.forEach((e=>e.refresh())),this.attributeObserverMap.forEach((e=>e.refresh()))}stop(){this.started&&(this.started=!1,this.disconnectAllOutlets(),this.stopSelectorObservers(),this.stopAttributeObservers())}stopSelectorObservers(){this.selectorObserverMap.size>0&&(this.selectorObserverMap.forEach((e=>e.stop())),this.selectorObserverMap.clear())}stopAttributeObservers(){this.attributeObserverMap.size>0&&(this.attributeObserverMap.forEach((e=>e.stop())),this.attributeObserverMap.clear())}selectorMatched(e,t,{outletName:n}){const r=this.getOutlet(e,n);r&&this.connectOutlet(r,e,n)}selectorUnmatched(e,t,{outletName:n}){const r=this.getOutletFromMap(e,n);r&&this.disconnectOutlet(r,e,n)}selectorMatchElement(e,{outletName:t}){const n=this.selector(t),r=this.hasOutlet(e,t),o=e.matches(`[${this.schema.controllerAttribute}~=${t}]`);return!!n&&(r&&o&&e.matches(n))}elementMatchedAttribute(e,t){const n=this.getOutletNameFromOutletAttributeName(t);n&&this.updateSelectorObserverForOutlet(n)}elementAttributeValueChanged(e,t){const n=this.getOutletNameFromOutletAttributeName(t);n&&this.updateSelectorObserverForOutlet(n)}elementUnmatchedAttribute(e,t){const n=this.getOutletNameFromOutletAttributeName(t);n&&this.updateSelectorObserverForOutlet(n)}connectOutlet(e,t,n){var r;this.outletElementsByName.has(n,t)||(this.outletsByName.add(n,e),this.outletElementsByName.add(n,t),null===(r=this.selectorObserverMap.get(n))||void 0===r||r.pause((()=>this.delegate.outletConnected(e,t,n))))}disconnectOutlet(e,t,n){var r;this.outletElementsByName.has(n,t)&&(this.outletsByName.delete(n,e),this.outletElementsByName.delete(n,t),null===(r=this.selectorObserverMap.get(n))||void 0===r||r.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)}updateSelectorObserverForOutlet(e){const t=this.selectorObserverMap.get(e);t&&(t.selector=this.selector(e))}setupSelectorObserverForOutlet(e){const t=this.selector(e),n=new C(document.body,t,this,{outletName:e});this.selectorObserverMap.set(e,n),n.start()}setupAttributeObserverForOutlet(e){const t=this.attributeNameForOutletName(e),n=new E(this.scope.element,t,this);this.attributeObserverMap.set(e,n),n.start()}selector(e){return this.scope.outlets.getSelectorForOutletName(e)}attributeNameForOutletName(e){return this.scope.schema.outletAttributeForScope(this.identifier,e)}getOutletNameFromOutletAttributeName(e){return this.outletDefinitions.find((t=>this.attributeNameForOutletName(t)===e))}get outletDependencies(){const e=new x;return this.router.modules.forEach((t=>{F(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 schema(){return this.context.schema}get identifier(){return this.context.identifier}get application(){return this.context.application}get router(){return this.application.router}}class B{constructor(e,t){this.logDebugActivity=(e,t={})=>{const{identifier:n,controller:r,element:o}=this;t=Object.assign({identifier:n,controller:r,element:o},t),this.application.logDebugActivity(this.identifier,e,t)},this.module=e,this.scope=t,this.controller=new e.controllerConstructor(this),this.bindingObserver=new _(this,this.dispatcher),this.valueObserver=new M(this,this.controller),this.targetObserver=new P(this,this),this.outletObserver=new L(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:r,controller:o,element:i}=this;n=Object.assign({identifier:r,controller:o,element:i},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 R(e){return function(e,t){const n=I(e),r=function(e,t){return D(t).reduce(((n,r)=>{const o=function(e,t,n){const r=Object.getOwnPropertyDescriptor(e,n);if(!r||!("value"in r)){const e=Object.getOwnPropertyDescriptor(t,n).value;return r&&(e.get=r.get||e.get,e.set=r.set||e.set),e}}(e,t,r);return o&&Object.assign(n,{[r]:o}),n}),{})}(e.prototype,t);return Object.defineProperties(n.prototype,r),n}(e,function(e){const t=F(e,"blessings");return t.reduce(((t,n)=>{const r=n(e);for(const e in r){const n=t[e]||{};t[e]=Object.assign(n,r[e])}return t}),{})}(e))}const D="function"==typeof Object.getOwnPropertySymbols?e=>[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)]:Object.getOwnPropertyNames,I=(()=>{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 q{constructor(e,t){this.application=e,this.definition=function(e){return{identifier:e.identifier,controllerConstructor:R(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 B(this,e),this.contextsByScope.set(e,t)),t}}class V{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 z{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}-${d(e)}`}}class K{constructor(e){this.warnedKeysByObject=new WeakMap,this.logger=e}warn(e,t,n){let r=this.warnedKeysByObject.get(e);r||(r=new Set,this.warnedKeysByObject.set(e,r)),r.has(t)||(r.add(t),this.logger.warn(n,e))}}function U(e,t){return`[${e}~="${t}"]`}class W{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 U(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 U(this.schema.targetAttribute,t)}deprecate(e,t){if(e){const{identifier:n}=this,r=this.schema.targetAttribute,o=this.schema.targetAttributeForScope(n);this.guide.warn(e,`target:${t}`,`Please replace ${r}="${n}.${t}" with ${o}="${t}". The ${r} attribute is deprecated and will be removed in a future version of Stimulus.`)}return e}get guide(){return this.scope.guide}}class H{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 r=e.getAttribute(this.scope.schema.controllerAttribute)||"";return e.matches(t)&&r.split(" ").includes(n)}}class Q{constructor(e,t,n,r){this.targets=new W(this),this.classes=new V(this),this.data=new z(this),this.containsElement=e=>e.closest(this.controllerSelector)===this.element,this.schema=e,this.element=t,this.identifier=n,this.guide=new K(r),this.outlets=new H(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 U(this.schema.controllerAttribute,this.identifier)}get isDocumentScope(){return this.element===document.documentElement}get documentScope(){return this.isDocumentScope?this:new Q(this.schema,document.documentElement,this.identifier,this.guide.logger)}}class X{constructor(e,t,n){this.element=e,this.schema=t,this.delegate=n,this.valueListObserver=new j(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;return this.parseValueForElementAndIdentifier(t,n)}parseValueForElementAndIdentifier(e,t){const n=this.fetchScopesByIdentifierForElement(e);let r=n.get(t);return r||(r=this.delegate.createScopeForElementAndIdentifier(e,t),n.set(t,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 G{constructor(e){this.application=e,this.scopeObserver=new X(this.element,this.schema,this),this.scopesByIdentifier=new x,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 q(this.application,e);this.connectModule(t);const n=e.controllerConstructor.afterLoad;n&&n.call(e.controllerConstructor,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))}proposeToConnectScopeForElementAndIdentifier(e,t){const n=this.scopeObserver.parseValueForElementAndIdentifier(e,t);n?this.scopeObserver.elementMatchedValue(n.element,n):console.error(`Couldn't find or create scope for identifier: "${t}" and element:`,e)}handleError(e,t,n){this.application.handleError(e,t,n)}createScopeForElementAndIdentifier(e,t){return new Q(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 J={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",page_up:"PageUp",page_down:"PageDown"},Y("abcdefghijklmnopqrstuvwxyz".split("").map((e=>[e,e])))),Y("0123456789".split("").map((e=>[e,e]))))};function Y(e){return e.reduce(((e,[t,n])=>Object.assign(Object.assign({},e),{[t]:n})),{})}class Z{constructor(e=document.documentElement,t=J){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 o(this),this.router=new G(this),this.actionDescriptorFilters=Object.assign({},i)}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 r;this.logger.error("%s\n\n%o\n\n%o",t,e,n),null===(r=window.onerror)||void 0===r||r.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 ee(e,t,n){return e.application.getControllerForElementAndIdentifier(t,n)}function te(e,t,n){let r=ee(e,t,n);return r||(e.application.router.proposeToConnectScopeForElementAndIdentifier(t,n),r=ee(e,t,n),r||void 0)}function ne([e,t],n){return function(e){const{token:t,typeDefinition:n}=e,r=`${d(t)}-value`,o=function(e){const{controller:t,token:n,typeDefinition:r}=e,o={controller:t,token:n,typeObject:r},i=function(e){const{controller:t,token:n,typeObject:r}=e,o=h(r.type),i=h(r.default),s=o&&i,a=o&&!i,l=!o&&i,c=re(r.type),u=oe(e.typeObject.default);if(a)return c;if(l)return u;if(c!==u){throw new Error(`The specified default value for the Stimulus Value "${t?`${t}.${n}`:n}" must match the defined type "${c}". The provided default value of "${r.default}" is of type "${u}".`)}if(s)return c}(o),s=oe(r),a=re(r),l=i||s||a;if(l)return l;const c=t?`${t}.${r}`:n;throw new Error(`Unknown value type "${c}" for "${n}" value`)}(e);return{type:o,key:r,name:l(r),get defaultValue(){return function(e){const t=re(e);if(t)return ie[t];const n=f(e,"default"),r=f(e,"type"),o=e;if(n)return o.default;if(r){const{type:e}=o,t=re(e);if(t)return ie[t]}return e}(n)},get hasCustomDefaultValue(){return void 0!==oe(n)},reader:se[o],writer:ae[o]||ae.default}}({controller:n,token:e,typeDefinition:t})}function re(e){switch(e){case Array:return"array";case Boolean:return"boolean";case Number:return"number";case Object:return"object";case String:return"string"}}function oe(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 ie={get array(){return[]},boolean:!1,number:0,get object(){return{}},string:""},se={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 "${oe(t)}"`);return t},boolean:e=>!("0"==e||"false"==String(e).toLowerCase()),number:e=>Number(e.replace(/_/g,"")),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 "${oe(t)}"`);return t},string:e=>e},ae={default:function(e){return`${e}`},array:le,object:le};function le(e){return JSON.stringify(e)}class ce{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:r=this.identifier,bubbles:o=!0,cancelable:i=!0}={}){const s=new CustomEvent(r?`${r}:${e}`:e,{detail:n,bubbles:o,cancelable:i});return t.dispatchEvent(s),s}}ce.blessings=[function(e){return F(e,"classes").reduce(((e,t)=>{return Object.assign(e,(n=t,{[`${n}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${u(n)}Class`]:{get(){return this.classes.has(n)}}}));var n}),{})},function(e){return F(e,"targets").reduce(((e,t)=>{return Object.assign(e,(n=t,{[`${n}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${u(n)}Target`]:{get(){return this.targets.has(n)}}}));var n}),{})},function(e){const t=$(e,"values"),n={valueDescriptorMap:{get(){return t.reduce(((e,t)=>{const n=ne(t,this.identifier),r=this.data.getAttributeNameForKey(n.key);return Object.assign(e,{[r]:n})}),{})}}};return t.reduce(((e,t)=>Object.assign(e,function(e,t){const n=ne(e,t),{key:r,name:o,reader:i,writer:s}=n;return{[o]:{get(){const e=this.data.get(r);return null!==e?i(e):n.defaultValue},set(e){void 0===e?this.data.delete(r):this.data.set(r,s(e))}},[`has${u(o)}`]:{get(){return this.data.has(r)||n.hasCustomDefaultValue}}}}(t))),n)},function(e){return F(e,"outlets").reduce(((e,t)=>Object.assign(e,function(e){const t=c(e);return{[`${t}Outlet`]:{get(){const t=this.outlets.find(e),n=this.outlets.getSelectorForOutletName(e);if(t){const n=te(this,t,e);if(n)return n;throw new Error(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`)}throw new Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${n}".`)}},[`${t}Outlets`]:{get(){const t=this.outlets.findAll(e);return t.length>0?t.map((t=>{const n=te(this,t,e);if(n)return n;console.warn(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`,t)})).filter((e=>e)):[]}},[`${t}OutletElement`]:{get(){const t=this.outlets.find(e),n=this.outlets.getSelectorForOutletName(e);if(t)return t;throw new Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${n}".`)}},[`${t}OutletElements`]:{get(){return this.outlets.findAll(e)}},[`has${u(t)}Outlet`]:{get(){return this.outlets.has(e)}}}}(t))),{})}],ce.targets=[],ce.outlets=[],ce.values={}},40:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e,t){for(var n=0;nf});var u,d,h,f=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,t,arguments)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(t,e),n=t,(r=[{key:"write",value:function(){navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(this.contentValue).catch(this.clipboardFallback.bind(this)):this.clipboardFallback()}},{key:"clipboardFallback",value:function(){var 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)}}])&&o(n.prototype,r),s&&o(n,s),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,s}(n(441).xI);u=f,d="values",h={content:String},(d=c(d))in u?Object.defineProperty(u,d,{value:h,enumerable:!0,configurable:!0,writable:!0}):u[d]=h},181:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>p});var r=n(441);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){for(var n=0;n{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e,t){for(var n=0;nf});var u,d,h,f=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,t,arguments)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(t,e),n=t,(r=[{key:"initialize",value:function(){this.updateWizard=this.updateWizard.bind(this),this.openModal=this.openModal.bind(this)}},{key:"connect",value:function(){this.select=this.element.querySelector("select"),this.button=document.createElement("button"),this.button.type="button",this.button.title="",this.buttonImage=document.createElement("img"),this.button.append(this.buttonImage),this.element.parentNode.classList.add("wizard"),this.element.after(this.button),this.select.addEventListener("change",this.updateWizard),this.button.addEventListener("click",this.openModal),this.updateWizard()}},{key:"disconnect",value:function(){this.element.parentNode.classList.remove("wizard"),this.select.removeEventListener("change",this.updateWizard),this.buttonImage.remove(),this.button.remove()}},{key:"updateWizard",value:function(){this.canEdit()?(this.button.title=this.configValue.title,this.button.disabled=!1,this.buttonImage.src=this.configValue.icon):(this.button.title="",this.button.disabled=!0,this.buttonImage.src=this.configValue.iconDisabled)}},{key:"openModal",value:function(){Backend.openModalIframe({title:this.configValue.title,url:"".concat(this.configValue.href,"&id=").concat(this.select.value)})}},{key:"canEdit",value:function(){return this.configValue.ids.includes(Number(this.select.value))}}])&&o(n.prototype,r),s&&o(n,s),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,s}(n(441).xI);u=f,d="values",h={config:Object},(d=c(d))in u?Object.defineProperty(u,d,{value:h,enumerable:!0,configurable:!0,writable:!0}):u[d]=h},519:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e,t){for(var n=0;nf});var u,d,h,f=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,t,arguments)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(t,e),n=t,(r=[{key:"connect",value:function(){this.rebuildNavigation(),this.connected=!0}},{key:"sectionTargetConnected",value:function(){this.connected&&this.rebuildNavigation()}},{key:"rebuildNavigation",value:function(){var e=this;if(this.hasNavigationTarget){var t=document.createElement("ul");this.sectionTargets.forEach((function(n){var r=document.createElement("button");r.innerText=n.getAttribute("data-".concat(e.identifier,"-label-value")),r.addEventListener("click",(function(t){t.preventDefault(),e.dispatch("scrollto",{target:n}),n.scrollIntoView()}));var o=document.createElement("li");o.append(r),t.append(o)})),this.navigationTarget.replaceChildren(t)}}}])&&o(n.prototype,r),s&&o(n,s),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,s}(n(441).xI);u=f,h=["navigation","section"],(d=c(d="targets"))in u?Object.defineProperty(u,d,{value:h,enumerable:!0,configurable:!0,writable:!0}):u[d]=h},613:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e,t){for(var n=0;nh});var h=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,t,arguments)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(t,e),n=t,(r=[{key:"initialize",value:function(){a(l(t.prototype),"initialize",this).call(this),this.togglerMap=new WeakMap,this.nextId=1}},{key:"operationTargetConnected",value:function(){this.updateOperation()}},{key:"nodeTargetConnected",value:function(e){var t=this,n=window.getComputedStyle(e,null),r=parseFloat(n.paddingTop)+parseFloat(n.paddingBottom),o=e.clientHeight-r;if(!(this.maxValue>o)){e.id||(e.id="limit-height-".concat(this.nextId++)),e.style.overflow="hidden",e.style.maxHeight="".concat(this.maxValue,"px");var i=document.createElement("button");i.setAttribute("type","button"),i.title=this.expandValue,i.innerHTML="...",i.classList.add("unselectable"),i.setAttribute("aria-expanded","false"),i.setAttribute("aria-controls",e.id),i.addEventListener("click",(function(n){n.preventDefault(),t.toggle(e),t.updateOperation(n)}));var s=document.createElement("div");s.classList.add("limit_toggler"),s.append(i),this.togglerMap.set(e,s),e.append(s),this.updateOperation()}}},{key:"nodeTargetDisconnected",value:function(e){this.togglerMap.has(e)&&(this.togglerMap.get(e).remove(),this.togglerMap.delete(e),e.style.overflow="",e.style.maxHeight="")}},{key:"toggle",value:function(e){""===e.style.maxHeight?this.collapse(e):this.expand(e)}},{key:"expand",value:function(e){if(this.togglerMap.has(e)){e.style.maxHeight="";var t=this.togglerMap.get(e).querySelector("button");t.title=this.collapseValue,t.setAttribute("aria-expanded","true")}}},{key:"collapse",value:function(e){if(this.togglerMap.has(e)){e.style.maxHeight="".concat(this.maxValue,"px");var t=this.togglerMap.get(e).querySelector("button");t.title=this.expandValue,t.setAttribute("aria-expanded","false")}}},{key:"toggleAll",value:function(e){var t=this;e.preventDefault();var n=this.hasExpanded()^e.altKey;this.nodeTargets.forEach((function(e){n?t.collapse(e):t.expand(e)})),this.updateOperation(e)}},{key:"keypress",value:function(e){this.updateOperation(e)}},{key:"updateOperation",value:function(e){var t=this;if(this.hasOperationTarget){var n=!!this.nodeTargets.find((function(e){return t.togglerMap.has(e)})),r=this.hasExpanded();this.operationTarget.style.display=n?"":"none",this.operationTarget.setAttribute("aria-controls",this.nodeTargets.map((function(e){return e.id})).join(" ")),this.operationTarget.setAttribute("aria-expanded",r?"true":"false"),r^(!!e&&e.altKey)?(this.operationTarget.innerText=this.collapseAllValue,this.operationTarget.title=this.collapseAllTitleValue):(this.operationTarget.innerText=this.expandAllValue,this.operationTarget.title=this.expandAllTitleValue)}}},{key:"hasExpanded",value:function(){var e=this;return!!this.nodeTargets.find((function(t){return e.togglerMap.has(t)&&""===t.style.maxHeight}))}}])&&o(n.prototype,r),s&&o(n,s),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,s}(n(441).xI);u(h,"values",{max:Number,expand:String,collapse:String,expandAll:String,expandAllTitle:String,collapseAll:String,collapseAllTitle:String}),u(h,"targets",["operation","node"])},508:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e,t){for(var n=0;nf});var u,d,h,f=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,t,arguments)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(t,e),n=t,(r=[{key:"delete",value:function(){this.inputTargets.forEach((function(e){e.value=""}))}}])&&o(n.prototype,r),s&&o(n,s),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,s}(n(441).xI);u=f,h=["input"],(d=c(d="targets"))in u?Object.defineProperty(u,d,{value:h,enumerable:!0,configurable:!0,writable:!0}):u[d]=h},267:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e,t){for(var n=0;nd});var d=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,t,arguments)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(t,e),n=t,s=[{key:"afterLoad",value:function(e,t){var n=function(){return new Promise((function(n,r){var o=t.getControllerForElementAndIdentifier(document.documentElement,e);if(o)n(o);else{var i=t.schema.controllerAttribute;document.documentElement.setAttribute(i,"".concat(document.documentElement.getAttribute(i)||""," ").concat(e)),setTimeout((function(){var o=t.getControllerForElementAndIdentifier(document.documentElement,e);o&&n(o)||r(o)}),100)}}))};window.Backend&&!window.Backend.initScrollOffset&&(window.Backend.initScrollOffset=function(){console.warn("Backend.initScrollOffset() is deprecated. Please use the Stimulus controller instead."),n()}),window.Backend&&!window.Backend.getScrollOffset&&(window.Backend.getScrollOffset=function(){console.warn("Backend.getScrollOffset() is deprecated. Please use the Stimulus controller instead."),n().then((function(e){return e.discard()}))})}}],(r=[{key:"initialize",value:function(){this.store=this.store.bind(this)}},{key:"connect",value:function(){this.offset&&(window.scrollTo({top:this.offset,behavior:this.behaviorValue,block:this.blockValue}),this.offset=null)}},{key:"scrollToTargetConnected",value:function(){this.scrollToTarget.scrollIntoView({behavior:this.behaviorValue,block:this.blockValue})}},{key:"autoFocusTargetConnected",value:function(){if(!this.offset&&!this.autoFocus){var e=this.autoFocusTarget;e.disabled||e.readonly||!e.offsetWidth||!e.offsetHeight||e.closest(".chzn-search")||e.autocomplete&&"off"!==e.autocomplete||(this.autoFocus=!0,e.focus())}}},{key:"store",value:function(){this.offset=this.element.scrollTop}},{key:"discard",value:function(){this.offset=null}},{key:"offset",get:function(){var e=window.sessionStorage.getItem(this.sessionKeyValue);return e?parseInt(e):null},set:function(e){null==e?window.sessionStorage.removeItem(this.sessionKeyValue):window.sessionStorage.setItem(this.sessionKeyValue,String(e))}}])&&o(n.prototype,r),s&&o(n,s),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,s}(n(441).xI);c(d,"targets",["scrollTo","autoFocus"]),c(d,"values",{sessionKey:{type:String,default:"contao_backend_offset"},behavior:{type:String,default:"instant"},block:{type:String,default:"center"}})},435:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e,t){for(var n=0;nd});var d=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,t,arguments)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(t,e),n=t,s=[{key:"afterLoad",value:function(e,t){var n=function(t,n,r){var o=t.parentNode;o.dataset.controller="".concat(o.dataset.controller||""," ").concat(e),o.setAttribute("data-".concat(e,"-id-value"),n),o.setAttribute("data-".concat(e,"-table-value"),r),o.setAttribute("data-".concat(e,"-collapsed-class"),"collapsed"),t.setAttribute("data-action","click->".concat(e,"#toggle"))},r=function(){document.querySelectorAll("legend[data-toggle-fieldset]").forEach((function(t){window.console&&console.warn('Using the "data-toggle-fieldset" attribute on fieldset legends is deprecated and will be removed in Contao 6. Apply the "'.concat(e,'" Stimulus controller instead.'));var r=JSON.parse(t.getAttribute("data-toggle-fieldset")),o=r.id,i=r.table;n(t,o,i)})),AjaxRequest.toggleFieldset=function(r,o,i){var s=r.parentNode;t.getControllerForElementAndIdentifier(s,e)||(window.console&&console.warn("Using AjaxRequest.toggleFieldset() is deprecated and will be removed in Contao 6. Apply the Stimulus actions instead."),n(r,o,i),setTimeout((function(){t.getControllerForElementAndIdentifier(s,e).toggle()}),100))}};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",r):r()}}],(r=[{key:"connect",value:function(){this.element.querySelectorAll("label.error, label.mandatory").length?this.element.classList.remove(this.collapsedClass):this.element.classList.contains("hide")&&(window.console&&console.warn('Using class "hide" on a fieldset is deprecated and will be removed in Contao 6. Use class "'.concat(this.collapsedClass,'" instead.')),this.element.classList.add(this.collapsedClass))}},{key:"toggle",value:function(){this.element.classList.contains(this.collapsedClass)?this.open():this.close()}},{key:"open",value:function(){this.element.classList.contains(this.collapsedClass)&&(this.element.classList.remove(this.collapsedClass),this.storeState(1))}},{key:"close",value:function(){if(!this.element.classList.contains(this.collapsedClass)){for(var e=this.element.closest("form"),t=this.element.querySelectorAll("[required]"),n=!0,r=0;r{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e,t){for(var n=0;nd});var d=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,t,arguments)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(t,e),n=t,(r=[{key:"toggle",value:function(e){var t=e.currentTarget,n=e.params.category,r=t.parentNode.classList.toggle(this.collapsedClass);t.setAttribute("aria-expanded",r?"false":"true"),t.setAttribute("title",r?this.expandTitleValue:this.collapseTitleValue),this.sendRequest(n,r)}},{key:"sendRequest",value:function(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})})}}])&&o(n.prototype,r),s&&o(n,s),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,s}(n(441).xI);c(d,"classes",["collapsed"]),c(d,"values",{url:String,requestToken:String,expandTitle:String,collapseTitle:String})},926:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(){o=function(){return t};var e,t={},n=Object.prototype,i=n.hasOwnProperty,s=Object.defineProperty||function(e,t,n){e[t]=n.value},a="function"==typeof Symbol?Symbol:{},l=a.iterator||"@@iterator",c=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag";function d(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{d({},"")}catch(e){d=function(e,t,n){return e[t]=n}}function h(e,t,n,r){var o=t&&t.prototype instanceof b?t:b,i=Object.create(o.prototype),a=new P(r||[]);return s(i,"_invoke",{value:T(e,n,a)}),i}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=h;var p="suspendedStart",g="suspendedYield",m="executing",v="completed",y={};function b(){}function w(){}function E(){}var O={};d(O,l,(function(){return this}));var k=Object.getPrototypeOf,S=k&&k(k(F([])));S&&S!==n&&i.call(S,l)&&(O=S);var x=E.prototype=b.prototype=Object.create(O);function C(e){["next","throw","return"].forEach((function(t){d(e,t,(function(e){return this._invoke(t,e)}))}))}function A(e,t){function n(o,s,a,l){var c=f(e[o],e,s);if("throw"!==c.type){var u=c.arg,d=u.value;return d&&"object"==r(d)&&i.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,a,l)}),(function(e){n("throw",e,a,l)})):t.resolve(d).then((function(e){u.value=e,a(u)}),(function(e){return n("throw",e,a,l)}))}l(c.arg)}var o;s(this,"_invoke",{value:function(e,r){function i(){return new t((function(t,o){n(e,r,t,o)}))}return o=o?o.then(i,i):i()}})}function T(t,n,r){var o=p;return function(i,s){if(o===m)throw Error("Generator is already running");if(o===v){if("throw"===i)throw s;return{value:e,done:!0}}for(r.method=i,r.arg=s;;){var a=r.delegate;if(a){var l=j(a,r);if(l){if(l===y)continue;return l}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===p)throw o=v,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=m;var c=f(t,n,r);if("normal"===c.type){if(o=r.done?v:g,c.arg===y)continue;return{value:c.arg,done:r.done}}"throw"===c.type&&(o=v,r.method="throw",r.arg=c.arg)}}}function j(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,j(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),y;var i=f(o,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,y;var s=i.arg;return s?s.done?(n[t.resultName]=s.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,y):s:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,y)}function _(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function M(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function P(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(_,this),this.reset(!0)}function F(t){if(t||""===t){var n=t[l];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,s=function n(){for(;++o=0;--o){var s=this.tryEntries[o],a=s.completion;if("root"===s.tryLoc)return r("end");if(s.tryLoc<=this.prev){var l=i.call(s,"catchLoc"),c=i.call(s,"finallyLoc");if(l&&c){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&i.call(r,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),M(n),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;M(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:F(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),y}},t}function i(e,t,n,r,o,i,s){try{var a=e[i](s),l=a.value}catch(e){return void n(e)}a.done?t(l):Promise.resolve(l).then(r,o)}function s(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var s=e.apply(t,n);function a(e){i(s,r,o,a,l,"next",e)}function l(e){i(s,r,o,a,l,"throw",e)}a(void 0)}))}}function a(e,t){for(var n=0;np});var p=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),l(this,t,arguments)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&d(e,t)}(t,e),n=t,r=[{key:"operationTargetConnected",value:function(){this.updateOperation()}},{key:"childTargetConnected",value:function(){this.updateOperation()}},{key:"toggle",value:function(e){e.preventDefault();var t=e.currentTarget;t.blur(),this.toggleToggler(t,e.params.id,e.params.level,e.params.folder)}},{key:"toggleToggler",value:function(e,t,n,r){var o=document.id(t);o&&"none"===o.style.display?(this.showChild(o),this.expandToggler(e),this.updateState(e,t,1)):o?(this.hideChild(o),this.collapseToggler(e),this.updateState(e,t,0)):this.fetchChild(e,t,n,r),this.updateOperation()}},{key:"expandToggler",value:function(e){e.classList.add("foldable--open"),e.title=this.collapseValue}},{key:"collapseToggler",value:function(e){e.classList.remove("foldable--open"),e.title=this.expandValue}},{key:"loadToggler",value:function(e,t){e.classList[t?"add":"remove"]("foldable--loading")}},{key:"showChild",value:function(e){e.style.display=""}},{key:"hideChild",value:function(e){e.style.display="none"}},{key:"fetchChild",value:(f=s(o().mark((function e(t,n,r,i){var s,a,l,c,u,d,h,f,p;return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.loadToggler(t,!0),s=new URL(location.href),(a=s.searchParams).set("ref",this.refererIdValue),s.search=a.toString(),e.next=7,fetch(s,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},body:new URLSearchParams({action:this.loadActionValue,id:n,level:r,folder:i,state:1,REQUEST_TOKEN:this.requestTokenValue})});case 7:if(!(l=e.sent).ok){e.next=37;break}return e.next=11,l.text();case 11:if(c=e.sent,(u=document.createElement("li")).id=n,u.classList.add("parent"),u.style.display="inline",u.setAttribute("data-".concat(this.identifier,"-target"),0===r?"child rootChild":"child"),(d=document.createElement("ul")).classList.add("level_"+r),d.innerHTML=c,u.append(d),5!==this.modeValue){e.next=25;break}t.closest("li").after(u),e.next=34;break;case 25:h=!1,f=t.closest("li");case 26:if("element"!==typeOf(f)||"LI"!==f.tagName||!(p=f.nextElementSibling)){e.next=33;break}if(!(f=p).classList.contains("tl_folder")){e.next=31;break}return h=!0,e.abrupt("break",33);case 31:e.next=26;break;case 33:h?f.before(u):f.after(u);case 34:window.dispatchEvent(new CustomEvent("structure")),this.expandToggler(t),window.fireEvent("ajax_change");case 37:this.loadToggler(t,!1);case 38:case"end":return e.stop()}}),e,this)}))),function(e,t,n,r){return f.apply(this,arguments)})},{key:"toggleAll",value:(h=s(o().mark((function e(t){var n,r,i=this;return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t.preventDefault(),n=t.currentTarget.href,!(this.hasExpandedRoot()^(!!t&&t.altKey))){e.next=8;break}this.updateAllState(n,0),this.toggleTargets.forEach((function(e){return i.collapseToggler(e)})),this.childTargets.forEach((function(e){return e.style.display="none"})),e.next=16;break;case 8:return this.childTargets.forEach((function(e){return e.remove()})),this.toggleTargets.forEach((function(e){return i.loadToggler(e,!0)})),e.next=12,this.updateAllState(n,1);case 12:return r=[],this.toggleTargets.forEach((function(e){r.push(i.fetchChild(e,e.getAttribute("data-".concat(i.identifier,"-id-param")),0,e.getAttribute("data-".concat(i.identifier,"-folder-param"))))})),e.next=16,Promise.all(r);case 16:this.updateOperation();case 17:case"end":return e.stop()}}),e,this)}))),function(e){return h.apply(this,arguments)})},{key:"keypress",value:function(e){this.updateOperation(e)}},{key:"updateState",value:(u=s(o().mark((function e(t,n,r){return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(location.href,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},body:new URLSearchParams({action:this.toggleActionValue,id:n,state:r,REQUEST_TOKEN:this.requestTokenValue})});case 2:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return u.apply(this,arguments)})},{key:"updateAllState",value:(c=s(o().mark((function e(t,n){return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("".concat(t,"&state=").concat(n));case 2:case"end":return e.stop()}}),e)}))),function(e,t){return c.apply(this,arguments)})},{key:"updateOperation",value:function(e){this.hasOperationTarget&&(this.hasExpandedRoot()^(!!e&&e.altKey)?(this.operationTarget.innerText=this.collapseAllValue,this.operationTarget.title=this.collapseAllTitleValue):(this.operationTarget.innerText=this.expandAllValue,this.operationTarget.title=this.expandAllTitleValue))}},{key:"hasExpandedRoot",value:function(){return!!this.rootChildTargets.find((function(e){return"none"!==e.style.display}))}}],r&&a(n.prototype,r),i&&a(n,i),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,i,c,u,h,f}(n(441).xI);h(p,"values",{mode:{type:Number,default:5},toggleAction:String,loadAction:String,requestToken:String,refererId:String,expand:String,collapse:String,expandAll:String,expandAllTitle:String,collapseAll:String,collapseAllTitle:String}),h(p,"targets",["operation","node","toggle","child","rootChild"])},213:()=>{window.AjaxRequest={toggleNavigation:function(e,t,n){window.console&&console.warn("AjaxRequest.toggleNavigation() is deprecated. Please use the stimulus controller instead.");var r=$(t),o=$(e).getParent("li");return!!r&&(o.hasClass("collapsed")?(o.removeClass("collapsed"),$(e).setAttribute("aria-expanded","true"),$(e).setAttribute("title",Contao.lang.collapse),new Request.Contao({url:n}).post({action:"toggleNavigation",id:t,state:1,REQUEST_TOKEN:Contao.request_token})):(o.addClass("collapsed"),$(e).setAttribute("aria-expanded","false"),$(e).setAttribute("title",Contao.lang.expand),new Request.Contao({url:n}).post({action:"toggleNavigation",id:t,state:0,REQUEST_TOKEN:Contao.request_token})),!1)},toggleStructure:function(e,t,n,r){window.console&&console.warn("AjaxRequest.toggleStructure() is deprecated. Please use the stimulus controller instead."),e.blur();var o=$(t);return o?("none"==o.getStyle("display")?(o.setStyle("display",null),$(e).addClass("foldable--open"),$(e).setAttribute("title",Contao.lang.collapse),new Request.Contao({field:e}).post({action:"toggleStructure",id:t,state:1,REQUEST_TOKEN:Contao.request_token})):(o.setStyle("display","none"),$(e).removeClass("foldable--open"),$(e).setAttribute("title",Contao.lang.expand),new Request.Contao({field:e}).post({action:"toggleStructure",id:t,state:0,REQUEST_TOKEN:Contao.request_token})),!1):(new Request.Contao({field:e,evalScripts:!0,onRequest:function(){AjaxRequest.displayBox(Contao.lang.loading+" …")},onSuccess:function(o){var i=new Element("li",{id:t,class:"parent",styles:{display:"inline"}});if(new Element("ul",{class:"level_"+n,html:o}).inject(i,"bottom"),5==r)i.inject($(e).getParent("li"),"after");else{for(var s,a=!1,l=$(e).getParent("li");"element"==typeOf(l)&&(s=l.getNext("li"));)if((l=s).hasClass("tl_folder")){a=!0;break}a?i.inject(l,"before"):i.inject(l,"after")}i.getElements("a").each((function(e){e.href=e.href.replace(/&ref=[a-f0-9]+/,"&ref="+Contao.referer_id)})),$(e).addClass("foldable--open"),$(e).setAttribute("title",Contao.lang.collapse),window.fireEvent("structure"),AjaxRequest.hideBox(),window.fireEvent("ajax_change")}}).post({action:"loadStructure",id:t,level:n,state:1,REQUEST_TOKEN:Contao.request_token}),!1)},toggleFileManager:function(e,t,n,r){window.console&&console.warn("AjaxRequest.toggleFileManager() is deprecated. Please use the stimulus controller instead."),e.blur();var o=$(t);return o?("none"==o.getStyle("display")?(o.setStyle("display",null),$(e).addClass("foldable--open"),$(e).setAttribute("title",Contao.lang.collapse),new Request.Contao({field:e}).post({action:"toggleFileManager",id:t,state:1,REQUEST_TOKEN:Contao.request_token})):(o.setStyle("display","none"),$(e).removeClass("foldable--open"),$(e).setAttribute("title",Contao.lang.expand),new Request.Contao({field:e}).post({action:"toggleFileManager",id:t,state:0,REQUEST_TOKEN:Contao.request_token})),!1):(new Request.Contao({field:e,evalScripts:!0,onRequest:function(){AjaxRequest.displayBox(Contao.lang.loading+" …")},onSuccess:function(n){var o=new Element("li",{id:t,class:"parent",styles:{display:"inline"}});new Element("ul",{class:"level_"+r,html:n}).inject(o,"bottom"),o.inject($(e).getParent("li"),"after"),o.getElements("a").each((function(e){e.href=e.href.replace(/&ref=[a-f0-9]+/,"&ref="+Contao.referer_id)})),$(e).addClass("foldable--open"),$(e).setAttribute("title",Contao.lang.collapse),AjaxRequest.hideBox(),window.fireEvent("ajax_change")}}).post({action:"loadFileManager",id:t,level:r,folder:n,state:1,REQUEST_TOKEN:Contao.request_token}),!1)},toggleSubpalette:function(e,t,n){e.blur();var r=$(t);function o(t){var n=e.form.elements.VERSION_NUMBER||[];n.forEach||(n=[n]),n.forEach((function(e){e.value=/]*?name="VERSION_NUMBER"\s+[^>]*?value="([^"]*)"/i.exec(t)[1]}))}r?e.value?(e.value="",e.checked="",r.setStyle("display","none"),r.getElements("[required]").each((function(e){e.set("required",null).set("data-required","")})),new Request.Contao({field:e,onSuccess:o}).post({action:"toggleSubpalette",id:t,field:n,state:0,REQUEST_TOKEN:Contao.request_token})):(e.value=1,e.checked="checked",r.setStyle("display",null),r.getElements("[data-required]").each((function(e){e.set("required","").set("data-required",null)})),new Request.Contao({field:e,onSuccess:o}).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,r){var i=new Element("div",{id:t,class:"subpal cf",html:n,styles:{display:"block"}}).inject($(e).getParent("div").getParent("div"),"after");r.javascript&&(document.write=function(e){var t="";e.replace(/' ; - if (isset($GLOBALS['TL_DCA'][$this->strTable]['list']['global_operations']['toggleNodes'])) - { - $return = '
' . $return . '
'; - } - - return $return; + return '
' . $return . '
'; } /** diff --git a/contao/drivers/DC_Table.php b/contao/drivers/DC_Table.php index 621f3fd387..cd347922c9 100644 --- a/contao/drivers/DC_Table.php +++ b/contao/drivers/DC_Table.php @@ -395,7 +395,7 @@ public function showAll() if ($this->currentPid) { - $this->redirect(Backend::addToUrl('id='.$this->currentPid, false, array('act', 'mode'))); + $this->redirect(Backend::addToUrl('id=' . $this->currentPid, false, array('act', 'mode'))); } else { @@ -4117,25 +4117,20 @@ protected function treeView() '; } - if (isset($GLOBALS['TL_DCA'][$this->strTable]['list']['global_operations']['toggleNodes'])) - { - $return = '
' . $return . '
'; - } - - return $return; + return '
' . $return . '
'; } /** From a425ed5539557f0a276de5c16954913e37a91486 Mon Sep 17 00:00:00 2001 From: Yanick Witschi Date: Wed, 19 Jun 2024 11:42:54 +0200 Subject: [PATCH 18/24] Make ID always searchable in DC_Table (see #7275) Description ----------- Problem: 1. Go to https://demo.contao.org/contao?do=form 2. Try to search for `Form ID` 3 3. You won't get any results. The reason for that is that `Form ID` relates to the HTML ID and not the database ID. This is confusing because e.g. in `tl_article` or `tl_page` you can search for the database ID so you expect to be able to do that in forms as well. I think the easiest fix for that problem is to allow searching for the database ID for form related stuff as well. Commits ------- 00d1ae11 Fix searching for form data IDs 7cafcc0a Make ID always searchable in DC_Table --- src/Resources/contao/dca/tl_article.php | 2 -- src/Resources/contao/dca/tl_content.php | 3 +-- src/Resources/contao/dca/tl_module.php | 1 - src/Resources/contao/dca/tl_page.php | 2 -- src/Resources/contao/drivers/DC_Table.php | 2 +- 5 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Resources/contao/dca/tl_article.php b/src/Resources/contao/dca/tl_article.php index 2b61d2d129..5ae11b8fba 100644 --- a/src/Resources/contao/dca/tl_article.php +++ b/src/Resources/contao/dca/tl_article.php @@ -161,8 +161,6 @@ ( 'id' => array ( - 'label' => array('ID'), - 'search' => true, 'sql' => "int(10) unsigned NOT NULL auto_increment" ), 'pid' => array diff --git a/src/Resources/contao/dca/tl_content.php b/src/Resources/contao/dca/tl_content.php index da9ad0e8f5..ea3db49be7 100644 --- a/src/Resources/contao/dca/tl_content.php +++ b/src/Resources/contao/dca/tl_content.php @@ -166,8 +166,7 @@ ( 'id' => array ( - 'sql' => "int(10) unsigned NOT NULL auto_increment", - 'search' => true + 'sql' => "int(10) unsigned NOT NULL auto_increment" ), 'pid' => array ( diff --git a/src/Resources/contao/dca/tl_module.php b/src/Resources/contao/dca/tl_module.php index 59c99a4efe..3c072b0f78 100644 --- a/src/Resources/contao/dca/tl_module.php +++ b/src/Resources/contao/dca/tl_module.php @@ -143,7 +143,6 @@ ( 'id' => array ( - 'search' => true, 'sql' => "int(10) unsigned NOT NULL auto_increment" ), 'pid' => array diff --git a/src/Resources/contao/dca/tl_page.php b/src/Resources/contao/dca/tl_page.php index ac79948ba5..903a967c3b 100644 --- a/src/Resources/contao/dca/tl_page.php +++ b/src/Resources/contao/dca/tl_page.php @@ -204,8 +204,6 @@ ( 'id' => array ( - 'label' => array('ID'), - 'search' => true, 'sql' => "int(10) unsigned NOT NULL auto_increment" ), 'pid' => array diff --git a/src/Resources/contao/drivers/DC_Table.php b/src/Resources/contao/drivers/DC_Table.php index 362428e7b8..c0a871cc20 100644 --- a/src/Resources/contao/drivers/DC_Table.php +++ b/src/Resources/contao/drivers/DC_Table.php @@ -5217,7 +5217,7 @@ protected function listView() */ protected function searchMenu() { - $searchFields = array(); + $searchFields = array('id'); /** @var AttributeBagInterface $objSessionBag */ $objSessionBag = System::getContainer()->get('session')->getBag('contao_backend'); From 25a45233f5872788e157201c1fb67bb1e6ac2133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ausw=C3=B6ger?= Date: Wed, 19 Jun 2024 11:46:26 +0200 Subject: [PATCH 19/24] Evaluate scripts in Ajax form responses (see #7292) Description ----------- Fixes #7203 Commits ------- e0d907fe Evaluate scripts in ajax form responses --- contao/templates/forms/form_wrapper.html5 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contao/templates/forms/form_wrapper.html5 b/contao/templates/forms/form_wrapper.html5 index 8627af6446..396d2754d9 100644 --- a/contao/templates/forms/form_wrapper.html5 +++ b/contao/templates/forms/form_wrapper.html5 @@ -65,10 +65,10 @@ return; } - const template = document.createElement('template'); - template.innerHTML = xhr.responseText.trim(); + const range = document.createRange(); + range.selectNode(form.parentNode); - const newForm = template.content.firstElementChild; + const newForm = range.createContextualFragment(xhr.responseText).firstElementChild; form.replaceWith(newForm); if (!newForm.getAttribute('action')) { From 3b617ca155a70567385f56efce20350f958a4433 Mon Sep 17 00:00:00 2001 From: Leo Feyer <1192057+leofeyer@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:42:24 +0200 Subject: [PATCH 20/24] Add a comment change that was lost in the upstream merge --- src/EventListener/RequestTokenListener.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EventListener/RequestTokenListener.php b/src/EventListener/RequestTokenListener.php index a6176c728e..a8dcc09426 100644 --- a/src/EventListener/RequestTokenListener.php +++ b/src/EventListener/RequestTokenListener.php @@ -50,7 +50,7 @@ public function __invoke(RequestEvent $event): void // Only check the request token if a) the request is a POST request, b) the // request is not an Ajax request, c) the _token_check attribute is not false, d) - // the _token_check attribute is set or the request is a Contao request and e) + // the _token_check attribute is true or the request is a Contao request and e) // the request has cookies, an authenticated user or the session has been started if ( 'POST' !== $request->getRealMethod() From fb12b690c35d5129ccc0d51ea2f3b3757178511e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ausw=C3=B6ger?= Date: Mon, 24 Jun 2024 15:45:32 +0200 Subject: [PATCH 21/24] Fix symlinked file not inside root directory (see #7294) Description ----------- Fixes #5869 by using a workaround until our image library supports virtual storages and/or streams. @m-vo the solution outlined in https://github.com/contao/contao/issues/5869#issuecomment-1691961542 seemed too complex for a temporary workaround for me. In the end I think our image factory should return a filesystem item that can properly be used to pass it to `generatePublicUri()` or something like that. Commits ------- 0de8d734 Fix symlinked file not inside root directory --- config/services.yaml | 1 + src/Image/Studio/FigureBuilder.php | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/config/services.yaml b/config/services.yaml index a6ee6bf8a3..89d37aeb0c 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -413,6 +413,7 @@ services: contao.image.resizer: '@contao.image.resizer' contao.assets.files_context: '@contao.assets.files_context' contao.framework: '@contao.framework' + contao.filesystem.virtual.files: '@contao.filesystem.virtual.files' event_dispatcher: '@event_dispatcher' - '%kernel.project_dir%' - '%contao.upload_path%' diff --git a/src/Image/Studio/FigureBuilder.php b/src/Image/Studio/FigureBuilder.php index 84421d1824..15cdcb31be 100644 --- a/src/Image/Studio/FigureBuilder.php +++ b/src/Image/Studio/FigureBuilder.php @@ -330,6 +330,18 @@ public function from(FilesModel|ImageInterface|int|string|null $identifier): sel */ public function fromStorage(VirtualFilesystemInterface $storage, Uuid|string $location): self { + // TODO: After contao/image supports a virtual storage, remove this workaround + // and replace it with something that can use $storage->generatePublicUri(). This + // workaround is currently required to support paths to symlinked folders inside + // the files directory. + if ($storage === $this->locator->get('contao.filesystem.virtual.files')) { + $path = Path::join($this->webDir, $this->uploadPath, $storage->get($location)->getPath()); + + if ($this->filesystem->exists($path)) { + return $this->fromPath($path); + } + } + try { $stream = $storage->readStream($location); } catch (VirtualFilesystemException|UnableToResolveUuidException $e) { From 1046d8d26d0669f94bd18e7f906ab6ead6729c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ausw=C3=B6ger?= Date: Mon, 24 Jun 2024 15:50:01 +0200 Subject: [PATCH 22/24] Prevent double form submission (see #7293) Description ----------- Fixes https://github.com/contao/contao/pull/6617#issuecomment-2139702736 I went with a 30 second delay as 10 seconds seemed too short when testing. Commits ------- 1bb023e1 Prevent double form submission --- contao/templates/forms/form_wrapper.html5 | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/contao/templates/forms/form_wrapper.html5 b/contao/templates/forms/form_wrapper.html5 index 396d2754d9..9296aa51a4 100644 --- a/contao/templates/forms/form_wrapper.html5 +++ b/contao/templates/forms/form_wrapper.html5 @@ -54,6 +54,9 @@ // Send the triggered button data as well if (e.submitter) { formData.append(e.submitter.name, e.submitter.value); + // Prevent double form submission + e.submitter.disabled = true; + setTimeout(() => e.submitter.disabled = false, 30000); } request(form, formData, xhr => { @@ -83,4 +86,14 @@ initForm(el); }); + + attr()->setIfExists('nonce', $this->nonce('script-src')) ?>> + document.currentScript.previousElementSibling.querySelector('form').addEventListener('submit', e => { + // Prevent double form submission + if (e.submitter) { + e.submitter.disabled = true; + setTimeout(() => e.submitter.disabled = false, 30000); + } + }); + From e16deb3f02eafc2eed116c5a7e6ad671bada7694 Mon Sep 17 00:00:00 2001 From: Leo Feyer <1192057+leofeyer@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:07:58 +0200 Subject: [PATCH 23/24] Update and run the tools (see #7304) Description ----------- Commits ------- 2e5990ec Update and run the tools --- contao/templates/forms/form_wrapper.html5 | 1 + .../Compiler/IntlInstalledLocalesAndCountriesPass.php | 1 + tests/Contao/StringUtilTest.php | 1 + tests/Filesystem/VirtualFilesystemTest.php | 2 ++ 4 files changed, 5 insertions(+) diff --git a/contao/templates/forms/form_wrapper.html5 b/contao/templates/forms/form_wrapper.html5 index 9296aa51a4..971d97f4a0 100644 --- a/contao/templates/forms/form_wrapper.html5 +++ b/contao/templates/forms/form_wrapper.html5 @@ -54,6 +54,7 @@ // Send the triggered button data as well if (e.submitter) { formData.append(e.submitter.name, e.submitter.value); + // Prevent double form submission e.submitter.disabled = true; setTimeout(() => e.submitter.disabled = false, 30000); diff --git a/src/DependencyInjection/Compiler/IntlInstalledLocalesAndCountriesPass.php b/src/DependencyInjection/Compiler/IntlInstalledLocalesAndCountriesPass.php index 55c5cb3747..3cdb8c0daf 100644 --- a/src/DependencyInjection/Compiler/IntlInstalledLocalesAndCountriesPass.php +++ b/src/DependencyInjection/Compiler/IntlInstalledLocalesAndCountriesPass.php @@ -53,6 +53,7 @@ private function getEnabledLocales(ContainerBuilder $container): array } // The default locale must be the first supported language (see contao/core#6533) + /** @var array $languages */ $languages = [$defaultLocale]; $finder = Finder::create()->directories()->depth(0)->name('/^[a-z]{2,}/')->in($dirs); diff --git a/tests/Contao/StringUtilTest.php b/tests/Contao/StringUtilTest.php index 1c377b845c..a0ad06eec5 100644 --- a/tests/Contao/StringUtilTest.php +++ b/tests/Contao/StringUtilTest.php @@ -558,6 +558,7 @@ public function testResolvesReferencesInArrays(): void $this->assertNotSame($ref, $dereferenced[0]); $this->assertSame($ref, $array[0]); + /** @phpstan-ignore method.impossibleType */ $this->assertSame( [ ['a'], diff --git a/tests/Filesystem/VirtualFilesystemTest.php b/tests/Filesystem/VirtualFilesystemTest.php index 4970d25e5e..f6b1e0d453 100644 --- a/tests/Filesystem/VirtualFilesystemTest.php +++ b/tests/Filesystem/VirtualFilesystemTest.php @@ -560,6 +560,7 @@ static function () use (&$handlerInvocationCount) { $this->assertInstanceOf(FilesystemItem::class, $fileB); $this->assertTrue($fileB->isFile()); + /** @phpstan-ignore method.impossibleType */ $this->assertSame(3, $handlerInvocationCount); $this->assertSame(12345, $fileB->getLastModified()); @@ -567,6 +568,7 @@ static function () use (&$handlerInvocationCount) { $this->assertSame('image/png', $fileB->getMimeType()); $this->assertSame(['extra' => 'data'], $fileB->getExtraMetadata()); + /** @phpstan-ignore method.impossibleType */ $this->assertSame(7, $handlerInvocationCount); } From 86cf7e1285c71da772e7faab053a3351f3252086 Mon Sep 17 00:00:00 2001 From: Leo Feyer <1192057+leofeyer@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:08:22 +0200 Subject: [PATCH 24/24] Remove two leftover clearing DIVs (see #7300) Description ----------- We render the rows with flexbox now. Commits ------- 819027d1 Remove two leftover clearing DIVs --- contao/drivers/DC_Folder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contao/drivers/DC_Folder.php b/contao/drivers/DC_Folder.php index 912624ec6a..d8c003ae4f 100644 --- a/contao/drivers/DC_Folder.php +++ b/contao/drivers/DC_Folder.php @@ -2759,7 +2759,7 @@ protected function generateTree($path, $intMargin, $mount=false, $blnProtected=t } } - $return .= '
'; + $return .= ''; // Call the next node if (!empty($content) && $blnIsOpen) @@ -2860,7 +2860,7 @@ protected function generateTree($path, $intMargin, $mount=false, $blnProtected=t } } - $return .= $_buttons . '
'; + $return .= $_buttons . ''; } return $return;