├── .gitignore ├── assets ├── na.png ├── js │ ├── modules.min.js │ ├── modules.js │ ├── script.min.js │ └── script.js └── css │ └── styles.css ├── uninstall.php ├── pages ├── index.php ├── settings.php └── modules.php ├── .php-cs-fixer.dist.php ├── update.php ├── .tools └── bootstrap.php ├── .github └── workflows │ ├── publish-to-redaxo.yml │ └── code-style.yml ├── lib ├── module_preview_api.php └── module_preview.php ├── install.php ├── package.yml ├── composer.json ├── .stylelintrc.js ├── README.md ├── phpunit.xml.dist ├── help.php ├── lang ├── en_gb.lang └── de_de.lang ├── LICENSE ├── .eslintrc.js ├── fragments └── module_preview │ └── image-upload.php ├── scss ├── modules.scss └── styles.scss ├── boot.php ├── .editorconfig └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | /vendor/ 3 | /.php-cs-fixer.cache -------------------------------------------------------------------------------- /assets/na.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FriendsOfREDAXO/module_preview/HEAD/assets/na.png -------------------------------------------------------------------------------- /uninstall.php: -------------------------------------------------------------------------------- 1 | i18n('name')); 6 | 7 | rex_be_controller::includeCurrentPageSubPath(); 8 | -------------------------------------------------------------------------------- /.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | in(__DIR__) 7 | ; 8 | 9 | return (new Redaxo\PhpCsFixerConfig\Config()) 10 | ->setFinder($finder) 11 | ; 12 | -------------------------------------------------------------------------------- /update.php: -------------------------------------------------------------------------------- 1 | hasConfig()) { 6 | $addon->setConfig([ 7 | 'classic' => false, 8 | 'hide_search' => true, 9 | 'hide_images' => false, 10 | ]); 11 | } 12 | -------------------------------------------------------------------------------- /.tools/bootstrap.php: -------------------------------------------------------------------------------- 1 | getSearch(); 12 | } 13 | $output .= $modulePreview->getModules(); 14 | 15 | header('Content-Type: text/html; charset=UTF-8'); 16 | echo $output; 17 | exit; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /assets/js/modules.min.js: -------------------------------------------------------------------------------- 1 | $(document).on("rex:ready",function(){const e=document.querySelectorAll("input.module-image-input"),t=$("form.module-row"),o=$(".module-col .module").find("button.delete-image");for(let t=0;t{const[o]=e[t].files,n=document.getElementById("img-"+e[t].id);o&&(n.src=URL.createObjectURL(o))});o.on("click",function(e){e.preventDefault(),$("#rex-js-ajax-loader").addClass("rex-visible"),$.post(t.attr("action"),{delete_image:!0,image:$(this).data("image")}).done(function(){location.reload()}).fail(function(e){alert(e.responseText)}).always(function(){$("#rex-js-ajax-loader").removeClass("rex-visible")})})}); 2 | -------------------------------------------------------------------------------- /install.php: -------------------------------------------------------------------------------- 1 | hasConfig()) { 6 | $addon->setConfig([ 7 | 'classic' => false, 8 | 'hide_search' => true, 9 | 'hide_images' => false, 10 | 'load_images_from_theme' => false, 11 | ]); 12 | } 13 | 14 | if (class_exists('rex_scss_compiler')) { 15 | $compiler = new rex_scss_compiler(); 16 | $compiler->setRootDir(rex_path::addon('module_preview/scss')); 17 | $compiler->setScssFile([$addon->getPath('scss/styles.scss')]); 18 | $compiler->setCssFile($addon->getPath('assets/css/styles.css')); 19 | $compiler->compile(); 20 | } 21 | 22 | rex_dir::create(rex_path::assets('addons/module_preview_modules')); 23 | -------------------------------------------------------------------------------- /package.yml: -------------------------------------------------------------------------------- 1 | package: module_preview 2 | version: '1.3.0' 3 | author: 'Friends Of REDAXO' 4 | 5 | page: 6 | title: Module preview 7 | perm: admin[] 8 | icon: rex-icon fa-th 9 | subpages: 10 | settings: { title: translate:settings } 11 | modules: { title: translate:manage_images } 12 | 13 | requires: 14 | redaxo: ^5.7.0 15 | php: 16 | version: '>=7.4' 17 | 18 | installer_ignore: 19 | - node_modules 20 | - .git 21 | - .gitignore 22 | - .github 23 | - tests 24 | - .tools 25 | - package.json 26 | - yarn.lock 27 | - resources 28 | - .editorconfig 29 | - .eslintrc.js 30 | - .stylelintrc.js 31 | - phpcs.xml 32 | - phpunit.xml.dist 33 | - composer.json 34 | - composer 35 | - composer.lock 36 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "friedsofredaxo/module_preview", 3 | "description": "Module preview for REDAXO 5", 4 | "license": "MIT", 5 | "scripts": { 6 | "lint": "phplint ./ --exclude=vendor --no-cache lib", 7 | "cs-dry": "php-cs-fixer fix -v --ansi --dry-run --config=.php-cs-fixer.dist.php", 8 | "cs-fix": "php-cs-fixer fix -v --ansi --config=.php-cs-fixer.dist.php" 9 | }, 10 | "autoload-dev": { 11 | "classmap": [ 12 | "lib/module_preview.php" 13 | ] 14 | }, 15 | "require-dev": { 16 | "overtrue/phplint": "^4.1", 17 | "redaxo/php-cs-fixer-config": "^2.2.0", 18 | "friendsofphp/php-cs-fixer": "^3.30.0" 19 | }, 20 | "config": { 21 | "allow-plugins": { 22 | "pestphp/pest-plugin": true 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.stylelintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'extends': 'stylelint-config-standard', 3 | 'rules': { 4 | 'no-empty-source': null, 5 | 'string-quotes': 'double', 6 | 'at-rule-no-unknown': [ 7 | true, 8 | { 9 | 'ignoreAtRules': [ 10 | 'extend', 11 | 'at-root', 12 | 'debug', 13 | 'warn', 14 | 'error', 15 | 'if', 16 | 'else', 17 | 'for', 18 | 'each', 19 | 'while', 20 | 'mixin', 21 | 'include', 22 | 'content', 23 | 'return', 24 | 'function', 25 | 'tailwind', 26 | 'apply', 27 | 'responsive', 28 | 'variants', 29 | 'screen', 30 | ], 31 | }, 32 | ], 33 | }, 34 | }; 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # REDAXO-Addon: Module preview 2 | 3 | REDAXO 5 Addon um eine Vorschau (Screenshot) bei der Modulauswahl anzuzeigen 4 | 5 | ![Screenshot](https://raw.githubusercontent.com/eaCe/module_preview/assets/screenshot.jpg) 6 | 7 | Die Screenshots der Modulausgaben sollten im 16:9 Format vorliegen und im Asset Ordner (assets\addons\module_preview_modules) abgelegt werden. 8 | 9 | Die Modul-ID oder der Modul-Key gibt den Bildnamen vor (1.jpg, 2.jpg, etc. oder modul_key.jpg, text.jpg etc.). 10 | 11 | Ist das Theme- und Developer-Addon installiert und die Einstellung "Lade Bilder aus Theme Addon" aktiviert, so werden die Vorschaubilder aus dem Modul-Ordner des Theme-Addons geladen. 12 | Dazu muss eine .jpg mit dem Namen `module_preview.jpg` in das Verzeichniss `/private/redaxo/modules/__MODULNAME__'` gelegt werden. 13 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | tests 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /help.php: -------------------------------------------------------------------------------- 1 |

2 | Die Screenshots der Modulausgaben sollten im 16:9 Format vorliegen und im Asset Ordner 3 | (assets\addons\module_preview_modules) abgelegt werden. 4 |
5 |
6 | Die Modul-ID gibt den Bildname vor (1.jpg, 2.jpg, etc.). 7 |
8 |
9 | Ist das Theme- und Developer-Addon installiert und die Einstellung "Lade Bilder aus Theme Addon" aktiviert, so werden die Vorschaubilder aus dem Modul-Ordner des Theme-Addons geladen. 10 |
11 | Dazu muss eine .jpg mit dem Namen module_preview.jpg in das Verzeichniss /private/redaxo/modules/__MODULNAME__ gelegt werden. 12 | 18 |

19 | -------------------------------------------------------------------------------- /lang/en_gb.lang: -------------------------------------------------------------------------------- 1 | module_preview_classic = Use classic dropdown 2 | module_preview_settings = Settings 3 | module_preview_save = Save settings 4 | module_preview_saved = Settings have been saved 5 | module_preview_error = An error occurred 6 | module_preview_search_modules = Search modules 7 | module_preview_hide_search = Hide search 8 | module_preview_hide_images = Hide images 9 | module_preview_select_image = Select image 10 | module_preview_save = Save 11 | module_preview_manage_images = Manage images 12 | module_preview_image_not_found = Image could not be found 13 | module_preview_upload_max_filesize = The uploaded file exceeds the maximum upload size 14 | module_preview_upload_max_file_uploads = A maximum of {0} files can be uploaded at the same time 15 | module_preview_version_warning = This functionality is only available from REDAXO >= 5.12.0. 16 | module_preview_load_images_from_theme = Load images from theme addon -------------------------------------------------------------------------------- /lang/de_de.lang: -------------------------------------------------------------------------------- 1 | module_preview_classic = Klassisches Dropdown nutzen 2 | module_preview_settings = Einstellungen 3 | module_preview_save = Einstellungen speichern 4 | module_preview_saved = Die Einstellungen wurden gespeichert. 5 | module_preview_error = Es ist ein Fehler aufgetreten. 6 | module_preview_search_modules = Module suchen 7 | module_preview_hide_search = Suche ausblenden 8 | module_preview_hide_images = Bilder ausblenden 9 | module_preview_select_image = Bild auswählen 10 | module_preview_save = Speichern 11 | module_preview_manage_images = Bilder verwalten 12 | module_preview_image_not_found = Das Bild konnte nicht gefunden werden 13 | module_preview_upload_max_filesize = Die hochgeladene Datei überschreitet die maximale Upload-Größe 14 | module_preview_upload_max_file_uploads = Es können maximal {0} Dateien gleichzeitig hochgeladen werden 15 | module_preview_version_warning = Diese Funktionalität steht erst ab REDAXO >= 5.12.0 zur Verfügung. 16 | module_preview_load_images_from_theme = Lade Bilder aus Theme Addon 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 FriendsOfREDAXO 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'root': true, 3 | 'extends': 'eslint:recommended', 4 | 'globals': { 5 | 'wp': true, 6 | }, 7 | 'env': { 8 | 'node': true, 9 | 'es6': true, 10 | 'amd': true, 11 | 'browser': true, 12 | 'jquery': true, 13 | }, 14 | 'parserOptions': { 15 | 'ecmaFeatures': { 16 | 'globalReturn': true, 17 | 'generators': false, 18 | 'objectLiteralDuplicateProperties': false, 19 | 'experimentalObjectRestSpread': true, 20 | }, 21 | 'ecmaVersion': 2018, 22 | 'sourceType': 'module', 23 | }, 24 | 'plugins': [ 25 | 'import', 26 | ], 27 | 'settings': { 28 | 'import/core-modules': [], 29 | 'import/ignore': [ 30 | 'node_modules', 31 | '\\.(coffee|scss|css|less|hbs|svg|json)$', 32 | ], 33 | }, 34 | 'rules': { 35 | 'no-console': 0, 36 | 'quotes': ['error', 'single'], 37 | 'comma-dangle': [ 38 | 'error', 39 | { 40 | 'arrays': 'always-multiline', 41 | 'objects': 'always-multiline', 42 | 'imports': 'always-multiline', 43 | 'exports': 'always-multiline', 44 | 'functions': 'ignore', 45 | }, 46 | ], 47 | }, 48 | }; 49 | -------------------------------------------------------------------------------- /assets/js/modules.js: -------------------------------------------------------------------------------- 1 | $(document).on('rex:ready', function () { 2 | const $moduleImageInputs = document.querySelectorAll('input.module-image-input'); 3 | const $form = $('form.module-row'); 4 | const $modules = $('.module-col .module'); 5 | const $deleteImage = $modules.find('button.delete-image'); 6 | 7 | for (let i = 0; i < $moduleImageInputs.length; i++) { 8 | $moduleImageInputs[i].onchange = () => { 9 | const [file] = $moduleImageInputs[i].files; 10 | const $image = document.getElementById('img-' + $moduleImageInputs[i].id); 11 | if (file) { 12 | $image.src = URL.createObjectURL(file); 13 | } 14 | }; 15 | } 16 | 17 | $deleteImage.on('click', function (event) { 18 | event.preventDefault(); 19 | 20 | $('#rex-js-ajax-loader').addClass('rex-visible'); 21 | $.post($form.attr('action'), {'delete_image': true, 'image': $(this).data('image')}) 22 | .done(function () { 23 | location.reload(); 24 | }) 25 | .fail(function (response) { 26 | alert(response.responseText); 27 | }) 28 | .always(function () { 29 | $('#rex-js-ajax-loader').removeClass('rex-visible'); 30 | }); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /.github/workflows/code-style.yml: -------------------------------------------------------------------------------- 1 | name: PHP-CS-Fixer 2 | 3 | on: 4 | push: 5 | branches: [ master, main ] 6 | pull_request: 7 | branches: [ master, main ] 8 | 9 | permissions: 10 | contents: read 11 | 12 | jobs: 13 | code-style: 14 | 15 | runs-on: ubuntu-latest 16 | permissions: 17 | contents: write # for Git to git apply 18 | 19 | steps: 20 | - uses: actions/checkout@v3 21 | 22 | - name: Setup PHP 23 | uses: shivammathur/setup-php@v2 24 | with: 25 | php-version: '8.1' 26 | extensions: gd, intl, pdo_mysql 27 | coverage: none # disable xdebug, pcov 28 | 29 | # install dependencies from composer.json 30 | - name: Install test dependencies 31 | env: 32 | COMPOSER: composer.json 33 | run: composer install --prefer-dist --no-progress 34 | 35 | # run php-cs-fixer, fix code styles 36 | - name: Run PHP CS Fixer 37 | run: composer cs-fix 38 | 39 | # commit and push fixed files 40 | - uses: stefanzweifel/git-auto-commit-action@v4 41 | with: 42 | commit_message: Apply php-cs-fixer changes 43 | -------------------------------------------------------------------------------- /fragments/module_preview/image-upload.php: -------------------------------------------------------------------------------- 1 | getVar('module'); 5 | 6 | ['image' => $image, 'moduleKey' => $key] = module_preview::getModulePreviewImage($module); 7 | ?> 8 | 9 |
10 |
[]
11 |
12 |
13 | 14 | 17 | <?= rex_i18n::translate($module['name'], false) ?> 18 | 19 | Not available 20 | 21 |
22 |
23 | 27 |
28 |
29 |
30 | -------------------------------------------------------------------------------- /scss/modules.scss: -------------------------------------------------------------------------------- 1 | .module-container { 2 | max-width: 1400px; 3 | 4 | .module-row { 5 | display: flex; 6 | flex-wrap: wrap; 7 | margin-right: -15px; 8 | margin-left: -15px; 9 | 10 | .module-col { 11 | flex: 0 0 auto; 12 | width: 25%; 13 | padding: 0 15px; 14 | display: flex; 15 | flex-direction: column; 16 | justify-content: flex-end; 17 | 18 | @media (max-width: 1200px) { 19 | width: 33.33333333333333%; 20 | } 21 | 22 | @media (max-width: 600px) { 23 | width: 50%; 24 | } 25 | 26 | @media (max-width: 400px) { 27 | width: 100%; 28 | } 29 | 30 | .module { 31 | margin-top: 10px; 32 | } 33 | } 34 | } 35 | 36 | label.file-label { 37 | input[type="file"] { 38 | position: absolute; 39 | top: -1000%; 40 | left: -1000%; 41 | visibility: hidden; 42 | } 43 | 44 | &:hover { 45 | background: #cccccc; 46 | } 47 | 48 | &:active { 49 | background: #ccccff; 50 | } 51 | } 52 | 53 | .image { 54 | display: inline-block; 55 | width: 100%; 56 | background-color: #5bb585; 57 | border: 1px solid #5bb585; 58 | overflow: hidden; 59 | position: relative; 60 | 61 | &::before { 62 | display: block; 63 | padding-top: 56.25%; 64 | content: ""; 65 | } 66 | 67 | > div { 68 | top: 0; 69 | left: 0; 70 | width: 100%; 71 | height: 100%; 72 | position: absolute; 73 | } 74 | 75 | img { 76 | object-fit: cover; 77 | width: 100%; 78 | height: 100%; 79 | position: absolute; 80 | top: 0; 81 | left: 0; 82 | 83 | &.n-a { 84 | opacity: 0.75; 85 | } 86 | } 87 | 88 | .delete-image { 89 | position: absolute; 90 | top: 5px; 91 | right: 5px; 92 | border: 0; 93 | margin: 0; 94 | padding: 10px; 95 | height: 35px; 96 | width: 35px; 97 | line-height: 15px; 98 | background-color: #8b0000; 99 | color: #ffffff; 100 | z-index: 5; 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /assets/js/script.min.js: -------------------------------------------------------------------------------- 1 | let $showModulePreview,slicePosition,slice,$modules,$modulePreview,$close,$body,$html,previewActive=!1,moduleAdded=!1;function showModulePreview(){$.ajax({url:$showModulePreview.eq(0).data("url"),beforeSend:function(){}}).done(function(e){if(e){$modulePreview.find(".inner").html(e),previewActive=!0,$modulePreview.fadeIn(),$body.addClass("module-preview"),$body.css("height","auto"),$html.css("overflow","hidden"),$body.addClass("modal-open"),($modules=$modulePreview.find("a.module")).parent().show();for(let e=0;e<$modules.length;e++){const o=$modules.eq(e).data("href");$modules.eq(e).attr("href",o+"&slice_id="+slice+"#"+slicePosition)}attachModuleEventHandler()}}).fail(function(e,o,i){console.error("script.js:89"," ↴","\n",e,o,i)})}function attachModuleEventHandler(){$modulesSearch=$modulePreview.find("#module-preview-search"),$modulesSearch.length&&$modulesSearch.focus(),$modules.on("click",function(){const e=$(this);moduleAdded=!0,new RegExp("\\bpage="+rex.page+"(\\b[^/]|$)").test(e.attr("href"))&&hideModulePreview()}),$modulesSearch.on("keyup",function(){const e=$modulesSearch.val();e?($modules.parent().hide(),$modules.filter(":icontains("+e+")").parent().show()):$modules.parent().show()});const e=$modulePreview.find("select, input, textarea, button, a"),o=e.first(),i=e.last();i.on("keydown",function(e){9===e.which&&!e.shiftKey&&previewActive&&(e.preventDefault(),o.focus())}),o.on("keydown",function(e){9===e.which&&e.shiftKey&&previewActive&&(e.preventDefault(),i.focus())})}function hideModulePreview(){$modulePreview.fadeOut(function(){previewActive=!1,$body.removeClass("module-preview"),$body.css("height","100%"),$html.css("overflow","initial"),$body.removeClass("modal-open"),$modulePreview.find(".inner").empty(),moduleAdded&&setTimeout(function(){$("#REX_FORM").length&&($("html,body").scrollTop($("#REX_FORM").offset().top),moduleAdded=!1)},10)})}$(document).on("rex:ready",function(){$showModulePreview=$("button.show-module-preview"),$modulePreview=$("#module-preview"),$close=$modulePreview.find(".close"),$body=$("body"),$html=$("html"),hideModulePreview(),$showModulePreview.off("click"),$close.off("click"),$showModulePreview.on("click",function(e){e.preventDefault(),slicePosition=$(this).parents("li").attr("id"),slice=$(this).data("slice"),previewActive?hideModulePreview():showModulePreview()}),$modulePreview.on("click",function(e){const o=$(e.target);(o.hasClass("module-list")||o.parent().hasClass("inner")||"module-preview"===o.attr("id"))&&(e.preventDefault(),e.stopPropagation(),hideModulePreview())}),$close.on("click",function(e){e.preventDefault(),hideModulePreview()}),jQuery.expr[":"].icontains=function(e,o,i){return jQuery(e).text().toUpperCase().indexOf(i[3].toUpperCase())>=0}}),$(document).on("keyup",function(e){"Escape"===e.key&&hideModulePreview()}); 2 | -------------------------------------------------------------------------------- /boot.php: -------------------------------------------------------------------------------- 1 | getAssetsUrl('css/styles.css')); 7 | rex_view::addJSFile($this->getAssetsUrl('js/modules.min.js')); 8 | } 9 | 10 | if (rex::isBackend() && rex::getUser() && rex_config::get('module_preview', 'load_images_from_theme') && rex_addon::exists('theme') && rex_addon::get('theme')->isAvailable()) { 11 | $page = $this->getProperty('page'); 12 | unset($page['subpages']['modules']); 13 | $this->setProperty('page', $page); 14 | } 15 | 16 | if (rex::isBackend() && ('index.php?page=content/edit' == rex_url::currentBackendPage() && rex::getUser() && !$useClassic)) { 17 | rex_view::addJSFile($this->getAssetsUrl('js/script.min.js')); 18 | rex_view::addCssFile($this->getAssetsUrl('css/styles.css')); 19 | 20 | $bloecksDragIsInstalled = false; 21 | if (rex_addon::exists('bloecks')) { 22 | $addons = rex_addon::getInstalledAddons(); 23 | 24 | if (isset($addons['bloecks'])) { 25 | $bloecksDragIsInstalled = $addons['bloecks']->getPlugin('dragndrop')->isAvailable(); 26 | } 27 | } 28 | 29 | rex_extension::register('STRUCTURE_CONTENT_MODULE_SELECT', static function (rex_extension_point $ep) use ($bloecksDragIsInstalled) { 30 | $clang = rex_request('clang', 'int'); 31 | $clang = rex_clang::exists($clang) ? $clang : rex_clang::getStartId(); 32 | $category_id = rex_request('category_id', 'int'); 33 | $article_id = rex_request('article_id', 'int'); 34 | $ctype = rex_request('ctype', 'int'); 35 | 36 | $params = [ 37 | 'clang' => $clang, 38 | 'category_id' => $category_id, 39 | 'article_id' => $article_id, 40 | 'ctype' => $ctype, 41 | 'buster' => time(), 42 | ]; 43 | 44 | $html = '
'; 45 | $html .= ''; 49 | $html .= '
'; 50 | 51 | $ep->setSubject($html); 52 | }); 53 | 54 | rex_extension::register('OUTPUT_FILTER', static function (rex_extension_point $ep) { 55 | $output = '
'; 56 | $output .= '
'; 57 | $output .= '
'; 58 | 59 | if ($output) { 60 | $ep->setSubject(str_ireplace( 61 | [''], 62 | [$output . ''], 63 | $ep->getSubject()), 64 | ); 65 | } 66 | }); 67 | } 68 | -------------------------------------------------------------------------------- /pages/settings.php: -------------------------------------------------------------------------------- 1 | setConfig(rex_post('config', [ 7 | ['classic', 'bool'], 8 | ['hide_search', 'bool'], 9 | ['hide_images', 'bool'], 10 | ['load_images_from_theme', 'bool'], 11 | ])); 12 | 13 | echo rex_view::success($this->i18n('saved')); 14 | } 15 | 16 | $content = '
'; 17 | 18 | $formElements = []; 19 | 20 | $n = []; 21 | $n['label'] = ''; 22 | $n['field'] = 'getConfig('classic') ? ' checked="checked"' : '') . ' />'; 23 | $formElements[] = $n; 24 | 25 | $fragment = new rex_fragment(); 26 | $fragment->setVar('elements', $formElements, false); 27 | $content .= $fragment->parse('core/form/checkbox.php'); 28 | 29 | $formElements = []; 30 | 31 | $n = []; 32 | $n['label'] = ''; 33 | $n['field'] = 'getConfig('hide_search') ? ' checked="checked"' : '') . ' />'; 34 | $formElements[] = $n; 35 | 36 | $fragment = new rex_fragment(); 37 | $fragment->setVar('elements', $formElements, false); 38 | $content .= $fragment->parse('core/form/checkbox.php'); 39 | 40 | $formElements = []; 41 | 42 | $n = []; 43 | $n['label'] = ''; 44 | $n['field'] = 'getConfig('hide_images') ? ' checked="checked"' : '') . ' />'; 45 | $formElements[] = $n; 46 | 47 | $fragment = new rex_fragment(); 48 | $fragment->setVar('elements', $formElements, false); 49 | $content .= $fragment->parse('core/form/checkbox.php'); 50 | 51 | $formElements = []; 52 | 53 | if (rex_addon::exists('theme') && rex_addon::get('theme')->isAvailable()) { 54 | $n = []; 55 | $n['label'] = ''; 56 | $n['field'] = 'getConfig('load_images_from_theme') ? ' checked="checked"' : '') . ' />'; 57 | $formElements[] = $n; 58 | } 59 | 60 | $fragment = new rex_fragment(); 61 | $fragment->setVar('elements', $formElements, false); 62 | $content .= $fragment->parse('core/form/checkbox.php'); 63 | 64 | $formElements = []; 65 | 66 | $n = []; 67 | $n['field'] = ''; 68 | $formElements[] = $n; 69 | 70 | $fragment = new rex_fragment(); 71 | $fragment->setVar('flush', true); 72 | $fragment->setVar('elements', $formElements, false); 73 | $buttons = $fragment->parse('core/form/submit.php'); 74 | 75 | $fragment = new rex_fragment(); 76 | $fragment->setVar('class', 'edit'); 77 | $fragment->setVar('title', $this->i18n('settings')); 78 | $fragment->setVar('body', $content, false); 79 | $fragment->setVar('buttons', $buttons, false); 80 | $content = $fragment->parse('core/page/section.php'); 81 | 82 | echo ' 83 |
84 | ' . $content . ' 85 |
'; 86 | -------------------------------------------------------------------------------- /pages/modules.php: -------------------------------------------------------------------------------- 1 | symfony/http-foundation 7 | * https://github.com/redaxo/redaxo/releases/tag/5.12.0. 8 | */ 9 | if (rex_version::compare(rex::getVersion(), '5.12.0', '<')) { 10 | $warning = ''; 11 | $fragment = new rex_fragment(); 12 | $fragment->setVar('body', $warning, false); 13 | $content = $fragment->parse('core/page/section.php'); 14 | echo $content; 15 | } else { 16 | /** @var rex_addon $this */ 17 | $maxFilesToUpload = (int) ini_get('max_file_uploads'); 18 | 19 | if (!empty(rex_post('module_upload'))) { 20 | $targetDir = rex_url::assets('addons/module_preview_modules/'); 21 | $module = rex_sql::factory(); 22 | $moduleIds = $module->getArray('select id from ' . rex::getTablePrefix() . 'module order by name'); 23 | $maxFileSize = (int) ini_get('upload_max_filesize'); 24 | $imageCount = 1; 25 | $error = false; 26 | 27 | foreach ($moduleIds as $moduleId) { 28 | $tmpImage = rex_files('module_' . $moduleId['id']); 29 | 30 | if (!$tmpImage || (!$tmpImage['tmp_name'] && 0 !== $tmpImage['error'])) { 31 | continue; 32 | } 33 | 34 | if ($imageCount > $maxFilesToUpload) { 35 | echo rex_view::error($this->i18n('module_preview_upload_max_file_uploads', $maxFilesToUpload)); 36 | $error = true; 37 | break; 38 | } 39 | 40 | if ($tmpImage['size'] > UploadedFile::getMaxFilesize()) { 41 | echo rex_view::error($this->i18n('module_preview_upload_max_filesize')); 42 | continue; 43 | } 44 | 45 | $module = rex_sql::factory(); 46 | $module = $module->getArray('select * from ' . rex::getTable('module') . ' WHERE id = :id LIMIT 1', ['id' => $moduleId['id']]); 47 | $fileName = $moduleId['id']; 48 | 49 | if (array_key_exists('key', $module[0]) && isset($module[0]['key'])) { 50 | $fileName = $module[0]['key']; 51 | } 52 | 53 | $uploadedImage = new UploadedFile($tmpImage['tmp_name'], $tmpImage['name'], $tmpImage['type'], $tmpImage['error']); 54 | $uploadedImage->move($targetDir, "{$fileName}.{$uploadedImage->getClientOriginalExtension()}"); 55 | ++$imageCount; 56 | } 57 | 58 | if (!$error) { 59 | echo rex_view::success($this->i18n('saved')); 60 | } 61 | } 62 | 63 | if (!empty(rex_post('delete_image'))) { 64 | ob_end_clean(); 65 | $image = rex_post('image'); 66 | if (rex_post('image') && file_exists($image)) { 67 | if (rex_file::delete($image)) { 68 | http_response_code(200); 69 | } 70 | } else { 71 | echo $this->i18n('module_preview_image_not_found'); 72 | http_response_code(404); 73 | } 74 | exit; 75 | } 76 | 77 | $maxFilesToUpload = (int) ini_get('max_file_uploads'); 78 | 79 | $content = '
'; 80 | 81 | $formElements = []; 82 | 83 | $module = rex_sql::factory(); 84 | $modules = $module->getArray('select * from ' . rex::getTablePrefix() . 'module order by name'); 85 | 86 | $content .= '
'; 87 | $content .= '

' . $this->i18n('module_preview_upload_max_file_uploads', $maxFilesToUpload) . '

'; 88 | $content .= '
'; 89 | foreach ($modules as $module) { 90 | $fragment = new rex_fragment(); 91 | $fragment->setVar('module', $module); 92 | $content .= $fragment->parse('module_preview/image-upload.php'); 93 | } 94 | $content .= ''; 95 | $content .= '
'; 96 | $content .= '
'; 97 | $content .= '
'; 98 | 99 | $fragment = new rex_fragment(); 100 | $fragment->setVar('class', 'edit'); 101 | $fragment->setVar('title', $this->i18n('settings')); 102 | $fragment->setVar('body', $content, false); 103 | $content = $fragment->parse('core/page/section.php'); 104 | 105 | echo $content; 106 | } 107 | ?> 108 | 109 | 114 | -------------------------------------------------------------------------------- /assets/js/script.js: -------------------------------------------------------------------------------- 1 | let $showModulePreview, slicePosition, slice, $modules, $modulePreview, $close, $modulesSearch, $body, $html, 2 | previewActive = false, moduleAdded = false; 3 | 4 | $(document).on('rex:ready', function () { 5 | $showModulePreview = $('button.show-module-preview'); 6 | $modulePreview = $('#module-preview'); 7 | $close = $modulePreview.find('.close'); 8 | $body = $('body'); 9 | $html = $('html'); 10 | 11 | hideModulePreview(); 12 | 13 | $showModulePreview.off('click'); 14 | $close.off('click'); 15 | 16 | $showModulePreview.on('click', function (event) { 17 | event.preventDefault(); 18 | slicePosition = $(this).parents('li').attr('id'); 19 | slice = $(this).data('slice'); 20 | 21 | if (previewActive) { 22 | hideModulePreview(); 23 | } else { 24 | showModulePreview(); 25 | } 26 | }); 27 | 28 | $modulePreview.on('click', function (event) { 29 | const $target = $(event.target); 30 | if ($target.hasClass('module-list') || $target.parent().hasClass('inner') || $target.attr('id') === 'module-preview') { 31 | event.preventDefault(); 32 | event.stopPropagation(); 33 | hideModulePreview(); 34 | } 35 | }); 36 | 37 | $close.on('click', function (event) { 38 | event.preventDefault(); 39 | hideModulePreview(); 40 | }); 41 | 42 | /** 43 | * contains case insensitive... 44 | * https://stackoverflow.com/a/8747204 45 | */ 46 | jQuery.expr[':'].icontains = function (a, i, m) { 47 | return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 48 | }; 49 | }); 50 | 51 | $(document).on('keyup', function (event) { 52 | if (event.key === 'Escape') hideModulePreview(); 53 | }); 54 | 55 | function showModulePreview() { 56 | $.ajax({ 57 | url: $showModulePreview.eq(0).data('url'), 58 | beforeSend: function () { 59 | } 60 | }) 61 | .done(function (html) { 62 | if (html) { 63 | $modulePreview.find('.inner').html(html); 64 | 65 | previewActive = true; 66 | $modulePreview.fadeIn(); 67 | $body.addClass('module-preview'); 68 | $body.css('height', 'auto'); 69 | $html.css('overflow', 'hidden'); 70 | $body.addClass('modal-open'); 71 | $modules = $modulePreview.find('a.module'); 72 | $modules.parent().show(); 73 | 74 | for (let i = 0; i < $modules.length; i++) { 75 | const href = $modules.eq(i).data('href'); 76 | $modules.eq(i).attr('href', href + '&slice_id=' + slice + '#' + slicePosition); 77 | } 78 | 79 | attachModuleEventHandler(); 80 | } 81 | }) 82 | .fail(function (jqXHR, textStatus, errorThrown) { 83 | console.error('script.js:89', ' ↴', '\n', jqXHR, textStatus, errorThrown); 84 | }); 85 | } 86 | 87 | function attachModuleEventHandler() { 88 | $modulesSearch = $modulePreview.find('#module-preview-search'); 89 | 90 | if ($modulesSearch.length) { 91 | $modulesSearch.focus(); 92 | } 93 | 94 | $modules.on('click', function () { 95 | const $this = $(this); 96 | moduleAdded = true; 97 | // eslint-disable-next-line no-undef 98 | const regex = new RegExp('\\bpage=' + rex.page + '(\\b[^/]|$)'); 99 | if (regex.test($this.attr('href'))) { 100 | // event.preventDefault(); 101 | hideModulePreview(); 102 | } 103 | }); 104 | 105 | $modulesSearch.on('keyup', function () { 106 | const value = $modulesSearch.val(); 107 | if (value) { 108 | $modules.parent().hide(); 109 | $modules.filter(':icontains(' + value + ')').parent().show(); 110 | } else { 111 | $modules.parent().show(); 112 | } 113 | }); 114 | 115 | /** 116 | * trap tabbable elements 117 | */ 118 | const $tabbableElements = $modulePreview.find('select, input, textarea, button, a'); 119 | const $firstTabbableElement = $tabbableElements.first(); 120 | const $lastTabbableElement = $tabbableElements.last(); 121 | 122 | $lastTabbableElement.on('keydown', function (e) { 123 | if ((e.which === 9 && !e.shiftKey) && previewActive) { 124 | e.preventDefault(); 125 | $firstTabbableElement.focus(); 126 | } 127 | }); 128 | 129 | $firstTabbableElement.on('keydown', function (e) { 130 | if ((e.which === 9 && e.shiftKey) && previewActive) { 131 | e.preventDefault(); 132 | $lastTabbableElement.focus(); 133 | } 134 | }); 135 | } 136 | 137 | function hideModulePreview() { 138 | $modulePreview.fadeOut(function () { 139 | previewActive = false; 140 | $body.removeClass('module-preview'); 141 | $body.css('height', '100%'); 142 | $html.css('overflow', 'initial'); 143 | $body.removeClass('modal-open'); 144 | $modulePreview.find('.inner').empty(); 145 | 146 | if (moduleAdded) { 147 | setTimeout(function () { 148 | if ($('#REX_FORM').length) { 149 | $('html,body').scrollTop($('#REX_FORM').offset().top); 150 | moduleAdded = false; 151 | } 152 | }, 10) 153 | } 154 | }); 155 | } 156 | -------------------------------------------------------------------------------- /assets/css/styles.css: -------------------------------------------------------------------------------- 1 | .module-container{max-width:1400px}.module-container .module-row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.module-container .module-row .module-col{flex:0 0 auto;width:25%;padding:0 15px;display:flex;flex-direction:column;justify-content:flex-end}@media (max-width:1200px){.module-container .module-row .module-col{width:33.3333333333%}}@media (max-width:600px){.module-container .module-row .module-col{width:50%}}@media (max-width:400px){.module-container .module-row .module-col{width:100%}}.module-container .module-row .module-col .module{margin-top:10px}.module-container label.file-label input[type="file"]{position:absolute;top:-1000%;left:-1000%;visibility:hidden}.module-container label.file-label:hover{background:#cccccc}.module-container label.file-label:active{background:#ccccff}.module-container .image{display:inline-block;width:100%;background-color:#5bb585;border:1px solid #5bb585;overflow:hidden;position:relative}.module-container .image::before{display:block;padding-top:56.25%;content:""}.module-container .image>div{top:0;left:0;width:100%;height:100%;position:absolute}.module-container .image img{object-fit:cover;width:100%;height:100%;position:absolute;top:0;left:0}.module-container .image img.n-a{opacity:0.75}.module-container .image .delete-image{position:absolute;top:5px;right:5px;border:0;margin:0;padding:10px;height:35px;width:35px;line-height:15px;background-color:#8b0000;color:#ffffff;z-index:5}.rex-slice-select .bloecks{opacity:0;z-index:5;position:relative}.rex-slice-select .btn-default{background-color:#dbedf7;border-color:#dbedf7;color:#4b9ad9;border-radius:0}.rex-slice-draggable.is--compact:hover .rex-slice-select>.bloecks{opacity:1;transform:translateY(-50%);transition:transform 300ms ease-out, opacity 300ms ease-out, max-height 0ms linear 0ms}#module-preview{display:none;position:fixed;width:100%;height:100%;max-height:100vh;left:0;top:0;overflow:auto;background-color:rgba(50, 64, 80, 0.9);padding:40px;z-index:1000005}@media (max-width:768px){#module-preview{padding:35px 0}}#module-preview .close{position:absolute;right:10px;top:10px;height:15px;width:20px;color:#ffffff;opacity:0.8}@media (max-width:768px){#module-preview .close{top:5px}}#module-preview label{display:block}#module-preview .form-group{padding:0 10px}@media (max-width:600px){#module-preview .form-group{padding:0}}#module-preview .container{width:100%;max-width:1600px}#module-preview .module-list{list-style:none;padding:0;display:flex;flex-wrap:wrap;margin-bottom:0}#module-preview .module-list .column{flex:0 0 auto;width:calc(25% - 20px);display:flex;flex-direction:column;justify-content:end;margin:10px}@media (max-width:1200px){#module-preview .module-list .column{width:calc(33.33333333333333% - 20px)}}@media (max-width:992px){#module-preview .module-list .column{width:calc(50% - 20px)}}@media (max-width:600px){#module-preview .module-list .column{width:100%;margin:0 0 5px}}#module-preview .module-list .column.large{width:calc(100% - 20px)}@media (max-width:600px){#module-preview .module-list .column.large{width:100%}}#module-preview .module-list .column.large .header{padding:15px 10px;background-color:#5bb585}#module-preview .module-list .module{display:flex;color:#ffffff;text-decoration:none;outline:none;flex-direction:column}#module-preview .module-list .module:hover .header,#module-preview .module-list .module:focus .header{background-color:#324050}#module-preview .module-list .module:hover .image,#module-preview .module-list .module:focus .image{border-color:#324050}#module-preview .module-list .module:focus{box-shadow:0 0 10px 5px #4b9ad9}#module-preview .module-list .header{background-color:#4b9ad9;padding:5px 10px;transition:background-color 0.3s ease-in-out}#module-preview .module-list .image{display:inline-block;width:100%;color:#6c757d;background-color:#f8f9fa;border:1px solid #4b9ad9;overflow:hidden;position:relative;transition:border 0.3s ease-in-out}#module-preview .module-list .image::before{display:block;padding-top:56.25%;content:""}#module-preview .module-list .image>div{top:0;left:0;width:100%;height:100%;position:absolute}#module-preview .module-list .image img{object-fit:cover;width:100%;height:100%}#module-preview .module-list .image .not-available{position:relative;height:100%;background-color:#d4d4d4}#module-preview .module-list .image .not-available::before{content:"";width:100%;height:100%;left:0;top:0;opacity:0.3;position:absolute;background-size:auto 50%;background-position:center;background-repeat:no-repeat;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23333333' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M11.354 4.646a.5.5 0 0 0-.708 0l-6 6a.5.5 0 0 0 .708.708l6-6a.5.5 0 0 0 0-.708z'/%3E%3C/svg%3E")}#module-preview .module-list.images-hidden .header{padding:10px 15px}body.rex-theme-dark .rex-slice-select .btn-default{background-color:#213c51;border-color:#213c51;color:rgba(255, 255, 255, 0.75)}body.rex-theme-dark .rex-slice-select .btn-default:hover{background-color:#1c4260;border-color:#1c4260}body.rex-theme-dark #module-preview{background-color:rgba(13, 18, 21, 0.9)}body.rex-theme-dark #module-preview .module-list .module{color:rgba(255, 255, 255, 0.75)}body.rex-theme-dark #module-preview .module-list .module:hover .header,body.rex-theme-dark #module-preview .module-list .module:focus .header{background-color:#1c4260}body.rex-theme-dark #module-preview .module-list .module:hover .image,body.rex-theme-dark #module-preview .module-list .module:focus .image{border-color:#1c4260}body.rex-theme-dark #module-preview .module-list .module:focus{box-shadow:0 0 10px 5px #213c51}body.rex-theme-dark #module-preview .module-list .header{background-color:#213c51}body.rex-theme-dark #module-preview .module-list .image{background-color:#213c51;border:1px solid #213c51}body.rex-theme-dark #module-preview .module-list .image .not-available{background-color:#242f3c}body.rex-theme-dark #module-preview .module-list .image .not-available::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23ffffff' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M11.354 4.646a.5.5 0 0 0-.708 0l-6 6a.5.5 0 0 0 .708.708l6-6a.5.5 0 0 0 0-.708z'/%3E%3C/svg%3E")}body.rex-theme-dark #module-preview .module-list .column.large{background-color:#203535}@media (prefers-color-scheme:dark){body.rex-has-theme:not(.rex-theme-light) .rex-slice-select .btn-default{background-color:#213c51;border-color:#213c51;color:rgba(255, 255, 255, 0.75)}body.rex-has-theme:not(.rex-theme-light) .rex-slice-select .btn-default:hover{background-color:#1c4260;border-color:#1c4260}body.rex-has-theme:not(.rex-theme-light) #module-preview{background-color:rgba(13, 18, 21, 0.9)}body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .module{color:rgba(255, 255, 255, 0.75)}body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .module:hover .header,body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .module:focus .header{background-color:#1c4260}body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .module:hover .image,body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .module:focus .image{border-color:#1c4260}body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .module:focus{box-shadow:0 0 10px 5px #213c51}body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .header{background-color:#213c51}body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .image{background-color:#213c51;border:1px solid #213c51}body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .image .not-available{background-color:#242f3c}body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .image .not-available::before{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23ffffff' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M11.354 4.646a.5.5 0 0 0-.708 0l-6 6a.5.5 0 0 0 .708.708l6-6a.5.5 0 0 0 0-.708z'/%3E%3C/svg%3E")}body.rex-has-theme:not(.rex-theme-light) #module-preview .module-list .column.large{background-color:#203535}} 2 | -------------------------------------------------------------------------------- /scss/styles.scss: -------------------------------------------------------------------------------- 1 | @import "modules"; 2 | 3 | .rex-slice-select { 4 | .bloecks { 5 | opacity: 0; 6 | z-index: 5; 7 | position: relative; 8 | } 9 | 10 | .btn-default { 11 | background-color: #dbedf7; 12 | border-color: #dbedf7; 13 | color: #4b9ad9; 14 | border-radius: 0; 15 | } 16 | } 17 | 18 | .rex-slice-draggable.is--compact:hover .rex-slice-select > .bloecks { 19 | opacity: 1; 20 | transform: translateY(-50%); 21 | transition: transform 300ms ease-out, opacity 300ms ease-out, max-height 0ms linear 0ms; 22 | } 23 | 24 | #module-preview { 25 | display: none; 26 | position: fixed; 27 | width: 100%; 28 | height: 100%; 29 | max-height: 100vh; 30 | left: 0; 31 | top: 0; 32 | overflow: auto; 33 | background-color: rgba(#324050, 0.9); 34 | padding: 40px; 35 | z-index: 1000005; 36 | 37 | @media (max-width: 768px) { 38 | padding: 35px 0; 39 | } 40 | 41 | .close { 42 | position: absolute; 43 | right: 10px; 44 | top: 10px; 45 | height: 15px; 46 | width: 20px; 47 | color: #ffffff; 48 | opacity: 0.8; 49 | 50 | @media (max-width: 768px) { 51 | top: 5px; 52 | } 53 | } 54 | 55 | label { 56 | display: block; 57 | } 58 | 59 | .form-group { 60 | padding: 0 10px; 61 | 62 | @media (max-width: 600px) { 63 | padding: 0; 64 | } 65 | } 66 | 67 | .container { 68 | width: 100%; 69 | max-width: 1600px; 70 | } 71 | 72 | .module-list { 73 | list-style: none; 74 | padding: 0; 75 | display: flex; 76 | flex-wrap: wrap; 77 | margin-bottom: 0; 78 | 79 | .column { 80 | flex: 0 0 auto; 81 | width: calc(25% - 20px); 82 | display: flex; 83 | flex-direction: column; 84 | justify-content: end; 85 | margin: 10px; 86 | 87 | @media (max-width: 1200px) { 88 | width: calc(33.33333333333333% - 20px); 89 | } 90 | 91 | @media (max-width: 992px) { 92 | width: calc(50% - 20px); 93 | } 94 | 95 | @media (max-width: 600px) { 96 | width: 100%; 97 | margin: 0 0 5px; 98 | } 99 | 100 | &.large { 101 | width: calc(100% - 20px); 102 | 103 | @media (max-width: 600px) { 104 | width: 100%; 105 | } 106 | 107 | .header { 108 | padding: 15px 10px; 109 | background-color: #5bb585; 110 | } 111 | } 112 | } 113 | 114 | .module { 115 | display: flex; 116 | color: #ffffff; 117 | text-decoration: none; 118 | outline: none; 119 | flex-direction: column; 120 | 121 | &:hover, 122 | &:focus { 123 | .header { 124 | background-color: #324050; 125 | } 126 | 127 | .image { 128 | border-color: #324050; 129 | } 130 | } 131 | 132 | &:focus { 133 | box-shadow: 0 0 10px 5px #4b9ad9; 134 | } 135 | } 136 | 137 | .header { 138 | background-color: #4b9ad9; 139 | padding: 5px 10px; 140 | transition: background-color 0.3s ease-in-out; 141 | } 142 | 143 | .image { 144 | display: inline-block; 145 | width: 100%; 146 | color: #6c757d; 147 | background-color: #f8f9fa; 148 | border: 1px solid #4b9ad9; 149 | overflow: hidden; 150 | position: relative; 151 | transition: border 0.3s ease-in-out; 152 | 153 | &::before { 154 | display: block; 155 | padding-top: 56.25%; 156 | content: ""; 157 | } 158 | 159 | > div { 160 | top: 0; 161 | left: 0; 162 | width: 100%; 163 | height: 100%; 164 | position: absolute; 165 | } 166 | 167 | img { 168 | object-fit: cover; 169 | width: 100%; 170 | height: 100%; 171 | } 172 | 173 | .not-available { 174 | position: relative; 175 | height: 100%; 176 | background-color: #d4d4d4; 177 | 178 | &::before { 179 | content: ""; 180 | width: 100%; 181 | height: 100%; 182 | left: 0; 183 | top: 0; 184 | opacity: 0.3; 185 | position: absolute; 186 | background-size: auto 50%; 187 | background-position: center; 188 | background-repeat: no-repeat; 189 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23333333' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M11.354 4.646a.5.5 0 0 0-.708 0l-6 6a.5.5 0 0 0 .708.708l6-6a.5.5 0 0 0 0-.708z'/%3E%3C/svg%3E"); 190 | } 191 | } 192 | } 193 | 194 | &.images-hidden { 195 | .header { 196 | padding: 10px 15px; 197 | } 198 | } 199 | } 200 | } 201 | 202 | body.rex-theme-dark { 203 | .rex-slice-select { 204 | .btn-default { 205 | background-color: #213c51; 206 | border-color: #213c51; 207 | color: rgba(255, 255, 255, 0.75); 208 | 209 | &:hover { 210 | background-color: #1c4260; 211 | border-color: #1c4260; 212 | } 213 | } 214 | } 215 | 216 | #module-preview { 217 | background-color: rgba(#0d1215, 0.9); 218 | 219 | .module-list { 220 | .module { 221 | color: rgba(255, 255, 255, 0.75); 222 | 223 | &:hover, 224 | &:focus { 225 | .header { 226 | background-color: #1c4260; 227 | } 228 | 229 | .image { 230 | border-color: #1c4260; 231 | } 232 | } 233 | 234 | &:focus { 235 | box-shadow: 0 0 10px 5px #213c51; 236 | } 237 | } 238 | 239 | .header { 240 | background-color: #213c51; 241 | } 242 | 243 | .image { 244 | background-color: #213c51; 245 | border: 1px solid #213c51; 246 | 247 | .not-available { 248 | background-color: #242f3c; 249 | 250 | &::before { 251 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23ffffff' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M11.354 4.646a.5.5 0 0 0-.708 0l-6 6a.5.5 0 0 0 .708.708l6-6a.5.5 0 0 0 0-.708z'/%3E%3C/svg%3E"); 252 | } 253 | } 254 | } 255 | 256 | .column { 257 | &.large { 258 | background-color: #203535; 259 | } 260 | } 261 | } 262 | } 263 | } 264 | 265 | @media (prefers-color-scheme: dark) { 266 | body.rex-has-theme:not(.rex-theme-light) { 267 | .rex-slice-select { 268 | .btn-default { 269 | background-color: #213c51; 270 | border-color: #213c51; 271 | color: rgba(255, 255, 255, 0.75); 272 | 273 | &:hover { 274 | background-color: #1c4260; 275 | border-color: #1c4260; 276 | } 277 | } 278 | } 279 | 280 | #module-preview { 281 | background-color: rgba(#0d1215, 0.9); 282 | 283 | .module-list { 284 | .module { 285 | color: rgba(255, 255, 255, 0.75); 286 | 287 | &:hover, 288 | &:focus { 289 | .header { 290 | background-color: #1c4260; 291 | } 292 | 293 | .image { 294 | border-color: #1c4260; 295 | } 296 | } 297 | 298 | &:focus { 299 | box-shadow: 0 0 10px 5px #213c51; 300 | } 301 | } 302 | 303 | .header { 304 | background-color: #213c51; 305 | } 306 | 307 | .image { 308 | background-color: #213c51; 309 | border: 1px solid #213c51; 310 | 311 | .not-available { 312 | background-color: #242f3c; 313 | 314 | &::before { 315 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23ffffff' viewBox='0 0 16 16'%3E%3Cpath d='M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z'/%3E%3Cpath d='M11.354 4.646a.5.5 0 0 0-.708 0l-6 6a.5.5 0 0 0 .708.708l6-6a.5.5 0 0 0 0-.708z'/%3E%3C/svg%3E"); 316 | } 317 | } 318 | } 319 | 320 | .column { 321 | &.large { 322 | background-color: #203535; 323 | } 324 | } 325 | } 326 | } 327 | } 328 | } 329 | -------------------------------------------------------------------------------- /lib/module_preview.php: -------------------------------------------------------------------------------- 1 | setQuery(' 22 | SELECT article.*, template.attributes as template_attributes 23 | FROM ' . rex::getTablePrefix() . 'article as article 24 | LEFT JOIN ' . rex::getTablePrefix() . 'template as template ON template.id = article.template_id 25 | WHERE article.id = ? AND clang_id = ?', [ 26 | $articleId, 27 | $clang, 28 | ]); 29 | 30 | $this->template_attributes = $article->getArrayValue('template_attributes'); 31 | 32 | $context = new rex_context([ 33 | 'page' => rex_be_controller::getCurrentPage(), 34 | 'article_id' => $articleId, 35 | 'clang' => $clang, 36 | 'ctype' => $ctype, 37 | 'category_id' => $categoryId, 38 | 'function' => 'add', 39 | ]); 40 | 41 | $module = rex_sql::factory(); 42 | $modules = $module->getArray('select * from ' . rex::getTablePrefix() . 'module order by name'); 43 | 44 | $templateCtypes = $this->template_attributes['ctype'] ?? []; 45 | if (0 == count($templateCtypes)) { 46 | $templateCtypes = [1 => 'default']; 47 | } 48 | 49 | $additionalModuleListClass = $hideImages ? 'images-hidden' : ''; 50 | $moduleList = '
'; 51 | $moduleList .= ''; 93 | $moduleList .= '
'; 94 | 95 | return $moduleList; 96 | } 97 | 98 | public function getSearch(): string 99 | { 100 | $addon = rex_addon::get('module_preview'); 101 | 102 | return << 104 |
105 | 108 |
109 | 110 | HTML; 111 | } 112 | 113 | public static function hasClipboardContents(): bool 114 | { 115 | $cookie = self::getClipboardContents(); 116 | 117 | if ($cookie) { 118 | return true; 119 | } 120 | 121 | return false; 122 | } 123 | 124 | public static function getClipboardContents() 125 | { 126 | return @json_decode(rex_request::cookie('rex_bloecks_cutncopy', 'string', ''), true); 127 | } 128 | 129 | /** 130 | * Get the preview image for a module and, if set, the key of the module as a `span` HTML snippet. 131 | * 132 | * @return array{image: ?string, moduleKey: ?string} 133 | */ 134 | public static function getModulePreviewImage(array $module): array 135 | { 136 | // If the module has a key set, use the key to identify the image. Else use the ID of the module 137 | if (empty($module['key'] ?? null)) { 138 | $key = null; 139 | $imageName = $module['id']; 140 | } else { 141 | $key = ' [' . $module['key'] . ']'; 142 | $imageName = $module['key']; 143 | } 144 | 145 | // Search the preview directory for valid images 146 | $globPattern = rex_url::assets('addons/module_preview_modules/') . "{$imageName}.*"; 147 | $foundImages = glob($globPattern); 148 | $validImages = false !== $foundImages ? preg_grep('/^.*(jpe?g|png)/', $foundImages) : []; 149 | 150 | return [ 151 | 'image' => (empty($validImages)) ? null : reset($validImages), 152 | 'moduleKey' => $key, 153 | ]; 154 | } 155 | 156 | private function getSliceDetails($sliceId, $clangId) 157 | { 158 | if ($sliceId && $clangId) { 159 | $sql = rex_sql::factory(); 160 | $sql->setQuery('select ' . rex::getTablePrefix() . 'article_slice.article_id, ' . rex::getTablePrefix() . 'article_slice.module_id, ' . rex::getTablePrefix() . 'module.name from ' . rex::getTablePrefix() . 'article_slice left join ' . rex::getTablePrefix() . 'module on ' . rex::getTablePrefix() . 'article_slice.module_id=' . rex::getTablePrefix() . 'module.id where ' . rex::getTablePrefix() . 'article_slice.id=? and ' . rex::getTablePrefix() . 'article_slice.clang_id=?', [$sliceId, $clangId]); 161 | return $sql->getArray()[0]; 162 | } 163 | } 164 | 165 | /** 166 | * Create a list item HTML snippet for module selection. 167 | * 168 | * @param rex_context $context Current context 169 | * @param array $moduleData Module data 170 | * @param int $ctype Current content type 171 | * @param bool $hideImages Shall images be hidden 172 | * @param bool $loadImagesFromTheme Are images loaded from theme 173 | */ 174 | private function moduleListItem(rex_context $context, array $moduleData, int $ctype, bool $hideImages, bool $loadImagesFromTheme): string 175 | { 176 | $moduleUrl = $context->getUrl(['module_id' => $moduleData['id'], 'ctype' => $ctype]); 177 | $moduleName = rex_i18n::translate($moduleData['name'], false); 178 | $imagePreview = (true !== $hideImages) ? $this->previewImageContainer($loadImagesFromTheme, $moduleData) : ''; 179 | 180 | $slug = rex_string::normalize(rex_i18n::translate($moduleData['name'], false), '-'); 181 | $this->modules[] = [ 182 | 'name' => rex_i18n::translate($moduleData['name'], false), 183 | 'slug' => $slug, 184 | 'id' => $moduleData['id'], 185 | 'key' => $moduleData['key'], 186 | 'imagePath' => rex_addon::get('module_preview')->getAssetsPath($slug . '.jpg'), 187 | ]; 188 | 189 | return << 191 | 192 |
{$moduleName}
193 | {$imagePreview} 194 |
195 | 196 | HTML; 197 | } 198 | 199 | /** 200 | * Create and return the markup for a DIV element containing the preview image as base64 encoded data string. 201 | */ 202 | private function previewImageContainer(bool $loadImagesFromTheme, array $moduleData): string 203 | { 204 | if ($loadImagesFromTheme && rex_addon::exists('theme') && rex_addon::get('theme')->isAvailable()) { 205 | $suffix = ''; 206 | if (rex_config::get('developer', 'dir_suffix')) { 207 | $suffix = ' [' . $moduleData['id'] . ']'; 208 | } 209 | $image = theme_path::base('/private/redaxo/modules/' . $moduleData['name'] . $suffix . '/module_preview.jpg'); 210 | } else { 211 | ['image' => $image] = static::getModulePreviewImage($moduleData); 212 | } 213 | $preview = $this->imageFileToTag($image, $loadImagesFromTheme, rex_i18n::translate($moduleData['name'], false)); 214 | 215 | return << 217 |
218 | {$preview} 219 |
220 | 221 | HTML; 222 | } 223 | 224 | /** 225 | * Convert $imageFile to an IMG tag. If $loadImagesFromTheme is true, the src is set to the base64 encoded image 226 | * data string. 227 | * Returns a _not-available_ placeholder DIV tag if $imageFile does not exist. 228 | * 229 | * @param string $imageFile absolute image file to convert 230 | * @param bool $loadImagesFromTheme Are images loaded from theme? 231 | * @param string $moduleLabel Localized label of the module the image is the preview for 232 | */ 233 | private function imageFileToTag(?string $imageFile, bool $loadImagesFromTheme, string $moduleLabel): string 234 | { 235 | if (null === $imageFile || !file_exists($imageFile)) { 236 | return '
'; 237 | } 238 | $image = $imageFile; 239 | if ($loadImagesFromTheme) { 240 | $data = file_get_contents($imageFile); 241 | $image = 'data:image/jpg;base64,' . base64_encode($data); 242 | } 243 | 244 | return "\"{$moduleLabel}\""; 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | end_of_line = lf 4 | indent_size = 4 5 | indent_style = space 6 | insert_final_newline = true 7 | max_line_length = 120 8 | tab_width = 4 9 | ij_continuation_indent_size = 8 10 | ij_formatter_off_tag = @formatter:off 11 | ij_formatter_on_tag = @formatter:on 12 | ij_formatter_tags_enabled = false 13 | ij_smart_tabs = false 14 | ij_visual_guides = none 15 | ij_wrap_on_typing = false 16 | 17 | [*.blade.php] 18 | ij_blade_keep_indents_on_empty_lines = false 19 | 20 | [*.css] 21 | ij_css_align_closing_brace_with_properties = false 22 | ij_css_blank_lines_around_nested_selector = 1 23 | ij_css_blank_lines_between_blocks = 1 24 | ij_css_block_comment_add_space = false 25 | ij_css_brace_placement = end_of_line 26 | ij_css_enforce_quotes_on_format = true 27 | ij_css_hex_color_long_format = true 28 | ij_css_hex_color_lower_case = true 29 | ij_css_hex_color_short_format = false 30 | ij_css_hex_color_upper_case = false 31 | ij_css_keep_blank_lines_in_code = 2 32 | ij_css_keep_indents_on_empty_lines = false 33 | ij_css_keep_single_line_blocks = false 34 | ij_css_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow 35 | ij_css_space_after_colon = true 36 | ij_css_space_before_opening_brace = true 37 | ij_css_use_double_quotes = true 38 | ij_css_value_alignment = do_not_align 39 | 40 | [*.feature] 41 | indent_size = 2 42 | ij_gherkin_keep_indents_on_empty_lines = false 43 | 44 | [*.haml] 45 | indent_size = 2 46 | ij_haml_keep_indents_on_empty_lines = false 47 | 48 | [*.less] 49 | indent_size = 2 50 | ij_less_align_closing_brace_with_properties = false 51 | ij_less_blank_lines_around_nested_selector = 1 52 | ij_less_blank_lines_between_blocks = 1 53 | ij_less_block_comment_add_space = false 54 | ij_less_brace_placement = 0 55 | ij_less_enforce_quotes_on_format = false 56 | ij_less_hex_color_long_format = false 57 | ij_less_hex_color_lower_case = false 58 | ij_less_hex_color_short_format = false 59 | ij_less_hex_color_upper_case = false 60 | ij_less_keep_blank_lines_in_code = 2 61 | ij_less_keep_indents_on_empty_lines = false 62 | ij_less_keep_single_line_blocks = false 63 | ij_less_line_comment_add_space = false 64 | ij_less_line_comment_at_first_column = false 65 | ij_less_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow 66 | ij_less_space_after_colon = true 67 | ij_less_space_before_opening_brace = true 68 | ij_less_use_double_quotes = true 69 | ij_less_value_alignment = 0 70 | 71 | [*.sass] 72 | indent_size = 2 73 | ij_sass_align_closing_brace_with_properties = false 74 | ij_sass_blank_lines_around_nested_selector = 1 75 | ij_sass_blank_lines_between_blocks = 1 76 | ij_sass_brace_placement = 0 77 | ij_sass_enforce_quotes_on_format = false 78 | ij_sass_hex_color_long_format = false 79 | ij_sass_hex_color_lower_case = false 80 | ij_sass_hex_color_short_format = false 81 | ij_sass_hex_color_upper_case = false 82 | ij_sass_keep_blank_lines_in_code = 2 83 | ij_sass_keep_indents_on_empty_lines = false 84 | ij_sass_keep_single_line_blocks = false 85 | ij_sass_line_comment_add_space = false 86 | ij_sass_line_comment_at_first_column = false 87 | ij_sass_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow 88 | ij_sass_space_after_colon = true 89 | ij_sass_space_before_opening_brace = true 90 | ij_sass_use_double_quotes = true 91 | ij_sass_value_alignment = 0 92 | 93 | [*.scss] 94 | indent_size = 2 95 | ij_scss_align_closing_brace_with_properties = false 96 | ij_scss_blank_lines_around_nested_selector = 1 97 | ij_scss_blank_lines_between_blocks = 1 98 | ij_scss_block_comment_add_space = false 99 | ij_scss_brace_placement = 0 100 | ij_scss_enforce_quotes_on_format = true 101 | ij_scss_hex_color_long_format = true 102 | ij_scss_hex_color_lower_case = true 103 | ij_scss_hex_color_short_format = false 104 | ij_scss_hex_color_upper_case = false 105 | ij_scss_keep_blank_lines_in_code = 2 106 | ij_scss_keep_indents_on_empty_lines = false 107 | ij_scss_keep_single_line_blocks = false 108 | ij_scss_line_comment_add_space = false 109 | ij_scss_line_comment_at_first_column = false 110 | ij_scss_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow 111 | ij_scss_space_after_colon = true 112 | ij_scss_space_before_opening_brace = true 113 | ij_scss_use_double_quotes = true 114 | ij_scss_value_alignment = 0 115 | 116 | [*.twig] 117 | ij_twig_keep_indents_on_empty_lines = false 118 | ij_twig_spaces_inside_comments_delimiters = true 119 | ij_twig_spaces_inside_delimiters = true 120 | ij_twig_spaces_inside_variable_delimiters = true 121 | 122 | [*.vue] 123 | indent_size = 2 124 | tab_width = 2 125 | ij_continuation_indent_size = 4 126 | ij_vue_indent_children_of_top_level = template 127 | ij_vue_interpolation_new_line_after_start_delimiter = true 128 | ij_vue_interpolation_new_line_before_end_delimiter = true 129 | ij_vue_interpolation_wrap = off 130 | ij_vue_keep_indents_on_empty_lines = false 131 | ij_vue_spaces_within_interpolation_expressions = true 132 | 133 | [{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul,phpunit.xml.dist}] 134 | ij_xml_align_attributes = true 135 | ij_xml_align_text = false 136 | ij_xml_attribute_wrap = normal 137 | ij_xml_block_comment_add_space = false 138 | ij_xml_block_comment_at_first_column = true 139 | ij_xml_keep_blank_lines = 2 140 | ij_xml_keep_indents_on_empty_lines = false 141 | ij_xml_keep_line_breaks = true 142 | ij_xml_keep_line_breaks_in_text = true 143 | ij_xml_keep_whitespaces = false 144 | ij_xml_keep_whitespaces_around_cdata = preserve 145 | ij_xml_keep_whitespaces_inside_cdata = false 146 | ij_xml_line_comment_at_first_column = true 147 | ij_xml_space_after_tag_name = false 148 | ij_xml_space_around_equals_in_attribute = false 149 | ij_xml_space_inside_empty_tag = false 150 | ij_xml_text_wrap = normal 151 | 152 | [{*.ats,*.cts,*.mts,*.ts}] 153 | ij_continuation_indent_size = 4 154 | ij_typescript_align_imports = false 155 | ij_typescript_align_multiline_array_initializer_expression = false 156 | ij_typescript_align_multiline_binary_operation = false 157 | ij_typescript_align_multiline_chained_methods = false 158 | ij_typescript_align_multiline_extends_list = false 159 | ij_typescript_align_multiline_for = true 160 | ij_typescript_align_multiline_parameters = true 161 | ij_typescript_align_multiline_parameters_in_calls = false 162 | ij_typescript_align_multiline_ternary_operation = false 163 | ij_typescript_align_object_properties = 0 164 | ij_typescript_align_union_types = false 165 | ij_typescript_align_var_statements = 0 166 | ij_typescript_array_initializer_new_line_after_left_brace = false 167 | ij_typescript_array_initializer_right_brace_on_new_line = false 168 | ij_typescript_array_initializer_wrap = off 169 | ij_typescript_assignment_wrap = off 170 | ij_typescript_binary_operation_sign_on_next_line = false 171 | ij_typescript_binary_operation_wrap = off 172 | ij_typescript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/** 173 | ij_typescript_blank_lines_after_imports = 1 174 | ij_typescript_blank_lines_around_class = 1 175 | ij_typescript_blank_lines_around_field = 0 176 | ij_typescript_blank_lines_around_field_in_interface = 0 177 | ij_typescript_blank_lines_around_function = 1 178 | ij_typescript_blank_lines_around_method = 1 179 | ij_typescript_blank_lines_around_method_in_interface = 1 180 | ij_typescript_block_brace_style = end_of_line 181 | ij_typescript_block_comment_add_space = false 182 | ij_typescript_block_comment_at_first_column = true 183 | ij_typescript_call_parameters_new_line_after_left_paren = false 184 | ij_typescript_call_parameters_right_paren_on_new_line = false 185 | ij_typescript_call_parameters_wrap = off 186 | ij_typescript_catch_on_new_line = false 187 | ij_typescript_chained_call_dot_on_new_line = true 188 | ij_typescript_class_brace_style = end_of_line 189 | ij_typescript_comma_on_new_line = false 190 | ij_typescript_do_while_brace_force = never 191 | ij_typescript_else_on_new_line = false 192 | ij_typescript_enforce_trailing_comma = keep 193 | ij_typescript_enum_constants_wrap = on_every_item 194 | ij_typescript_extends_keyword_wrap = off 195 | ij_typescript_extends_list_wrap = off 196 | ij_typescript_field_prefix = _ 197 | ij_typescript_file_name_style = relaxed 198 | ij_typescript_finally_on_new_line = false 199 | ij_typescript_for_brace_force = never 200 | ij_typescript_for_statement_new_line_after_left_paren = false 201 | ij_typescript_for_statement_right_paren_on_new_line = false 202 | ij_typescript_for_statement_wrap = off 203 | ij_typescript_force_quote_style = false 204 | ij_typescript_force_semicolon_style = false 205 | ij_typescript_function_expression_brace_style = end_of_line 206 | ij_typescript_if_brace_force = never 207 | ij_typescript_import_merge_members = global 208 | ij_typescript_import_prefer_absolute_path = global 209 | ij_typescript_import_sort_members = true 210 | ij_typescript_import_sort_module_name = false 211 | ij_typescript_import_use_node_resolution = true 212 | ij_typescript_imports_wrap = on_every_item 213 | ij_typescript_indent_case_from_switch = true 214 | ij_typescript_indent_chained_calls = true 215 | ij_typescript_indent_package_children = 0 216 | ij_typescript_jsdoc_include_types = false 217 | ij_typescript_jsx_attribute_value = braces 218 | ij_typescript_keep_blank_lines_in_code = 2 219 | ij_typescript_keep_first_column_comment = true 220 | ij_typescript_keep_indents_on_empty_lines = false 221 | ij_typescript_keep_line_breaks = true 222 | ij_typescript_keep_simple_blocks_in_one_line = false 223 | ij_typescript_keep_simple_methods_in_one_line = false 224 | ij_typescript_line_comment_add_space = true 225 | ij_typescript_line_comment_at_first_column = false 226 | ij_typescript_method_brace_style = end_of_line 227 | ij_typescript_method_call_chain_wrap = off 228 | ij_typescript_method_parameters_new_line_after_left_paren = false 229 | ij_typescript_method_parameters_right_paren_on_new_line = false 230 | ij_typescript_method_parameters_wrap = off 231 | ij_typescript_object_literal_wrap = on_every_item 232 | ij_typescript_parentheses_expression_new_line_after_left_paren = false 233 | ij_typescript_parentheses_expression_right_paren_on_new_line = false 234 | ij_typescript_place_assignment_sign_on_next_line = false 235 | ij_typescript_prefer_as_type_cast = false 236 | ij_typescript_prefer_explicit_types_function_expression_returns = false 237 | ij_typescript_prefer_explicit_types_function_returns = false 238 | ij_typescript_prefer_explicit_types_vars_fields = false 239 | ij_typescript_prefer_parameters_wrap = false 240 | ij_typescript_reformat_c_style_comments = false 241 | ij_typescript_space_after_colon = true 242 | ij_typescript_space_after_comma = true 243 | ij_typescript_space_after_dots_in_rest_parameter = false 244 | ij_typescript_space_after_generator_mult = true 245 | ij_typescript_space_after_property_colon = true 246 | ij_typescript_space_after_quest = true 247 | ij_typescript_space_after_type_colon = true 248 | ij_typescript_space_after_unary_not = false 249 | ij_typescript_space_before_async_arrow_lparen = true 250 | ij_typescript_space_before_catch_keyword = true 251 | ij_typescript_space_before_catch_left_brace = true 252 | ij_typescript_space_before_catch_parentheses = true 253 | ij_typescript_space_before_class_lbrace = true 254 | ij_typescript_space_before_class_left_brace = true 255 | ij_typescript_space_before_colon = true 256 | ij_typescript_space_before_comma = false 257 | ij_typescript_space_before_do_left_brace = true 258 | ij_typescript_space_before_else_keyword = true 259 | ij_typescript_space_before_else_left_brace = true 260 | ij_typescript_space_before_finally_keyword = true 261 | ij_typescript_space_before_finally_left_brace = true 262 | ij_typescript_space_before_for_left_brace = true 263 | ij_typescript_space_before_for_parentheses = true 264 | ij_typescript_space_before_for_semicolon = false 265 | ij_typescript_space_before_function_left_parenth = true 266 | ij_typescript_space_before_generator_mult = false 267 | ij_typescript_space_before_if_left_brace = true 268 | ij_typescript_space_before_if_parentheses = true 269 | ij_typescript_space_before_method_call_parentheses = false 270 | ij_typescript_space_before_method_left_brace = true 271 | ij_typescript_space_before_method_parentheses = false 272 | ij_typescript_space_before_property_colon = false 273 | ij_typescript_space_before_quest = true 274 | ij_typescript_space_before_switch_left_brace = true 275 | ij_typescript_space_before_switch_parentheses = true 276 | ij_typescript_space_before_try_left_brace = true 277 | ij_typescript_space_before_type_colon = false 278 | ij_typescript_space_before_unary_not = false 279 | ij_typescript_space_before_while_keyword = true 280 | ij_typescript_space_before_while_left_brace = true 281 | ij_typescript_space_before_while_parentheses = true 282 | ij_typescript_spaces_around_additive_operators = true 283 | ij_typescript_spaces_around_arrow_function_operator = true 284 | ij_typescript_spaces_around_assignment_operators = true 285 | ij_typescript_spaces_around_bitwise_operators = true 286 | ij_typescript_spaces_around_equality_operators = true 287 | ij_typescript_spaces_around_logical_operators = true 288 | ij_typescript_spaces_around_multiplicative_operators = true 289 | ij_typescript_spaces_around_relational_operators = true 290 | ij_typescript_spaces_around_shift_operators = true 291 | ij_typescript_spaces_around_unary_operator = false 292 | ij_typescript_spaces_within_array_initializer_brackets = false 293 | ij_typescript_spaces_within_brackets = false 294 | ij_typescript_spaces_within_catch_parentheses = false 295 | ij_typescript_spaces_within_for_parentheses = false 296 | ij_typescript_spaces_within_if_parentheses = false 297 | ij_typescript_spaces_within_imports = false 298 | ij_typescript_spaces_within_interpolation_expressions = false 299 | ij_typescript_spaces_within_method_call_parentheses = false 300 | ij_typescript_spaces_within_method_parentheses = false 301 | ij_typescript_spaces_within_object_literal_braces = false 302 | ij_typescript_spaces_within_object_type_braces = true 303 | ij_typescript_spaces_within_parentheses = false 304 | ij_typescript_spaces_within_switch_parentheses = false 305 | ij_typescript_spaces_within_type_assertion = false 306 | ij_typescript_spaces_within_union_types = true 307 | ij_typescript_spaces_within_while_parentheses = false 308 | ij_typescript_special_else_if_treatment = true 309 | ij_typescript_ternary_operation_signs_on_next_line = false 310 | ij_typescript_ternary_operation_wrap = off 311 | ij_typescript_union_types_wrap = on_every_item 312 | ij_typescript_use_chained_calls_group_indents = false 313 | ij_typescript_use_double_quotes = true 314 | ij_typescript_use_explicit_js_extension = auto 315 | ij_typescript_use_path_mapping = always 316 | ij_typescript_use_public_modifier = false 317 | ij_typescript_use_semicolon_after_statement = true 318 | ij_typescript_var_declaration_wrap = normal 319 | ij_typescript_while_brace_force = never 320 | ij_typescript_while_on_new_line = false 321 | ij_typescript_wrap_comments = false 322 | 323 | [{*.cjs,*.js,Form}] 324 | ij_continuation_indent_size = 4 325 | ij_javascript_align_imports = false 326 | ij_javascript_align_multiline_array_initializer_expression = false 327 | ij_javascript_align_multiline_binary_operation = false 328 | ij_javascript_align_multiline_chained_methods = false 329 | ij_javascript_align_multiline_extends_list = false 330 | ij_javascript_align_multiline_for = true 331 | ij_javascript_align_multiline_parameters = true 332 | ij_javascript_align_multiline_parameters_in_calls = false 333 | ij_javascript_align_multiline_ternary_operation = false 334 | ij_javascript_align_object_properties = 0 335 | ij_javascript_align_union_types = false 336 | ij_javascript_align_var_statements = 0 337 | ij_javascript_array_initializer_new_line_after_left_brace = false 338 | ij_javascript_array_initializer_right_brace_on_new_line = false 339 | ij_javascript_array_initializer_wrap = off 340 | ij_javascript_assignment_wrap = off 341 | ij_javascript_binary_operation_sign_on_next_line = false 342 | ij_javascript_binary_operation_wrap = off 343 | ij_javascript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/** 344 | ij_javascript_blank_lines_after_imports = 1 345 | ij_javascript_blank_lines_around_class = 1 346 | ij_javascript_blank_lines_around_field = 0 347 | ij_javascript_blank_lines_around_function = 1 348 | ij_javascript_blank_lines_around_method = 1 349 | ij_javascript_block_brace_style = end_of_line 350 | ij_javascript_block_comment_add_space = false 351 | ij_javascript_block_comment_at_first_column = true 352 | ij_javascript_call_parameters_new_line_after_left_paren = false 353 | ij_javascript_call_parameters_right_paren_on_new_line = false 354 | ij_javascript_call_parameters_wrap = off 355 | ij_javascript_catch_on_new_line = false 356 | ij_javascript_chained_call_dot_on_new_line = true 357 | ij_javascript_class_brace_style = end_of_line 358 | ij_javascript_comma_on_new_line = false 359 | ij_javascript_do_while_brace_force = never 360 | ij_javascript_else_on_new_line = false 361 | ij_javascript_enforce_trailing_comma = keep 362 | ij_javascript_extends_keyword_wrap = off 363 | ij_javascript_extends_list_wrap = off 364 | ij_javascript_field_prefix = _ 365 | ij_javascript_file_name_style = relaxed 366 | ij_javascript_finally_on_new_line = false 367 | ij_javascript_for_brace_force = never 368 | ij_javascript_for_statement_new_line_after_left_paren = false 369 | ij_javascript_for_statement_right_paren_on_new_line = false 370 | ij_javascript_for_statement_wrap = off 371 | ij_javascript_force_quote_style = false 372 | ij_javascript_force_semicolon_style = false 373 | ij_javascript_function_expression_brace_style = end_of_line 374 | ij_javascript_if_brace_force = never 375 | ij_javascript_import_merge_members = global 376 | ij_javascript_import_prefer_absolute_path = global 377 | ij_javascript_import_sort_members = true 378 | ij_javascript_import_sort_module_name = false 379 | ij_javascript_import_use_node_resolution = true 380 | ij_javascript_imports_wrap = on_every_item 381 | ij_javascript_indent_case_from_switch = true 382 | ij_javascript_indent_chained_calls = true 383 | ij_javascript_indent_package_children = 0 384 | ij_javascript_jsx_attribute_value = braces 385 | ij_javascript_keep_blank_lines_in_code = 2 386 | ij_javascript_keep_first_column_comment = true 387 | ij_javascript_keep_indents_on_empty_lines = false 388 | ij_javascript_keep_line_breaks = true 389 | ij_javascript_keep_simple_blocks_in_one_line = false 390 | ij_javascript_keep_simple_methods_in_one_line = false 391 | ij_javascript_line_comment_add_space = true 392 | ij_javascript_line_comment_at_first_column = false 393 | ij_javascript_method_brace_style = end_of_line 394 | ij_javascript_method_call_chain_wrap = off 395 | ij_javascript_method_parameters_new_line_after_left_paren = false 396 | ij_javascript_method_parameters_right_paren_on_new_line = false 397 | ij_javascript_method_parameters_wrap = off 398 | ij_javascript_object_literal_wrap = on_every_item 399 | ij_javascript_parentheses_expression_new_line_after_left_paren = false 400 | ij_javascript_parentheses_expression_right_paren_on_new_line = false 401 | ij_javascript_place_assignment_sign_on_next_line = false 402 | ij_javascript_prefer_as_type_cast = false 403 | ij_javascript_prefer_explicit_types_function_expression_returns = false 404 | ij_javascript_prefer_explicit_types_function_returns = false 405 | ij_javascript_prefer_explicit_types_vars_fields = false 406 | ij_javascript_prefer_parameters_wrap = false 407 | ij_javascript_reformat_c_style_comments = false 408 | ij_javascript_space_after_colon = true 409 | ij_javascript_space_after_comma = true 410 | ij_javascript_space_after_dots_in_rest_parameter = false 411 | ij_javascript_space_after_generator_mult = true 412 | ij_javascript_space_after_property_colon = true 413 | ij_javascript_space_after_quest = true 414 | ij_javascript_space_after_type_colon = true 415 | ij_javascript_space_after_unary_not = false 416 | ij_javascript_space_before_async_arrow_lparen = true 417 | ij_javascript_space_before_catch_keyword = true 418 | ij_javascript_space_before_catch_left_brace = true 419 | ij_javascript_space_before_catch_parentheses = true 420 | ij_javascript_space_before_class_lbrace = true 421 | ij_javascript_space_before_class_left_brace = true 422 | ij_javascript_space_before_colon = true 423 | ij_javascript_space_before_comma = false 424 | ij_javascript_space_before_do_left_brace = true 425 | ij_javascript_space_before_else_keyword = true 426 | ij_javascript_space_before_else_left_brace = true 427 | ij_javascript_space_before_finally_keyword = true 428 | ij_javascript_space_before_finally_left_brace = true 429 | ij_javascript_space_before_for_left_brace = true 430 | ij_javascript_space_before_for_parentheses = true 431 | ij_javascript_space_before_for_semicolon = false 432 | ij_javascript_space_before_function_left_parenth = true 433 | ij_javascript_space_before_generator_mult = false 434 | ij_javascript_space_before_if_left_brace = true 435 | ij_javascript_space_before_if_parentheses = true 436 | ij_javascript_space_before_method_call_parentheses = false 437 | ij_javascript_space_before_method_left_brace = true 438 | ij_javascript_space_before_method_parentheses = false 439 | ij_javascript_space_before_property_colon = false 440 | ij_javascript_space_before_quest = true 441 | ij_javascript_space_before_switch_left_brace = true 442 | ij_javascript_space_before_switch_parentheses = true 443 | ij_javascript_space_before_try_left_brace = true 444 | ij_javascript_space_before_type_colon = false 445 | ij_javascript_space_before_unary_not = false 446 | ij_javascript_space_before_while_keyword = true 447 | ij_javascript_space_before_while_left_brace = true 448 | ij_javascript_space_before_while_parentheses = true 449 | ij_javascript_spaces_around_additive_operators = true 450 | ij_javascript_spaces_around_arrow_function_operator = true 451 | ij_javascript_spaces_around_assignment_operators = true 452 | ij_javascript_spaces_around_bitwise_operators = true 453 | ij_javascript_spaces_around_equality_operators = true 454 | ij_javascript_spaces_around_logical_operators = true 455 | ij_javascript_spaces_around_multiplicative_operators = true 456 | ij_javascript_spaces_around_relational_operators = true 457 | ij_javascript_spaces_around_shift_operators = true 458 | ij_javascript_spaces_around_unary_operator = false 459 | ij_javascript_spaces_within_array_initializer_brackets = false 460 | ij_javascript_spaces_within_brackets = false 461 | ij_javascript_spaces_within_catch_parentheses = false 462 | ij_javascript_spaces_within_for_parentheses = false 463 | ij_javascript_spaces_within_if_parentheses = false 464 | ij_javascript_spaces_within_imports = false 465 | ij_javascript_spaces_within_interpolation_expressions = false 466 | ij_javascript_spaces_within_method_call_parentheses = false 467 | ij_javascript_spaces_within_method_parentheses = false 468 | ij_javascript_spaces_within_object_literal_braces = false 469 | ij_javascript_spaces_within_object_type_braces = true 470 | ij_javascript_spaces_within_parentheses = false 471 | ij_javascript_spaces_within_switch_parentheses = false 472 | ij_javascript_spaces_within_type_assertion = false 473 | ij_javascript_spaces_within_union_types = true 474 | ij_javascript_spaces_within_while_parentheses = false 475 | ij_javascript_special_else_if_treatment = true 476 | ij_javascript_ternary_operation_signs_on_next_line = false 477 | ij_javascript_ternary_operation_wrap = off 478 | ij_javascript_union_types_wrap = on_every_item 479 | ij_javascript_use_chained_calls_group_indents = false 480 | ij_javascript_use_double_quotes = true 481 | ij_javascript_use_explicit_js_extension = auto 482 | ij_javascript_use_path_mapping = always 483 | ij_javascript_use_public_modifier = false 484 | ij_javascript_use_semicolon_after_statement = true 485 | ij_javascript_var_declaration_wrap = normal 486 | ij_javascript_while_brace_force = never 487 | ij_javascript_while_on_new_line = false 488 | ij_javascript_wrap_comments = false 489 | 490 | [{*.ctp,*.hphp,*.inc,*.module,*.php,*.php4,*.php5,*.phtml,SimpleXLS}] 491 | ij_continuation_indent_size = 4 492 | ij_php_align_assignments = false 493 | ij_php_align_class_constants = false 494 | ij_php_align_group_field_declarations = false 495 | ij_php_align_inline_comments = false 496 | ij_php_align_key_value_pairs = false 497 | ij_php_align_match_arm_bodies = false 498 | ij_php_align_multiline_array_initializer_expression = false 499 | ij_php_align_multiline_binary_operation = false 500 | ij_php_align_multiline_chained_methods = false 501 | ij_php_align_multiline_extends_list = false 502 | ij_php_align_multiline_for = true 503 | ij_php_align_multiline_parameters = true 504 | ij_php_align_multiline_parameters_in_calls = false 505 | ij_php_align_multiline_ternary_operation = false 506 | ij_php_align_named_arguments = false 507 | ij_php_align_phpdoc_comments = false 508 | ij_php_align_phpdoc_param_names = false 509 | ij_php_anonymous_brace_style = next_line 510 | ij_php_api_weight = 28 511 | ij_php_array_initializer_new_line_after_left_brace = false 512 | ij_php_array_initializer_right_brace_on_new_line = false 513 | ij_php_array_initializer_wrap = off 514 | ij_php_assignment_wrap = off 515 | ij_php_attributes_wrap = off 516 | ij_php_author_weight = 28 517 | ij_php_binary_operation_sign_on_next_line = false 518 | ij_php_binary_operation_wrap = off 519 | ij_php_blank_lines_after_class_header = 0 520 | ij_php_blank_lines_after_function = 1 521 | ij_php_blank_lines_after_imports = 1 522 | ij_php_blank_lines_after_opening_tag = 0 523 | ij_php_blank_lines_after_package = 0 524 | ij_php_blank_lines_around_class = 1 525 | ij_php_blank_lines_around_constants = 0 526 | ij_php_blank_lines_around_field = 0 527 | ij_php_blank_lines_around_method = 1 528 | ij_php_blank_lines_before_class_end = 0 529 | ij_php_blank_lines_before_imports = 1 530 | ij_php_blank_lines_before_method_body = 0 531 | ij_php_blank_lines_before_package = 1 532 | ij_php_blank_lines_before_return_statement = 0 533 | ij_php_blank_lines_between_imports = 0 534 | ij_php_block_brace_style = end_of_line 535 | ij_php_call_parameters_new_line_after_left_paren = false 536 | ij_php_call_parameters_right_paren_on_new_line = false 537 | ij_php_call_parameters_wrap = off 538 | ij_php_catch_on_new_line = true 539 | ij_php_category_weight = 28 540 | ij_php_class_brace_style = next_line 541 | ij_php_comma_after_last_argument = false 542 | ij_php_comma_after_last_array_element = false 543 | ij_php_comma_after_last_closure_use_var = false 544 | ij_php_comma_after_last_parameter = false 545 | ij_php_concat_spaces = true 546 | ij_php_copyright_weight = 28 547 | ij_php_deprecated_weight = 28 548 | ij_php_do_while_brace_force = never 549 | ij_php_else_if_style = combine 550 | ij_php_else_on_new_line = false 551 | ij_php_example_weight = 28 552 | ij_php_extends_keyword_wrap = off 553 | ij_php_extends_list_wrap = off 554 | ij_php_fields_default_visibility = private 555 | ij_php_filesource_weight = 28 556 | ij_php_finally_on_new_line = true 557 | ij_php_for_brace_force = never 558 | ij_php_for_statement_new_line_after_left_paren = false 559 | ij_php_for_statement_right_paren_on_new_line = false 560 | ij_php_for_statement_wrap = off 561 | ij_php_force_empty_methods_in_one_line = false 562 | ij_php_force_short_declaration_array_style = false 563 | ij_php_getters_setters_naming_style = camel_case 564 | ij_php_getters_setters_order_style = getters_first 565 | ij_php_global_weight = 28 566 | ij_php_group_use_wrap = on_every_item 567 | ij_php_if_brace_force = never 568 | ij_php_if_lparen_on_next_line = false 569 | ij_php_if_rparen_on_next_line = false 570 | ij_php_ignore_weight = 28 571 | ij_php_import_sorting = alphabetic 572 | ij_php_indent_break_from_case = true 573 | ij_php_indent_case_from_switch = true 574 | ij_php_indent_code_in_php_tags = false 575 | ij_php_internal_weight = 28 576 | ij_php_keep_blank_lines_after_lbrace = 2 577 | ij_php_keep_blank_lines_before_right_brace = 2 578 | ij_php_keep_blank_lines_in_code = 2 579 | ij_php_keep_blank_lines_in_declarations = 2 580 | ij_php_keep_control_statement_in_one_line = true 581 | ij_php_keep_first_column_comment = true 582 | ij_php_keep_indents_on_empty_lines = false 583 | ij_php_keep_line_breaks = true 584 | ij_php_keep_rparen_and_lbrace_on_one_line = false 585 | ij_php_keep_simple_classes_in_one_line = false 586 | ij_php_keep_simple_methods_in_one_line = false 587 | ij_php_lambda_brace_style = next_line 588 | ij_php_license_weight = 28 589 | ij_php_line_comment_add_space = false 590 | ij_php_line_comment_at_first_column = true 591 | ij_php_link_weight = 28 592 | ij_php_lower_case_boolean_const = false 593 | ij_php_lower_case_keywords = true 594 | ij_php_lower_case_null_const = false 595 | ij_php_method_brace_style = next_line 596 | ij_php_method_call_chain_wrap = off 597 | ij_php_method_parameters_new_line_after_left_paren = false 598 | ij_php_method_parameters_right_paren_on_new_line = false 599 | ij_php_method_parameters_wrap = off 600 | ij_php_method_weight = 28 601 | ij_php_modifier_list_wrap = false 602 | ij_php_multiline_chained_calls_semicolon_on_new_line = false 603 | ij_php_namespace_brace_style = 2 604 | ij_php_new_line_after_php_opening_tag = false 605 | ij_php_null_type_position = in_the_end 606 | ij_php_package_weight = 28 607 | ij_php_param_weight = 0 608 | ij_php_parameters_attributes_wrap = off 609 | ij_php_parentheses_expression_new_line_after_left_paren = false 610 | ij_php_parentheses_expression_right_paren_on_new_line = false 611 | ij_php_phpdoc_blank_line_before_tags = false 612 | ij_php_phpdoc_blank_lines_around_parameters = false 613 | ij_php_phpdoc_keep_blank_lines = true 614 | ij_php_phpdoc_param_spaces_between_name_and_description = 1 615 | ij_php_phpdoc_param_spaces_between_tag_and_type = 1 616 | ij_php_phpdoc_param_spaces_between_type_and_name = 1 617 | ij_php_phpdoc_use_fqcn = false 618 | ij_php_phpdoc_wrap_long_lines = false 619 | ij_php_place_assignment_sign_on_next_line = false 620 | ij_php_place_parens_for_constructor = 0 621 | ij_php_property_read_weight = 28 622 | ij_php_property_weight = 28 623 | ij_php_property_write_weight = 28 624 | ij_php_return_type_on_new_line = false 625 | ij_php_return_weight = 1 626 | ij_php_see_weight = 28 627 | ij_php_since_weight = 28 628 | ij_php_sort_phpdoc_elements = true 629 | ij_php_space_after_colon = true 630 | ij_php_space_after_colon_in_enum_backed_type = true 631 | ij_php_space_after_colon_in_named_argument = true 632 | ij_php_space_after_colon_in_return_type = true 633 | ij_php_space_after_comma = true 634 | ij_php_space_after_for_semicolon = true 635 | ij_php_space_after_quest = true 636 | ij_php_space_after_type_cast = false 637 | ij_php_space_after_unary_not = false 638 | ij_php_space_before_array_initializer_left_brace = false 639 | ij_php_space_before_catch_keyword = true 640 | ij_php_space_before_catch_left_brace = true 641 | ij_php_space_before_catch_parentheses = true 642 | ij_php_space_before_class_left_brace = true 643 | ij_php_space_before_closure_left_parenthesis = true 644 | ij_php_space_before_colon = true 645 | ij_php_space_before_colon_in_enum_backed_type = false 646 | ij_php_space_before_colon_in_named_argument = false 647 | ij_php_space_before_colon_in_return_type = false 648 | ij_php_space_before_comma = false 649 | ij_php_space_before_do_left_brace = true 650 | ij_php_space_before_else_keyword = true 651 | ij_php_space_before_else_left_brace = true 652 | ij_php_space_before_finally_keyword = true 653 | ij_php_space_before_finally_left_brace = true 654 | ij_php_space_before_for_left_brace = true 655 | ij_php_space_before_for_parentheses = true 656 | ij_php_space_before_for_semicolon = false 657 | ij_php_space_before_if_left_brace = true 658 | ij_php_space_before_if_parentheses = true 659 | ij_php_space_before_method_call_parentheses = false 660 | ij_php_space_before_method_left_brace = true 661 | ij_php_space_before_method_parentheses = false 662 | ij_php_space_before_quest = true 663 | ij_php_space_before_short_closure_left_parenthesis = false 664 | ij_php_space_before_switch_left_brace = true 665 | ij_php_space_before_switch_parentheses = true 666 | ij_php_space_before_try_left_brace = true 667 | ij_php_space_before_unary_not = false 668 | ij_php_space_before_while_keyword = true 669 | ij_php_space_before_while_left_brace = true 670 | ij_php_space_before_while_parentheses = true 671 | ij_php_space_between_ternary_quest_and_colon = false 672 | ij_php_spaces_around_additive_operators = true 673 | ij_php_spaces_around_arrow = false 674 | ij_php_spaces_around_assignment_in_declare = false 675 | ij_php_spaces_around_assignment_operators = true 676 | ij_php_spaces_around_bitwise_operators = true 677 | ij_php_spaces_around_equality_operators = true 678 | ij_php_spaces_around_logical_operators = true 679 | ij_php_spaces_around_multiplicative_operators = true 680 | ij_php_spaces_around_null_coalesce_operator = true 681 | ij_php_spaces_around_pipe_in_union_type = false 682 | ij_php_spaces_around_relational_operators = true 683 | ij_php_spaces_around_shift_operators = true 684 | ij_php_spaces_around_unary_operator = false 685 | ij_php_spaces_around_var_within_brackets = false 686 | ij_php_spaces_within_array_initializer_braces = false 687 | ij_php_spaces_within_brackets = false 688 | ij_php_spaces_within_catch_parentheses = false 689 | ij_php_spaces_within_for_parentheses = false 690 | ij_php_spaces_within_if_parentheses = false 691 | ij_php_spaces_within_method_call_parentheses = false 692 | ij_php_spaces_within_method_parentheses = false 693 | ij_php_spaces_within_parentheses = false 694 | ij_php_spaces_within_short_echo_tags = true 695 | ij_php_spaces_within_switch_parentheses = false 696 | ij_php_spaces_within_while_parentheses = false 697 | ij_php_special_else_if_treatment = true 698 | ij_php_subpackage_weight = 28 699 | ij_php_ternary_operation_signs_on_next_line = false 700 | ij_php_ternary_operation_wrap = off 701 | ij_php_throws_weight = 2 702 | ij_php_todo_weight = 28 703 | ij_php_treat_multiline_arrays_and_lambdas_multiline = false 704 | ij_php_unknown_tag_weight = 28 705 | ij_php_upper_case_boolean_const = false 706 | ij_php_upper_case_null_const = false 707 | ij_php_uses_weight = 28 708 | ij_php_var_weight = 28 709 | ij_php_variable_naming_style = mixed 710 | ij_php_version_weight = 28 711 | ij_php_while_brace_force = never 712 | ij_php_while_on_new_line = true 713 | 714 | [{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,bowerrc,composer.lock,jest.config}] 715 | indent_size = 2 716 | ij_json_array_wrapping = split_into_lines 717 | ij_json_keep_blank_lines_in_code = 0 718 | ij_json_keep_indents_on_empty_lines = false 719 | ij_json_keep_line_breaks = true 720 | ij_json_keep_trailing_comma = false 721 | ij_json_object_wrapping = split_into_lines 722 | ij_json_property_alignment = do_not_align 723 | ij_json_space_after_colon = true 724 | ij_json_space_after_comma = true 725 | ij_json_space_before_colon = false 726 | ij_json_space_before_comma = false 727 | ij_json_spaces_within_braces = false 728 | ij_json_spaces_within_brackets = false 729 | ij_json_wrap_long_lines = false 730 | 731 | [{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}] 732 | ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3 733 | ij_html_align_attributes = true 734 | ij_html_align_text = false 735 | ij_html_attribute_wrap = off 736 | ij_html_block_comment_add_space = false 737 | ij_html_block_comment_at_first_column = true 738 | ij_html_do_not_align_children_of_min_lines = 0 739 | ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p 740 | ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot 741 | ij_html_enforce_quotes = false 742 | ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var 743 | ij_html_keep_blank_lines = 2 744 | ij_html_keep_indents_on_empty_lines = false 745 | ij_html_keep_line_breaks = true 746 | ij_html_keep_line_breaks_in_text = true 747 | ij_html_keep_whitespaces = false 748 | ij_html_keep_whitespaces_inside = span,pre,textarea 749 | ij_html_line_comment_at_first_column = true 750 | ij_html_new_line_after_last_attribute = never 751 | ij_html_new_line_before_first_attribute = never 752 | ij_html_quote_style = double 753 | ij_html_remove_new_line_before_tags = br 754 | ij_html_space_after_tag_name = false 755 | ij_html_space_around_equality_in_attribute = false 756 | ij_html_space_inside_empty_tag = false 757 | ij_html_text_wrap = normal 758 | 759 | [{*.markdown,*.md}] 760 | ij_markdown_force_one_space_after_blockquote_symbol = true 761 | ij_markdown_force_one_space_after_header_symbol = true 762 | ij_markdown_force_one_space_after_list_bullet = true 763 | ij_markdown_force_one_space_between_words = true 764 | ij_markdown_insert_quote_arrows_on_wrap = true 765 | ij_markdown_keep_indents_on_empty_lines = false 766 | ij_markdown_keep_line_breaks_inside_text_blocks = true 767 | ij_markdown_max_lines_around_block_elements = 1 768 | ij_markdown_max_lines_around_header = 1 769 | ij_markdown_max_lines_between_paragraphs = 1 770 | ij_markdown_min_lines_around_block_elements = 1 771 | ij_markdown_min_lines_around_header = 1 772 | ij_markdown_min_lines_between_paragraphs = 1 773 | ij_markdown_wrap_text_if_long = true 774 | ij_markdown_wrap_text_inside_blockquotes = true 775 | 776 | [{*.yaml,*.yml}] 777 | indent_size = 2 778 | ij_yaml_align_values_properties = do_not_align 779 | ij_yaml_autoinsert_sequence_marker = true 780 | ij_yaml_block_mapping_on_new_line = false 781 | ij_yaml_indent_sequence_value = true 782 | ij_yaml_keep_indents_on_empty_lines = false 783 | ij_yaml_keep_line_breaks = true 784 | ij_yaml_sequence_on_new_line = false 785 | ij_yaml_space_before_colon = false 786 | ij_yaml_spaces_within_braces = true 787 | ij_yaml_spaces_within_brackets = true 788 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "3e73f8f68702e778f6e1ad0bcd0494d8", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "composer/pcre", 12 | "version": "3.1.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/composer/pcre.git", 16 | "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", 21 | "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": "^7.4 || ^8.0" 26 | }, 27 | "require-dev": { 28 | "phpstan/phpstan": "^1.3", 29 | "phpstan/phpstan-strict-rules": "^1.1", 30 | "symfony/phpunit-bridge": "^5" 31 | }, 32 | "type": "library", 33 | "extra": { 34 | "branch-alias": { 35 | "dev-main": "3.x-dev" 36 | } 37 | }, 38 | "autoload": { 39 | "psr-4": { 40 | "Composer\\Pcre\\": "src" 41 | } 42 | }, 43 | "notification-url": "https://packagist.org/downloads/", 44 | "license": [ 45 | "MIT" 46 | ], 47 | "authors": [ 48 | { 49 | "name": "Jordi Boggiano", 50 | "email": "j.boggiano@seld.be", 51 | "homepage": "http://seld.be" 52 | } 53 | ], 54 | "description": "PCRE wrapping library that offers type-safe preg_* replacements.", 55 | "keywords": [ 56 | "PCRE", 57 | "preg", 58 | "regex", 59 | "regular expression" 60 | ], 61 | "support": { 62 | "issues": "https://github.com/composer/pcre/issues", 63 | "source": "https://github.com/composer/pcre/tree/3.1.0" 64 | }, 65 | "funding": [ 66 | { 67 | "url": "https://packagist.com", 68 | "type": "custom" 69 | }, 70 | { 71 | "url": "https://github.com/composer", 72 | "type": "github" 73 | }, 74 | { 75 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 76 | "type": "tidelift" 77 | } 78 | ], 79 | "time": "2022-11-17T09:50:14+00:00" 80 | }, 81 | { 82 | "name": "composer/semver", 83 | "version": "3.4.0", 84 | "source": { 85 | "type": "git", 86 | "url": "https://github.com/composer/semver.git", 87 | "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" 88 | }, 89 | "dist": { 90 | "type": "zip", 91 | "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", 92 | "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", 93 | "shasum": "" 94 | }, 95 | "require": { 96 | "php": "^5.3.2 || ^7.0 || ^8.0" 97 | }, 98 | "require-dev": { 99 | "phpstan/phpstan": "^1.4", 100 | "symfony/phpunit-bridge": "^4.2 || ^5" 101 | }, 102 | "type": "library", 103 | "extra": { 104 | "branch-alias": { 105 | "dev-main": "3.x-dev" 106 | } 107 | }, 108 | "autoload": { 109 | "psr-4": { 110 | "Composer\\Semver\\": "src" 111 | } 112 | }, 113 | "notification-url": "https://packagist.org/downloads/", 114 | "license": [ 115 | "MIT" 116 | ], 117 | "authors": [ 118 | { 119 | "name": "Nils Adermann", 120 | "email": "naderman@naderman.de", 121 | "homepage": "http://www.naderman.de" 122 | }, 123 | { 124 | "name": "Jordi Boggiano", 125 | "email": "j.boggiano@seld.be", 126 | "homepage": "http://seld.be" 127 | }, 128 | { 129 | "name": "Rob Bast", 130 | "email": "rob.bast@gmail.com", 131 | "homepage": "http://robbast.nl" 132 | } 133 | ], 134 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 135 | "keywords": [ 136 | "semantic", 137 | "semver", 138 | "validation", 139 | "versioning" 140 | ], 141 | "support": { 142 | "irc": "ircs://irc.libera.chat:6697/composer", 143 | "issues": "https://github.com/composer/semver/issues", 144 | "source": "https://github.com/composer/semver/tree/3.4.0" 145 | }, 146 | "funding": [ 147 | { 148 | "url": "https://packagist.com", 149 | "type": "custom" 150 | }, 151 | { 152 | "url": "https://github.com/composer", 153 | "type": "github" 154 | }, 155 | { 156 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 157 | "type": "tidelift" 158 | } 159 | ], 160 | "time": "2023-08-31T09:50:34+00:00" 161 | }, 162 | { 163 | "name": "composer/xdebug-handler", 164 | "version": "3.0.3", 165 | "source": { 166 | "type": "git", 167 | "url": "https://github.com/composer/xdebug-handler.git", 168 | "reference": "ced299686f41dce890debac69273b47ffe98a40c" 169 | }, 170 | "dist": { 171 | "type": "zip", 172 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", 173 | "reference": "ced299686f41dce890debac69273b47ffe98a40c", 174 | "shasum": "" 175 | }, 176 | "require": { 177 | "composer/pcre": "^1 || ^2 || ^3", 178 | "php": "^7.2.5 || ^8.0", 179 | "psr/log": "^1 || ^2 || ^3" 180 | }, 181 | "require-dev": { 182 | "phpstan/phpstan": "^1.0", 183 | "phpstan/phpstan-strict-rules": "^1.1", 184 | "symfony/phpunit-bridge": "^6.0" 185 | }, 186 | "type": "library", 187 | "autoload": { 188 | "psr-4": { 189 | "Composer\\XdebugHandler\\": "src" 190 | } 191 | }, 192 | "notification-url": "https://packagist.org/downloads/", 193 | "license": [ 194 | "MIT" 195 | ], 196 | "authors": [ 197 | { 198 | "name": "John Stevenson", 199 | "email": "john-stevenson@blueyonder.co.uk" 200 | } 201 | ], 202 | "description": "Restarts a process without Xdebug.", 203 | "keywords": [ 204 | "Xdebug", 205 | "performance" 206 | ], 207 | "support": { 208 | "irc": "irc://irc.freenode.org/composer", 209 | "issues": "https://github.com/composer/xdebug-handler/issues", 210 | "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" 211 | }, 212 | "funding": [ 213 | { 214 | "url": "https://packagist.com", 215 | "type": "custom" 216 | }, 217 | { 218 | "url": "https://github.com/composer", 219 | "type": "github" 220 | }, 221 | { 222 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 223 | "type": "tidelift" 224 | } 225 | ], 226 | "time": "2022-02-25T21:32:43+00:00" 227 | }, 228 | { 229 | "name": "friendsofphp/php-cs-fixer", 230 | "version": "v3.30.0", 231 | "source": { 232 | "type": "git", 233 | "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", 234 | "reference": "95c64693b2f149966a2bc05a7a4981b0343ea52f" 235 | }, 236 | "dist": { 237 | "type": "zip", 238 | "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/95c64693b2f149966a2bc05a7a4981b0343ea52f", 239 | "reference": "95c64693b2f149966a2bc05a7a4981b0343ea52f", 240 | "shasum": "" 241 | }, 242 | "require": { 243 | "composer/semver": "^3.3", 244 | "composer/xdebug-handler": "^3.0.3", 245 | "ext-json": "*", 246 | "ext-tokenizer": "*", 247 | "php": "^7.4 || ^8.0", 248 | "sebastian/diff": "^4.0 || ^5.0", 249 | "symfony/console": "^5.4 || ^6.0", 250 | "symfony/event-dispatcher": "^5.4 || ^6.0", 251 | "symfony/filesystem": "^5.4 || ^6.0", 252 | "symfony/finder": "^5.4 || ^6.0", 253 | "symfony/options-resolver": "^5.4 || ^6.0", 254 | "symfony/polyfill-mbstring": "^1.27", 255 | "symfony/polyfill-php80": "^1.27", 256 | "symfony/polyfill-php81": "^1.27", 257 | "symfony/process": "^5.4 || ^6.0", 258 | "symfony/stopwatch": "^5.4 || ^6.0" 259 | }, 260 | "require-dev": { 261 | "facile-it/paraunit": "^1.3 || ^2.0", 262 | "justinrainbow/json-schema": "^5.2", 263 | "keradus/cli-executor": "^2.0", 264 | "mikey179/vfsstream": "^1.6.11", 265 | "php-coveralls/php-coveralls": "^2.5.3", 266 | "php-cs-fixer/accessible-object": "^1.1", 267 | "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", 268 | "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", 269 | "phpspec/prophecy": "^1.16", 270 | "phpspec/prophecy-phpunit": "^2.0", 271 | "phpunit/phpunit": "^9.5", 272 | "phpunitgoodpractices/polyfill": "^1.6", 273 | "phpunitgoodpractices/traits": "^1.9.2", 274 | "symfony/phpunit-bridge": "^6.2.3", 275 | "symfony/yaml": "^5.4 || ^6.0" 276 | }, 277 | "suggest": { 278 | "ext-dom": "For handling output formats in XML", 279 | "ext-mbstring": "For handling non-UTF8 characters." 280 | }, 281 | "bin": [ 282 | "php-cs-fixer" 283 | ], 284 | "type": "application", 285 | "autoload": { 286 | "psr-4": { 287 | "PhpCsFixer\\": "src/" 288 | } 289 | }, 290 | "notification-url": "https://packagist.org/downloads/", 291 | "license": [ 292 | "MIT" 293 | ], 294 | "authors": [ 295 | { 296 | "name": "Fabien Potencier", 297 | "email": "fabien@symfony.com" 298 | }, 299 | { 300 | "name": "Dariusz Rumiński", 301 | "email": "dariusz.ruminski@gmail.com" 302 | } 303 | ], 304 | "description": "A tool to automatically fix PHP code style", 305 | "keywords": [ 306 | "Static code analysis", 307 | "fixer", 308 | "standards", 309 | "static analysis" 310 | ], 311 | "support": { 312 | "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", 313 | "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.30.0" 314 | }, 315 | "funding": [ 316 | { 317 | "url": "https://github.com/keradus", 318 | "type": "github" 319 | } 320 | ], 321 | "time": "2023-09-26T22:10:43+00:00" 322 | }, 323 | { 324 | "name": "kubawerlos/php-cs-fixer-custom-fixers", 325 | "version": "v3.16.2", 326 | "source": { 327 | "type": "git", 328 | "url": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers.git", 329 | "reference": "d3f2590069d06ba49ad24cac03f802e8ad0aaeba" 330 | }, 331 | "dist": { 332 | "type": "zip", 333 | "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/d3f2590069d06ba49ad24cac03f802e8ad0aaeba", 334 | "reference": "d3f2590069d06ba49ad24cac03f802e8ad0aaeba", 335 | "shasum": "" 336 | }, 337 | "require": { 338 | "ext-filter": "*", 339 | "ext-tokenizer": "*", 340 | "friendsofphp/php-cs-fixer": "^3.22", 341 | "php": "^7.4 || ^8.0" 342 | }, 343 | "require-dev": { 344 | "phpunit/phpunit": "^9.6.4 || ^10.0.14" 345 | }, 346 | "type": "library", 347 | "autoload": { 348 | "psr-4": { 349 | "PhpCsFixerCustomFixers\\": "src" 350 | } 351 | }, 352 | "notification-url": "https://packagist.org/downloads/", 353 | "license": [ 354 | "MIT" 355 | ], 356 | "authors": [ 357 | { 358 | "name": "Kuba Werłos", 359 | "email": "werlos@gmail.com" 360 | } 361 | ], 362 | "description": "A set of custom fixers for PHP CS Fixer", 363 | "support": { 364 | "issues": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/issues", 365 | "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.16.2" 366 | }, 367 | "time": "2023-08-06T13:50:15+00:00" 368 | }, 369 | { 370 | "name": "n98/junit-xml", 371 | "version": "1.1.0", 372 | "source": { 373 | "type": "git", 374 | "url": "https://github.com/cmuench/junit-xml.git", 375 | "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73" 376 | }, 377 | "dist": { 378 | "type": "zip", 379 | "url": "https://api.github.com/repos/cmuench/junit-xml/zipball/0017dd92ac8cb619f02e32f4cffd768cfe327c73", 380 | "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73", 381 | "shasum": "" 382 | }, 383 | "require-dev": { 384 | "phpunit/phpunit": "^9.5.0" 385 | }, 386 | "type": "library", 387 | "autoload": { 388 | "psr-4": { 389 | "N98\\JUnitXml\\": "src/N98/JUnitXml" 390 | } 391 | }, 392 | "notification-url": "https://packagist.org/downloads/", 393 | "license": [ 394 | "MIT" 395 | ], 396 | "authors": [ 397 | { 398 | "name": "Christian Münch", 399 | "email": "c.muench@netz98.de" 400 | } 401 | ], 402 | "description": "JUnit XML Document generation library", 403 | "support": { 404 | "issues": "https://github.com/cmuench/junit-xml/issues", 405 | "source": "https://github.com/cmuench/junit-xml/tree/1.1.0" 406 | }, 407 | "time": "2020-12-25T09:08:58+00:00" 408 | }, 409 | { 410 | "name": "overtrue/phplint", 411 | "version": "4.5.0", 412 | "source": { 413 | "type": "git", 414 | "url": "https://github.com/overtrue/phplint.git", 415 | "reference": "d0b50e3b44641f961468e3f374937bb74181b02f" 416 | }, 417 | "dist": { 418 | "type": "zip", 419 | "url": "https://api.github.com/repos/overtrue/phplint/zipball/d0b50e3b44641f961468e3f374937bb74181b02f", 420 | "reference": "d0b50e3b44641f961468e3f374937bb74181b02f", 421 | "shasum": "" 422 | }, 423 | "require": { 424 | "ext-json": "*", 425 | "n98/junit-xml": "1.1.0", 426 | "php": "^8.0", 427 | "symfony/console": "^5.4 || ^6.0", 428 | "symfony/finder": "^5.4 || ^6.0", 429 | "symfony/process": "^5.4 || ^6.0", 430 | "symfony/yaml": "^5.4 || ^6.0" 431 | }, 432 | "require-dev": { 433 | "bamarni/composer-bin-plugin": "^1.4", 434 | "brainmaestro/composer-git-hooks": "^2.8.5", 435 | "friendsofphp/php-cs-fixer": "^3.4.0", 436 | "jetbrains/phpstorm-stubs": "^2021.3", 437 | "php-parallel-lint/php-console-highlighter": "^1.0" 438 | }, 439 | "bin": [ 440 | "bin/phplint" 441 | ], 442 | "type": "library", 443 | "extra": { 444 | "hooks": { 445 | "pre-commit": [ 446 | "composer fix-style" 447 | ] 448 | } 449 | }, 450 | "autoload": { 451 | "psr-4": { 452 | "Overtrue\\PHPLint\\": "src/" 453 | } 454 | }, 455 | "notification-url": "https://packagist.org/downloads/", 456 | "license": [ 457 | "MIT" 458 | ], 459 | "authors": [ 460 | { 461 | "name": "overtrue", 462 | "email": "anzhengchao@gmail.com" 463 | } 464 | ], 465 | "description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.", 466 | "keywords": [ 467 | "check", 468 | "lint", 469 | "phplint", 470 | "syntax" 471 | ], 472 | "support": { 473 | "issues": "https://github.com/overtrue/phplint/issues", 474 | "source": "https://github.com/overtrue/phplint/tree/4.5.0" 475 | }, 476 | "funding": [ 477 | { 478 | "url": "https://github.com/overtrue", 479 | "type": "github" 480 | } 481 | ], 482 | "time": "2022-12-28T13:06:24+00:00" 483 | }, 484 | { 485 | "name": "psr/container", 486 | "version": "2.0.2", 487 | "source": { 488 | "type": "git", 489 | "url": "https://github.com/php-fig/container.git", 490 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 491 | }, 492 | "dist": { 493 | "type": "zip", 494 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 495 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 496 | "shasum": "" 497 | }, 498 | "require": { 499 | "php": ">=7.4.0" 500 | }, 501 | "type": "library", 502 | "extra": { 503 | "branch-alias": { 504 | "dev-master": "2.0.x-dev" 505 | } 506 | }, 507 | "autoload": { 508 | "psr-4": { 509 | "Psr\\Container\\": "src/" 510 | } 511 | }, 512 | "notification-url": "https://packagist.org/downloads/", 513 | "license": [ 514 | "MIT" 515 | ], 516 | "authors": [ 517 | { 518 | "name": "PHP-FIG", 519 | "homepage": "https://www.php-fig.org/" 520 | } 521 | ], 522 | "description": "Common Container Interface (PHP FIG PSR-11)", 523 | "homepage": "https://github.com/php-fig/container", 524 | "keywords": [ 525 | "PSR-11", 526 | "container", 527 | "container-interface", 528 | "container-interop", 529 | "psr" 530 | ], 531 | "support": { 532 | "issues": "https://github.com/php-fig/container/issues", 533 | "source": "https://github.com/php-fig/container/tree/2.0.2" 534 | }, 535 | "time": "2021-11-05T16:47:00+00:00" 536 | }, 537 | { 538 | "name": "psr/event-dispatcher", 539 | "version": "1.0.0", 540 | "source": { 541 | "type": "git", 542 | "url": "https://github.com/php-fig/event-dispatcher.git", 543 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" 544 | }, 545 | "dist": { 546 | "type": "zip", 547 | "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", 548 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", 549 | "shasum": "" 550 | }, 551 | "require": { 552 | "php": ">=7.2.0" 553 | }, 554 | "type": "library", 555 | "extra": { 556 | "branch-alias": { 557 | "dev-master": "1.0.x-dev" 558 | } 559 | }, 560 | "autoload": { 561 | "psr-4": { 562 | "Psr\\EventDispatcher\\": "src/" 563 | } 564 | }, 565 | "notification-url": "https://packagist.org/downloads/", 566 | "license": [ 567 | "MIT" 568 | ], 569 | "authors": [ 570 | { 571 | "name": "PHP-FIG", 572 | "homepage": "http://www.php-fig.org/" 573 | } 574 | ], 575 | "description": "Standard interfaces for event handling.", 576 | "keywords": [ 577 | "events", 578 | "psr", 579 | "psr-14" 580 | ], 581 | "support": { 582 | "issues": "https://github.com/php-fig/event-dispatcher/issues", 583 | "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" 584 | }, 585 | "time": "2019-01-08T18:20:26+00:00" 586 | }, 587 | { 588 | "name": "psr/log", 589 | "version": "3.0.0", 590 | "source": { 591 | "type": "git", 592 | "url": "https://github.com/php-fig/log.git", 593 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" 594 | }, 595 | "dist": { 596 | "type": "zip", 597 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", 598 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", 599 | "shasum": "" 600 | }, 601 | "require": { 602 | "php": ">=8.0.0" 603 | }, 604 | "type": "library", 605 | "extra": { 606 | "branch-alias": { 607 | "dev-master": "3.x-dev" 608 | } 609 | }, 610 | "autoload": { 611 | "psr-4": { 612 | "Psr\\Log\\": "src" 613 | } 614 | }, 615 | "notification-url": "https://packagist.org/downloads/", 616 | "license": [ 617 | "MIT" 618 | ], 619 | "authors": [ 620 | { 621 | "name": "PHP-FIG", 622 | "homepage": "https://www.php-fig.org/" 623 | } 624 | ], 625 | "description": "Common interface for logging libraries", 626 | "homepage": "https://github.com/php-fig/log", 627 | "keywords": [ 628 | "log", 629 | "psr", 630 | "psr-3" 631 | ], 632 | "support": { 633 | "source": "https://github.com/php-fig/log/tree/3.0.0" 634 | }, 635 | "time": "2021-07-14T16:46:02+00:00" 636 | }, 637 | { 638 | "name": "redaxo/php-cs-fixer-config", 639 | "version": "2.2.0", 640 | "source": { 641 | "type": "git", 642 | "url": "https://github.com/redaxo/php-cs-fixer-config.git", 643 | "reference": "3734ba2e456e4a3267894fafc514702c06c6715d" 644 | }, 645 | "dist": { 646 | "type": "zip", 647 | "url": "https://api.github.com/repos/redaxo/php-cs-fixer-config/zipball/3734ba2e456e4a3267894fafc514702c06c6715d", 648 | "reference": "3734ba2e456e4a3267894fafc514702c06c6715d", 649 | "shasum": "" 650 | }, 651 | "require": { 652 | "friendsofphp/php-cs-fixer": "^3.17.0", 653 | "kubawerlos/php-cs-fixer-custom-fixers": "^3.14.0", 654 | "php": "^8.1" 655 | }, 656 | "type": "library", 657 | "autoload": { 658 | "psr-4": { 659 | "Redaxo\\PhpCsFixerConfig\\": "src" 660 | } 661 | }, 662 | "notification-url": "https://packagist.org/downloads/", 663 | "license": [ 664 | "MIT" 665 | ], 666 | "authors": [ 667 | { 668 | "name": "REDAXO Team", 669 | "email": "info@redaxo.org" 670 | } 671 | ], 672 | "description": "php-cs-fixer config for REDAXO", 673 | "keywords": [ 674 | "Static code analysis", 675 | "fixer", 676 | "standards", 677 | "static analysis" 678 | ], 679 | "support": { 680 | "issues": "https://github.com/redaxo/php-cs-fixer-config/issues", 681 | "source": "https://github.com/redaxo/php-cs-fixer-config/tree/2.2.0" 682 | }, 683 | "time": "2023-07-02T15:24:30+00:00" 684 | }, 685 | { 686 | "name": "sebastian/diff", 687 | "version": "5.0.3", 688 | "source": { 689 | "type": "git", 690 | "url": "https://github.com/sebastianbergmann/diff.git", 691 | "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" 692 | }, 693 | "dist": { 694 | "type": "zip", 695 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", 696 | "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", 697 | "shasum": "" 698 | }, 699 | "require": { 700 | "php": ">=8.1" 701 | }, 702 | "require-dev": { 703 | "phpunit/phpunit": "^10.0", 704 | "symfony/process": "^4.2 || ^5" 705 | }, 706 | "type": "library", 707 | "extra": { 708 | "branch-alias": { 709 | "dev-main": "5.0-dev" 710 | } 711 | }, 712 | "autoload": { 713 | "classmap": [ 714 | "src/" 715 | ] 716 | }, 717 | "notification-url": "https://packagist.org/downloads/", 718 | "license": [ 719 | "BSD-3-Clause" 720 | ], 721 | "authors": [ 722 | { 723 | "name": "Sebastian Bergmann", 724 | "email": "sebastian@phpunit.de" 725 | }, 726 | { 727 | "name": "Kore Nordmann", 728 | "email": "mail@kore-nordmann.de" 729 | } 730 | ], 731 | "description": "Diff implementation", 732 | "homepage": "https://github.com/sebastianbergmann/diff", 733 | "keywords": [ 734 | "diff", 735 | "udiff", 736 | "unidiff", 737 | "unified diff" 738 | ], 739 | "support": { 740 | "issues": "https://github.com/sebastianbergmann/diff/issues", 741 | "security": "https://github.com/sebastianbergmann/diff/security/policy", 742 | "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" 743 | }, 744 | "funding": [ 745 | { 746 | "url": "https://github.com/sebastianbergmann", 747 | "type": "github" 748 | } 749 | ], 750 | "time": "2023-05-01T07:48:21+00:00" 751 | }, 752 | { 753 | "name": "symfony/console", 754 | "version": "v6.3.4", 755 | "source": { 756 | "type": "git", 757 | "url": "https://github.com/symfony/console.git", 758 | "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" 759 | }, 760 | "dist": { 761 | "type": "zip", 762 | "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", 763 | "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", 764 | "shasum": "" 765 | }, 766 | "require": { 767 | "php": ">=8.1", 768 | "symfony/deprecation-contracts": "^2.5|^3", 769 | "symfony/polyfill-mbstring": "~1.0", 770 | "symfony/service-contracts": "^2.5|^3", 771 | "symfony/string": "^5.4|^6.0" 772 | }, 773 | "conflict": { 774 | "symfony/dependency-injection": "<5.4", 775 | "symfony/dotenv": "<5.4", 776 | "symfony/event-dispatcher": "<5.4", 777 | "symfony/lock": "<5.4", 778 | "symfony/process": "<5.4" 779 | }, 780 | "provide": { 781 | "psr/log-implementation": "1.0|2.0|3.0" 782 | }, 783 | "require-dev": { 784 | "psr/log": "^1|^2|^3", 785 | "symfony/config": "^5.4|^6.0", 786 | "symfony/dependency-injection": "^5.4|^6.0", 787 | "symfony/event-dispatcher": "^5.4|^6.0", 788 | "symfony/lock": "^5.4|^6.0", 789 | "symfony/process": "^5.4|^6.0", 790 | "symfony/var-dumper": "^5.4|^6.0" 791 | }, 792 | "type": "library", 793 | "autoload": { 794 | "psr-4": { 795 | "Symfony\\Component\\Console\\": "" 796 | }, 797 | "exclude-from-classmap": [ 798 | "/Tests/" 799 | ] 800 | }, 801 | "notification-url": "https://packagist.org/downloads/", 802 | "license": [ 803 | "MIT" 804 | ], 805 | "authors": [ 806 | { 807 | "name": "Fabien Potencier", 808 | "email": "fabien@symfony.com" 809 | }, 810 | { 811 | "name": "Symfony Community", 812 | "homepage": "https://symfony.com/contributors" 813 | } 814 | ], 815 | "description": "Eases the creation of beautiful and testable command line interfaces", 816 | "homepage": "https://symfony.com", 817 | "keywords": [ 818 | "cli", 819 | "command-line", 820 | "console", 821 | "terminal" 822 | ], 823 | "support": { 824 | "source": "https://github.com/symfony/console/tree/v6.3.4" 825 | }, 826 | "funding": [ 827 | { 828 | "url": "https://symfony.com/sponsor", 829 | "type": "custom" 830 | }, 831 | { 832 | "url": "https://github.com/fabpot", 833 | "type": "github" 834 | }, 835 | { 836 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 837 | "type": "tidelift" 838 | } 839 | ], 840 | "time": "2023-08-16T10:10:12+00:00" 841 | }, 842 | { 843 | "name": "symfony/deprecation-contracts", 844 | "version": "v3.3.0", 845 | "source": { 846 | "type": "git", 847 | "url": "https://github.com/symfony/deprecation-contracts.git", 848 | "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" 849 | }, 850 | "dist": { 851 | "type": "zip", 852 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", 853 | "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", 854 | "shasum": "" 855 | }, 856 | "require": { 857 | "php": ">=8.1" 858 | }, 859 | "type": "library", 860 | "extra": { 861 | "branch-alias": { 862 | "dev-main": "3.4-dev" 863 | }, 864 | "thanks": { 865 | "name": "symfony/contracts", 866 | "url": "https://github.com/symfony/contracts" 867 | } 868 | }, 869 | "autoload": { 870 | "files": [ 871 | "function.php" 872 | ] 873 | }, 874 | "notification-url": "https://packagist.org/downloads/", 875 | "license": [ 876 | "MIT" 877 | ], 878 | "authors": [ 879 | { 880 | "name": "Nicolas Grekas", 881 | "email": "p@tchwork.com" 882 | }, 883 | { 884 | "name": "Symfony Community", 885 | "homepage": "https://symfony.com/contributors" 886 | } 887 | ], 888 | "description": "A generic function and convention to trigger deprecation notices", 889 | "homepage": "https://symfony.com", 890 | "support": { 891 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" 892 | }, 893 | "funding": [ 894 | { 895 | "url": "https://symfony.com/sponsor", 896 | "type": "custom" 897 | }, 898 | { 899 | "url": "https://github.com/fabpot", 900 | "type": "github" 901 | }, 902 | { 903 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 904 | "type": "tidelift" 905 | } 906 | ], 907 | "time": "2023-05-23T14:45:45+00:00" 908 | }, 909 | { 910 | "name": "symfony/event-dispatcher", 911 | "version": "v6.3.2", 912 | "source": { 913 | "type": "git", 914 | "url": "https://github.com/symfony/event-dispatcher.git", 915 | "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" 916 | }, 917 | "dist": { 918 | "type": "zip", 919 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", 920 | "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", 921 | "shasum": "" 922 | }, 923 | "require": { 924 | "php": ">=8.1", 925 | "symfony/event-dispatcher-contracts": "^2.5|^3" 926 | }, 927 | "conflict": { 928 | "symfony/dependency-injection": "<5.4", 929 | "symfony/service-contracts": "<2.5" 930 | }, 931 | "provide": { 932 | "psr/event-dispatcher-implementation": "1.0", 933 | "symfony/event-dispatcher-implementation": "2.0|3.0" 934 | }, 935 | "require-dev": { 936 | "psr/log": "^1|^2|^3", 937 | "symfony/config": "^5.4|^6.0", 938 | "symfony/dependency-injection": "^5.4|^6.0", 939 | "symfony/error-handler": "^5.4|^6.0", 940 | "symfony/expression-language": "^5.4|^6.0", 941 | "symfony/http-foundation": "^5.4|^6.0", 942 | "symfony/service-contracts": "^2.5|^3", 943 | "symfony/stopwatch": "^5.4|^6.0" 944 | }, 945 | "type": "library", 946 | "autoload": { 947 | "psr-4": { 948 | "Symfony\\Component\\EventDispatcher\\": "" 949 | }, 950 | "exclude-from-classmap": [ 951 | "/Tests/" 952 | ] 953 | }, 954 | "notification-url": "https://packagist.org/downloads/", 955 | "license": [ 956 | "MIT" 957 | ], 958 | "authors": [ 959 | { 960 | "name": "Fabien Potencier", 961 | "email": "fabien@symfony.com" 962 | }, 963 | { 964 | "name": "Symfony Community", 965 | "homepage": "https://symfony.com/contributors" 966 | } 967 | ], 968 | "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", 969 | "homepage": "https://symfony.com", 970 | "support": { 971 | "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" 972 | }, 973 | "funding": [ 974 | { 975 | "url": "https://symfony.com/sponsor", 976 | "type": "custom" 977 | }, 978 | { 979 | "url": "https://github.com/fabpot", 980 | "type": "github" 981 | }, 982 | { 983 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 984 | "type": "tidelift" 985 | } 986 | ], 987 | "time": "2023-07-06T06:56:43+00:00" 988 | }, 989 | { 990 | "name": "symfony/event-dispatcher-contracts", 991 | "version": "v3.3.0", 992 | "source": { 993 | "type": "git", 994 | "url": "https://github.com/symfony/event-dispatcher-contracts.git", 995 | "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" 996 | }, 997 | "dist": { 998 | "type": "zip", 999 | "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", 1000 | "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", 1001 | "shasum": "" 1002 | }, 1003 | "require": { 1004 | "php": ">=8.1", 1005 | "psr/event-dispatcher": "^1" 1006 | }, 1007 | "type": "library", 1008 | "extra": { 1009 | "branch-alias": { 1010 | "dev-main": "3.4-dev" 1011 | }, 1012 | "thanks": { 1013 | "name": "symfony/contracts", 1014 | "url": "https://github.com/symfony/contracts" 1015 | } 1016 | }, 1017 | "autoload": { 1018 | "psr-4": { 1019 | "Symfony\\Contracts\\EventDispatcher\\": "" 1020 | } 1021 | }, 1022 | "notification-url": "https://packagist.org/downloads/", 1023 | "license": [ 1024 | "MIT" 1025 | ], 1026 | "authors": [ 1027 | { 1028 | "name": "Nicolas Grekas", 1029 | "email": "p@tchwork.com" 1030 | }, 1031 | { 1032 | "name": "Symfony Community", 1033 | "homepage": "https://symfony.com/contributors" 1034 | } 1035 | ], 1036 | "description": "Generic abstractions related to dispatching event", 1037 | "homepage": "https://symfony.com", 1038 | "keywords": [ 1039 | "abstractions", 1040 | "contracts", 1041 | "decoupling", 1042 | "interfaces", 1043 | "interoperability", 1044 | "standards" 1045 | ], 1046 | "support": { 1047 | "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" 1048 | }, 1049 | "funding": [ 1050 | { 1051 | "url": "https://symfony.com/sponsor", 1052 | "type": "custom" 1053 | }, 1054 | { 1055 | "url": "https://github.com/fabpot", 1056 | "type": "github" 1057 | }, 1058 | { 1059 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1060 | "type": "tidelift" 1061 | } 1062 | ], 1063 | "time": "2023-05-23T14:45:45+00:00" 1064 | }, 1065 | { 1066 | "name": "symfony/filesystem", 1067 | "version": "v6.3.1", 1068 | "source": { 1069 | "type": "git", 1070 | "url": "https://github.com/symfony/filesystem.git", 1071 | "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" 1072 | }, 1073 | "dist": { 1074 | "type": "zip", 1075 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", 1076 | "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", 1077 | "shasum": "" 1078 | }, 1079 | "require": { 1080 | "php": ">=8.1", 1081 | "symfony/polyfill-ctype": "~1.8", 1082 | "symfony/polyfill-mbstring": "~1.8" 1083 | }, 1084 | "type": "library", 1085 | "autoload": { 1086 | "psr-4": { 1087 | "Symfony\\Component\\Filesystem\\": "" 1088 | }, 1089 | "exclude-from-classmap": [ 1090 | "/Tests/" 1091 | ] 1092 | }, 1093 | "notification-url": "https://packagist.org/downloads/", 1094 | "license": [ 1095 | "MIT" 1096 | ], 1097 | "authors": [ 1098 | { 1099 | "name": "Fabien Potencier", 1100 | "email": "fabien@symfony.com" 1101 | }, 1102 | { 1103 | "name": "Symfony Community", 1104 | "homepage": "https://symfony.com/contributors" 1105 | } 1106 | ], 1107 | "description": "Provides basic utilities for the filesystem", 1108 | "homepage": "https://symfony.com", 1109 | "support": { 1110 | "source": "https://github.com/symfony/filesystem/tree/v6.3.1" 1111 | }, 1112 | "funding": [ 1113 | { 1114 | "url": "https://symfony.com/sponsor", 1115 | "type": "custom" 1116 | }, 1117 | { 1118 | "url": "https://github.com/fabpot", 1119 | "type": "github" 1120 | }, 1121 | { 1122 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1123 | "type": "tidelift" 1124 | } 1125 | ], 1126 | "time": "2023-06-01T08:30:39+00:00" 1127 | }, 1128 | { 1129 | "name": "symfony/finder", 1130 | "version": "v6.3.3", 1131 | "source": { 1132 | "type": "git", 1133 | "url": "https://github.com/symfony/finder.git", 1134 | "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" 1135 | }, 1136 | "dist": { 1137 | "type": "zip", 1138 | "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", 1139 | "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", 1140 | "shasum": "" 1141 | }, 1142 | "require": { 1143 | "php": ">=8.1" 1144 | }, 1145 | "require-dev": { 1146 | "symfony/filesystem": "^6.0" 1147 | }, 1148 | "type": "library", 1149 | "autoload": { 1150 | "psr-4": { 1151 | "Symfony\\Component\\Finder\\": "" 1152 | }, 1153 | "exclude-from-classmap": [ 1154 | "/Tests/" 1155 | ] 1156 | }, 1157 | "notification-url": "https://packagist.org/downloads/", 1158 | "license": [ 1159 | "MIT" 1160 | ], 1161 | "authors": [ 1162 | { 1163 | "name": "Fabien Potencier", 1164 | "email": "fabien@symfony.com" 1165 | }, 1166 | { 1167 | "name": "Symfony Community", 1168 | "homepage": "https://symfony.com/contributors" 1169 | } 1170 | ], 1171 | "description": "Finds files and directories via an intuitive fluent interface", 1172 | "homepage": "https://symfony.com", 1173 | "support": { 1174 | "source": "https://github.com/symfony/finder/tree/v6.3.3" 1175 | }, 1176 | "funding": [ 1177 | { 1178 | "url": "https://symfony.com/sponsor", 1179 | "type": "custom" 1180 | }, 1181 | { 1182 | "url": "https://github.com/fabpot", 1183 | "type": "github" 1184 | }, 1185 | { 1186 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1187 | "type": "tidelift" 1188 | } 1189 | ], 1190 | "time": "2023-07-31T08:31:44+00:00" 1191 | }, 1192 | { 1193 | "name": "symfony/options-resolver", 1194 | "version": "v6.3.0", 1195 | "source": { 1196 | "type": "git", 1197 | "url": "https://github.com/symfony/options-resolver.git", 1198 | "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" 1199 | }, 1200 | "dist": { 1201 | "type": "zip", 1202 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", 1203 | "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", 1204 | "shasum": "" 1205 | }, 1206 | "require": { 1207 | "php": ">=8.1", 1208 | "symfony/deprecation-contracts": "^2.5|^3" 1209 | }, 1210 | "type": "library", 1211 | "autoload": { 1212 | "psr-4": { 1213 | "Symfony\\Component\\OptionsResolver\\": "" 1214 | }, 1215 | "exclude-from-classmap": [ 1216 | "/Tests/" 1217 | ] 1218 | }, 1219 | "notification-url": "https://packagist.org/downloads/", 1220 | "license": [ 1221 | "MIT" 1222 | ], 1223 | "authors": [ 1224 | { 1225 | "name": "Fabien Potencier", 1226 | "email": "fabien@symfony.com" 1227 | }, 1228 | { 1229 | "name": "Symfony Community", 1230 | "homepage": "https://symfony.com/contributors" 1231 | } 1232 | ], 1233 | "description": "Provides an improved replacement for the array_replace PHP function", 1234 | "homepage": "https://symfony.com", 1235 | "keywords": [ 1236 | "config", 1237 | "configuration", 1238 | "options" 1239 | ], 1240 | "support": { 1241 | "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" 1242 | }, 1243 | "funding": [ 1244 | { 1245 | "url": "https://symfony.com/sponsor", 1246 | "type": "custom" 1247 | }, 1248 | { 1249 | "url": "https://github.com/fabpot", 1250 | "type": "github" 1251 | }, 1252 | { 1253 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1254 | "type": "tidelift" 1255 | } 1256 | ], 1257 | "time": "2023-05-12T14:21:09+00:00" 1258 | }, 1259 | { 1260 | "name": "symfony/polyfill-ctype", 1261 | "version": "v1.28.0", 1262 | "source": { 1263 | "type": "git", 1264 | "url": "https://github.com/symfony/polyfill-ctype.git", 1265 | "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" 1266 | }, 1267 | "dist": { 1268 | "type": "zip", 1269 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", 1270 | "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", 1271 | "shasum": "" 1272 | }, 1273 | "require": { 1274 | "php": ">=7.1" 1275 | }, 1276 | "provide": { 1277 | "ext-ctype": "*" 1278 | }, 1279 | "suggest": { 1280 | "ext-ctype": "For best performance" 1281 | }, 1282 | "type": "library", 1283 | "extra": { 1284 | "branch-alias": { 1285 | "dev-main": "1.28-dev" 1286 | }, 1287 | "thanks": { 1288 | "name": "symfony/polyfill", 1289 | "url": "https://github.com/symfony/polyfill" 1290 | } 1291 | }, 1292 | "autoload": { 1293 | "files": [ 1294 | "bootstrap.php" 1295 | ], 1296 | "psr-4": { 1297 | "Symfony\\Polyfill\\Ctype\\": "" 1298 | } 1299 | }, 1300 | "notification-url": "https://packagist.org/downloads/", 1301 | "license": [ 1302 | "MIT" 1303 | ], 1304 | "authors": [ 1305 | { 1306 | "name": "Gert de Pagter", 1307 | "email": "BackEndTea@gmail.com" 1308 | }, 1309 | { 1310 | "name": "Symfony Community", 1311 | "homepage": "https://symfony.com/contributors" 1312 | } 1313 | ], 1314 | "description": "Symfony polyfill for ctype functions", 1315 | "homepage": "https://symfony.com", 1316 | "keywords": [ 1317 | "compatibility", 1318 | "ctype", 1319 | "polyfill", 1320 | "portable" 1321 | ], 1322 | "support": { 1323 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" 1324 | }, 1325 | "funding": [ 1326 | { 1327 | "url": "https://symfony.com/sponsor", 1328 | "type": "custom" 1329 | }, 1330 | { 1331 | "url": "https://github.com/fabpot", 1332 | "type": "github" 1333 | }, 1334 | { 1335 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1336 | "type": "tidelift" 1337 | } 1338 | ], 1339 | "time": "2023-01-26T09:26:14+00:00" 1340 | }, 1341 | { 1342 | "name": "symfony/polyfill-intl-grapheme", 1343 | "version": "v1.28.0", 1344 | "source": { 1345 | "type": "git", 1346 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 1347 | "reference": "875e90aeea2777b6f135677f618529449334a612" 1348 | }, 1349 | "dist": { 1350 | "type": "zip", 1351 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", 1352 | "reference": "875e90aeea2777b6f135677f618529449334a612", 1353 | "shasum": "" 1354 | }, 1355 | "require": { 1356 | "php": ">=7.1" 1357 | }, 1358 | "suggest": { 1359 | "ext-intl": "For best performance" 1360 | }, 1361 | "type": "library", 1362 | "extra": { 1363 | "branch-alias": { 1364 | "dev-main": "1.28-dev" 1365 | }, 1366 | "thanks": { 1367 | "name": "symfony/polyfill", 1368 | "url": "https://github.com/symfony/polyfill" 1369 | } 1370 | }, 1371 | "autoload": { 1372 | "files": [ 1373 | "bootstrap.php" 1374 | ], 1375 | "psr-4": { 1376 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 1377 | } 1378 | }, 1379 | "notification-url": "https://packagist.org/downloads/", 1380 | "license": [ 1381 | "MIT" 1382 | ], 1383 | "authors": [ 1384 | { 1385 | "name": "Nicolas Grekas", 1386 | "email": "p@tchwork.com" 1387 | }, 1388 | { 1389 | "name": "Symfony Community", 1390 | "homepage": "https://symfony.com/contributors" 1391 | } 1392 | ], 1393 | "description": "Symfony polyfill for intl's grapheme_* functions", 1394 | "homepage": "https://symfony.com", 1395 | "keywords": [ 1396 | "compatibility", 1397 | "grapheme", 1398 | "intl", 1399 | "polyfill", 1400 | "portable", 1401 | "shim" 1402 | ], 1403 | "support": { 1404 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" 1405 | }, 1406 | "funding": [ 1407 | { 1408 | "url": "https://symfony.com/sponsor", 1409 | "type": "custom" 1410 | }, 1411 | { 1412 | "url": "https://github.com/fabpot", 1413 | "type": "github" 1414 | }, 1415 | { 1416 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1417 | "type": "tidelift" 1418 | } 1419 | ], 1420 | "time": "2023-01-26T09:26:14+00:00" 1421 | }, 1422 | { 1423 | "name": "symfony/polyfill-intl-normalizer", 1424 | "version": "v1.28.0", 1425 | "source": { 1426 | "type": "git", 1427 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 1428 | "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" 1429 | }, 1430 | "dist": { 1431 | "type": "zip", 1432 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", 1433 | "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", 1434 | "shasum": "" 1435 | }, 1436 | "require": { 1437 | "php": ">=7.1" 1438 | }, 1439 | "suggest": { 1440 | "ext-intl": "For best performance" 1441 | }, 1442 | "type": "library", 1443 | "extra": { 1444 | "branch-alias": { 1445 | "dev-main": "1.28-dev" 1446 | }, 1447 | "thanks": { 1448 | "name": "symfony/polyfill", 1449 | "url": "https://github.com/symfony/polyfill" 1450 | } 1451 | }, 1452 | "autoload": { 1453 | "files": [ 1454 | "bootstrap.php" 1455 | ], 1456 | "psr-4": { 1457 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 1458 | }, 1459 | "classmap": [ 1460 | "Resources/stubs" 1461 | ] 1462 | }, 1463 | "notification-url": "https://packagist.org/downloads/", 1464 | "license": [ 1465 | "MIT" 1466 | ], 1467 | "authors": [ 1468 | { 1469 | "name": "Nicolas Grekas", 1470 | "email": "p@tchwork.com" 1471 | }, 1472 | { 1473 | "name": "Symfony Community", 1474 | "homepage": "https://symfony.com/contributors" 1475 | } 1476 | ], 1477 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 1478 | "homepage": "https://symfony.com", 1479 | "keywords": [ 1480 | "compatibility", 1481 | "intl", 1482 | "normalizer", 1483 | "polyfill", 1484 | "portable", 1485 | "shim" 1486 | ], 1487 | "support": { 1488 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" 1489 | }, 1490 | "funding": [ 1491 | { 1492 | "url": "https://symfony.com/sponsor", 1493 | "type": "custom" 1494 | }, 1495 | { 1496 | "url": "https://github.com/fabpot", 1497 | "type": "github" 1498 | }, 1499 | { 1500 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1501 | "type": "tidelift" 1502 | } 1503 | ], 1504 | "time": "2023-01-26T09:26:14+00:00" 1505 | }, 1506 | { 1507 | "name": "symfony/polyfill-mbstring", 1508 | "version": "v1.28.0", 1509 | "source": { 1510 | "type": "git", 1511 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1512 | "reference": "42292d99c55abe617799667f454222c54c60e229" 1513 | }, 1514 | "dist": { 1515 | "type": "zip", 1516 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", 1517 | "reference": "42292d99c55abe617799667f454222c54c60e229", 1518 | "shasum": "" 1519 | }, 1520 | "require": { 1521 | "php": ">=7.1" 1522 | }, 1523 | "provide": { 1524 | "ext-mbstring": "*" 1525 | }, 1526 | "suggest": { 1527 | "ext-mbstring": "For best performance" 1528 | }, 1529 | "type": "library", 1530 | "extra": { 1531 | "branch-alias": { 1532 | "dev-main": "1.28-dev" 1533 | }, 1534 | "thanks": { 1535 | "name": "symfony/polyfill", 1536 | "url": "https://github.com/symfony/polyfill" 1537 | } 1538 | }, 1539 | "autoload": { 1540 | "files": [ 1541 | "bootstrap.php" 1542 | ], 1543 | "psr-4": { 1544 | "Symfony\\Polyfill\\Mbstring\\": "" 1545 | } 1546 | }, 1547 | "notification-url": "https://packagist.org/downloads/", 1548 | "license": [ 1549 | "MIT" 1550 | ], 1551 | "authors": [ 1552 | { 1553 | "name": "Nicolas Grekas", 1554 | "email": "p@tchwork.com" 1555 | }, 1556 | { 1557 | "name": "Symfony Community", 1558 | "homepage": "https://symfony.com/contributors" 1559 | } 1560 | ], 1561 | "description": "Symfony polyfill for the Mbstring extension", 1562 | "homepage": "https://symfony.com", 1563 | "keywords": [ 1564 | "compatibility", 1565 | "mbstring", 1566 | "polyfill", 1567 | "portable", 1568 | "shim" 1569 | ], 1570 | "support": { 1571 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" 1572 | }, 1573 | "funding": [ 1574 | { 1575 | "url": "https://symfony.com/sponsor", 1576 | "type": "custom" 1577 | }, 1578 | { 1579 | "url": "https://github.com/fabpot", 1580 | "type": "github" 1581 | }, 1582 | { 1583 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1584 | "type": "tidelift" 1585 | } 1586 | ], 1587 | "time": "2023-07-28T09:04:16+00:00" 1588 | }, 1589 | { 1590 | "name": "symfony/polyfill-php80", 1591 | "version": "v1.28.0", 1592 | "source": { 1593 | "type": "git", 1594 | "url": "https://github.com/symfony/polyfill-php80.git", 1595 | "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" 1596 | }, 1597 | "dist": { 1598 | "type": "zip", 1599 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", 1600 | "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", 1601 | "shasum": "" 1602 | }, 1603 | "require": { 1604 | "php": ">=7.1" 1605 | }, 1606 | "type": "library", 1607 | "extra": { 1608 | "branch-alias": { 1609 | "dev-main": "1.28-dev" 1610 | }, 1611 | "thanks": { 1612 | "name": "symfony/polyfill", 1613 | "url": "https://github.com/symfony/polyfill" 1614 | } 1615 | }, 1616 | "autoload": { 1617 | "files": [ 1618 | "bootstrap.php" 1619 | ], 1620 | "psr-4": { 1621 | "Symfony\\Polyfill\\Php80\\": "" 1622 | }, 1623 | "classmap": [ 1624 | "Resources/stubs" 1625 | ] 1626 | }, 1627 | "notification-url": "https://packagist.org/downloads/", 1628 | "license": [ 1629 | "MIT" 1630 | ], 1631 | "authors": [ 1632 | { 1633 | "name": "Ion Bazan", 1634 | "email": "ion.bazan@gmail.com" 1635 | }, 1636 | { 1637 | "name": "Nicolas Grekas", 1638 | "email": "p@tchwork.com" 1639 | }, 1640 | { 1641 | "name": "Symfony Community", 1642 | "homepage": "https://symfony.com/contributors" 1643 | } 1644 | ], 1645 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 1646 | "homepage": "https://symfony.com", 1647 | "keywords": [ 1648 | "compatibility", 1649 | "polyfill", 1650 | "portable", 1651 | "shim" 1652 | ], 1653 | "support": { 1654 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" 1655 | }, 1656 | "funding": [ 1657 | { 1658 | "url": "https://symfony.com/sponsor", 1659 | "type": "custom" 1660 | }, 1661 | { 1662 | "url": "https://github.com/fabpot", 1663 | "type": "github" 1664 | }, 1665 | { 1666 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1667 | "type": "tidelift" 1668 | } 1669 | ], 1670 | "time": "2023-01-26T09:26:14+00:00" 1671 | }, 1672 | { 1673 | "name": "symfony/polyfill-php81", 1674 | "version": "v1.28.0", 1675 | "source": { 1676 | "type": "git", 1677 | "url": "https://github.com/symfony/polyfill-php81.git", 1678 | "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" 1679 | }, 1680 | "dist": { 1681 | "type": "zip", 1682 | "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", 1683 | "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", 1684 | "shasum": "" 1685 | }, 1686 | "require": { 1687 | "php": ">=7.1" 1688 | }, 1689 | "type": "library", 1690 | "extra": { 1691 | "branch-alias": { 1692 | "dev-main": "1.28-dev" 1693 | }, 1694 | "thanks": { 1695 | "name": "symfony/polyfill", 1696 | "url": "https://github.com/symfony/polyfill" 1697 | } 1698 | }, 1699 | "autoload": { 1700 | "files": [ 1701 | "bootstrap.php" 1702 | ], 1703 | "psr-4": { 1704 | "Symfony\\Polyfill\\Php81\\": "" 1705 | }, 1706 | "classmap": [ 1707 | "Resources/stubs" 1708 | ] 1709 | }, 1710 | "notification-url": "https://packagist.org/downloads/", 1711 | "license": [ 1712 | "MIT" 1713 | ], 1714 | "authors": [ 1715 | { 1716 | "name": "Nicolas Grekas", 1717 | "email": "p@tchwork.com" 1718 | }, 1719 | { 1720 | "name": "Symfony Community", 1721 | "homepage": "https://symfony.com/contributors" 1722 | } 1723 | ], 1724 | "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", 1725 | "homepage": "https://symfony.com", 1726 | "keywords": [ 1727 | "compatibility", 1728 | "polyfill", 1729 | "portable", 1730 | "shim" 1731 | ], 1732 | "support": { 1733 | "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" 1734 | }, 1735 | "funding": [ 1736 | { 1737 | "url": "https://symfony.com/sponsor", 1738 | "type": "custom" 1739 | }, 1740 | { 1741 | "url": "https://github.com/fabpot", 1742 | "type": "github" 1743 | }, 1744 | { 1745 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1746 | "type": "tidelift" 1747 | } 1748 | ], 1749 | "time": "2023-01-26T09:26:14+00:00" 1750 | }, 1751 | { 1752 | "name": "symfony/process", 1753 | "version": "v6.3.4", 1754 | "source": { 1755 | "type": "git", 1756 | "url": "https://github.com/symfony/process.git", 1757 | "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" 1758 | }, 1759 | "dist": { 1760 | "type": "zip", 1761 | "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", 1762 | "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", 1763 | "shasum": "" 1764 | }, 1765 | "require": { 1766 | "php": ">=8.1" 1767 | }, 1768 | "type": "library", 1769 | "autoload": { 1770 | "psr-4": { 1771 | "Symfony\\Component\\Process\\": "" 1772 | }, 1773 | "exclude-from-classmap": [ 1774 | "/Tests/" 1775 | ] 1776 | }, 1777 | "notification-url": "https://packagist.org/downloads/", 1778 | "license": [ 1779 | "MIT" 1780 | ], 1781 | "authors": [ 1782 | { 1783 | "name": "Fabien Potencier", 1784 | "email": "fabien@symfony.com" 1785 | }, 1786 | { 1787 | "name": "Symfony Community", 1788 | "homepage": "https://symfony.com/contributors" 1789 | } 1790 | ], 1791 | "description": "Executes commands in sub-processes", 1792 | "homepage": "https://symfony.com", 1793 | "support": { 1794 | "source": "https://github.com/symfony/process/tree/v6.3.4" 1795 | }, 1796 | "funding": [ 1797 | { 1798 | "url": "https://symfony.com/sponsor", 1799 | "type": "custom" 1800 | }, 1801 | { 1802 | "url": "https://github.com/fabpot", 1803 | "type": "github" 1804 | }, 1805 | { 1806 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1807 | "type": "tidelift" 1808 | } 1809 | ], 1810 | "time": "2023-08-07T10:39:22+00:00" 1811 | }, 1812 | { 1813 | "name": "symfony/service-contracts", 1814 | "version": "v3.3.0", 1815 | "source": { 1816 | "type": "git", 1817 | "url": "https://github.com/symfony/service-contracts.git", 1818 | "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" 1819 | }, 1820 | "dist": { 1821 | "type": "zip", 1822 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", 1823 | "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", 1824 | "shasum": "" 1825 | }, 1826 | "require": { 1827 | "php": ">=8.1", 1828 | "psr/container": "^2.0" 1829 | }, 1830 | "conflict": { 1831 | "ext-psr": "<1.1|>=2" 1832 | }, 1833 | "type": "library", 1834 | "extra": { 1835 | "branch-alias": { 1836 | "dev-main": "3.4-dev" 1837 | }, 1838 | "thanks": { 1839 | "name": "symfony/contracts", 1840 | "url": "https://github.com/symfony/contracts" 1841 | } 1842 | }, 1843 | "autoload": { 1844 | "psr-4": { 1845 | "Symfony\\Contracts\\Service\\": "" 1846 | }, 1847 | "exclude-from-classmap": [ 1848 | "/Test/" 1849 | ] 1850 | }, 1851 | "notification-url": "https://packagist.org/downloads/", 1852 | "license": [ 1853 | "MIT" 1854 | ], 1855 | "authors": [ 1856 | { 1857 | "name": "Nicolas Grekas", 1858 | "email": "p@tchwork.com" 1859 | }, 1860 | { 1861 | "name": "Symfony Community", 1862 | "homepage": "https://symfony.com/contributors" 1863 | } 1864 | ], 1865 | "description": "Generic abstractions related to writing services", 1866 | "homepage": "https://symfony.com", 1867 | "keywords": [ 1868 | "abstractions", 1869 | "contracts", 1870 | "decoupling", 1871 | "interfaces", 1872 | "interoperability", 1873 | "standards" 1874 | ], 1875 | "support": { 1876 | "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" 1877 | }, 1878 | "funding": [ 1879 | { 1880 | "url": "https://symfony.com/sponsor", 1881 | "type": "custom" 1882 | }, 1883 | { 1884 | "url": "https://github.com/fabpot", 1885 | "type": "github" 1886 | }, 1887 | { 1888 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1889 | "type": "tidelift" 1890 | } 1891 | ], 1892 | "time": "2023-05-23T14:45:45+00:00" 1893 | }, 1894 | { 1895 | "name": "symfony/stopwatch", 1896 | "version": "v6.3.0", 1897 | "source": { 1898 | "type": "git", 1899 | "url": "https://github.com/symfony/stopwatch.git", 1900 | "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" 1901 | }, 1902 | "dist": { 1903 | "type": "zip", 1904 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", 1905 | "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", 1906 | "shasum": "" 1907 | }, 1908 | "require": { 1909 | "php": ">=8.1", 1910 | "symfony/service-contracts": "^2.5|^3" 1911 | }, 1912 | "type": "library", 1913 | "autoload": { 1914 | "psr-4": { 1915 | "Symfony\\Component\\Stopwatch\\": "" 1916 | }, 1917 | "exclude-from-classmap": [ 1918 | "/Tests/" 1919 | ] 1920 | }, 1921 | "notification-url": "https://packagist.org/downloads/", 1922 | "license": [ 1923 | "MIT" 1924 | ], 1925 | "authors": [ 1926 | { 1927 | "name": "Fabien Potencier", 1928 | "email": "fabien@symfony.com" 1929 | }, 1930 | { 1931 | "name": "Symfony Community", 1932 | "homepage": "https://symfony.com/contributors" 1933 | } 1934 | ], 1935 | "description": "Provides a way to profile code", 1936 | "homepage": "https://symfony.com", 1937 | "support": { 1938 | "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" 1939 | }, 1940 | "funding": [ 1941 | { 1942 | "url": "https://symfony.com/sponsor", 1943 | "type": "custom" 1944 | }, 1945 | { 1946 | "url": "https://github.com/fabpot", 1947 | "type": "github" 1948 | }, 1949 | { 1950 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1951 | "type": "tidelift" 1952 | } 1953 | ], 1954 | "time": "2023-02-16T10:14:28+00:00" 1955 | }, 1956 | { 1957 | "name": "symfony/string", 1958 | "version": "v6.3.2", 1959 | "source": { 1960 | "type": "git", 1961 | "url": "https://github.com/symfony/string.git", 1962 | "reference": "53d1a83225002635bca3482fcbf963001313fb68" 1963 | }, 1964 | "dist": { 1965 | "type": "zip", 1966 | "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", 1967 | "reference": "53d1a83225002635bca3482fcbf963001313fb68", 1968 | "shasum": "" 1969 | }, 1970 | "require": { 1971 | "php": ">=8.1", 1972 | "symfony/polyfill-ctype": "~1.8", 1973 | "symfony/polyfill-intl-grapheme": "~1.0", 1974 | "symfony/polyfill-intl-normalizer": "~1.0", 1975 | "symfony/polyfill-mbstring": "~1.0" 1976 | }, 1977 | "conflict": { 1978 | "symfony/translation-contracts": "<2.5" 1979 | }, 1980 | "require-dev": { 1981 | "symfony/error-handler": "^5.4|^6.0", 1982 | "symfony/http-client": "^5.4|^6.0", 1983 | "symfony/intl": "^6.2", 1984 | "symfony/translation-contracts": "^2.5|^3.0", 1985 | "symfony/var-exporter": "^5.4|^6.0" 1986 | }, 1987 | "type": "library", 1988 | "autoload": { 1989 | "files": [ 1990 | "Resources/functions.php" 1991 | ], 1992 | "psr-4": { 1993 | "Symfony\\Component\\String\\": "" 1994 | }, 1995 | "exclude-from-classmap": [ 1996 | "/Tests/" 1997 | ] 1998 | }, 1999 | "notification-url": "https://packagist.org/downloads/", 2000 | "license": [ 2001 | "MIT" 2002 | ], 2003 | "authors": [ 2004 | { 2005 | "name": "Nicolas Grekas", 2006 | "email": "p@tchwork.com" 2007 | }, 2008 | { 2009 | "name": "Symfony Community", 2010 | "homepage": "https://symfony.com/contributors" 2011 | } 2012 | ], 2013 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 2014 | "homepage": "https://symfony.com", 2015 | "keywords": [ 2016 | "grapheme", 2017 | "i18n", 2018 | "string", 2019 | "unicode", 2020 | "utf-8", 2021 | "utf8" 2022 | ], 2023 | "support": { 2024 | "source": "https://github.com/symfony/string/tree/v6.3.2" 2025 | }, 2026 | "funding": [ 2027 | { 2028 | "url": "https://symfony.com/sponsor", 2029 | "type": "custom" 2030 | }, 2031 | { 2032 | "url": "https://github.com/fabpot", 2033 | "type": "github" 2034 | }, 2035 | { 2036 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2037 | "type": "tidelift" 2038 | } 2039 | ], 2040 | "time": "2023-07-05T08:41:27+00:00" 2041 | }, 2042 | { 2043 | "name": "symfony/yaml", 2044 | "version": "v6.3.3", 2045 | "source": { 2046 | "type": "git", 2047 | "url": "https://github.com/symfony/yaml.git", 2048 | "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" 2049 | }, 2050 | "dist": { 2051 | "type": "zip", 2052 | "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", 2053 | "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", 2054 | "shasum": "" 2055 | }, 2056 | "require": { 2057 | "php": ">=8.1", 2058 | "symfony/deprecation-contracts": "^2.5|^3", 2059 | "symfony/polyfill-ctype": "^1.8" 2060 | }, 2061 | "conflict": { 2062 | "symfony/console": "<5.4" 2063 | }, 2064 | "require-dev": { 2065 | "symfony/console": "^5.4|^6.0" 2066 | }, 2067 | "bin": [ 2068 | "Resources/bin/yaml-lint" 2069 | ], 2070 | "type": "library", 2071 | "autoload": { 2072 | "psr-4": { 2073 | "Symfony\\Component\\Yaml\\": "" 2074 | }, 2075 | "exclude-from-classmap": [ 2076 | "/Tests/" 2077 | ] 2078 | }, 2079 | "notification-url": "https://packagist.org/downloads/", 2080 | "license": [ 2081 | "MIT" 2082 | ], 2083 | "authors": [ 2084 | { 2085 | "name": "Fabien Potencier", 2086 | "email": "fabien@symfony.com" 2087 | }, 2088 | { 2089 | "name": "Symfony Community", 2090 | "homepage": "https://symfony.com/contributors" 2091 | } 2092 | ], 2093 | "description": "Loads and dumps YAML files", 2094 | "homepage": "https://symfony.com", 2095 | "support": { 2096 | "source": "https://github.com/symfony/yaml/tree/v6.3.3" 2097 | }, 2098 | "funding": [ 2099 | { 2100 | "url": "https://symfony.com/sponsor", 2101 | "type": "custom" 2102 | }, 2103 | { 2104 | "url": "https://github.com/fabpot", 2105 | "type": "github" 2106 | }, 2107 | { 2108 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2109 | "type": "tidelift" 2110 | } 2111 | ], 2112 | "time": "2023-07-31T07:08:24+00:00" 2113 | } 2114 | ], 2115 | "aliases": [], 2116 | "minimum-stability": "stable", 2117 | "stability-flags": [], 2118 | "prefer-stable": false, 2119 | "prefer-lowest": false, 2120 | "platform": [], 2121 | "platform-dev": [], 2122 | "plugin-api-version": "2.2.0" 2123 | } 2124 | --------------------------------------------------------------------------------