From 1895d3cb27e1bd077c339d6337c470f363d40c67 Mon Sep 17 00:00:00 2001 From: Simon Gilli <25326036+gilbertsoft@users.noreply.github.com> Date: Tue, 9 Aug 2022 15:22:02 +0200 Subject: [PATCH] Separated Composer packages --- .gitignore | 1 + composer.json | 5 + composer.lock | 3 +- config/packages/framework.yaml | 3 + config/packages/twig.yaml | 2 + config/services.yaml | 18 +- migrations/Version20220818183005.php | 31 + .../composer.json | 21 + .../public/images/preview.png | Bin 0 -> 74411 bytes .../templates/skeletons/10.4}/.editorconfig | 0 .../templates/skeletons/10.4}/Build/.htaccess | 0 .../skeletons/10.4}/Build/Gruntfile.js.twig | 0 .../skeletons/10.4}/Build/package.json.twig | 2 +- .../skeletons/10.4}/Classes/.htaccess | 0 .../10.4/Classes/Controller/.gitignore | 0 .../10.4/Classes/Domain/Model/.gitignore | 0 .../10.4/Classes/Domain/Repository/.gitignore | 0 .../10.4/Classes/ViewHelpers/.gitignore | 0 .../skeletons/10.4}/Configuration/.htaccess | 0 .../10.4}/Configuration/RTE/Default.yaml.twig | 0 .../TCA/Overrides/pages.php.twig | 4 +- .../TCA/Overrides/sys_template.php.twig | 4 +- .../TsConfig/Page/All.tsconfig.twig | 0 .../WebLayout/BackendLayouts.tsconfig.twig | 0 .../BackendLayouts/example.tsconfig.twig | 0 .../TsConfig/Page/RTE.tsconfig.twig | 0 .../TsConfig/Page/TCEFORM.tsconfig.twig | 0 .../TsConfig/Page/TCEMAIN.tsconfig.twig | 0 .../TypoScript/constants.typoscript.twig | 0 .../TypoScript/setup.typoscript.twig | 0 .../templates/skeletons/10.4}/README.md.twig | 0 .../10.4}/Resources/Private/.htaccess | 0 .../Private/Language/locallang.xlf.twig | 0 .../Private/Language/locallang_be.xlf.twig | 0 .../Private/Language/locallang_db.xlf.twig | 0 .../Layouts/ContentElements/.gitignore | 0 .../Resources/Private/Layouts/Page/.gitignore | 0 .../Partials/ContentElements/.gitignore | 0 .../Private/Partials/Page/.gitignore | 0 .../Templates/ContentElements/.gitignore | 0 .../Private/Templates/Page/Example.html.twig | 0 .../10.4/Resources/Public/Css/.gitignore | 0 .../10.4/Resources/Public/Fonts/.gitignore | 0 .../Public/Icons/BackendLayouts/example.svg | 0 .../Resources/Public/Icons/Extension.svg | 0 .../10.4}/Resources/Public/Icons/favicon.ico | Bin .../Resources/Public/Icons/logo-inverted.svg | 0 .../10.4}/Resources/Public/Icons/logo.svg | 0 .../Resources/Public/Images/logo-inverted.svg | 0 .../10.4}/Resources/Public/Images/logo.svg | 0 .../Public/JavaScript/Dist/scripts.js.twig | 0 .../Public/JavaScript/Src/main.js.twig | 0 .../Public/Scss/Theme/_variables.scss | 0 .../Public/Scss/Theme/theme.scss.twig | 9 + .../skeletons/10.4}/composer.json.twig | 6 +- .../10.4}/ext_conf_template.txt.twig | 0 .../skeletons/10.4}/ext_emconf.php.twig | 4 +- .../skeletons/10.4}/ext_localconf.php.twig | 2 +- .../skeletons/10.4/ext_tables.php.twig | 2 + .../skeletons/10.4}/ext_tables.sql.twig | 0 .../10.4}/ext_tables_static+adt.sql.twig | 0 .../templates/skeletons/11.5}/.editorconfig | 0 .../templates/skeletons/11.5}/Build/.htaccess | 0 .../skeletons/11.5/Build/Gruntfile.js.twig | 72 +++ .../skeletons/11.5/Build/package.json.twig | 18 + .../skeletons/11.5}/Classes/.htaccess | 0 .../11.5/Classes/Controller/.gitignore | 0 .../11.5/Classes/Domain/Model/.gitignore | 0 .../11.5/Classes/Domain/Repository/.gitignore | 0 .../11.5/Classes/ViewHelpers/.gitignore | 0 .../skeletons/11.5}/Configuration/.htaccess | 0 .../11.5/Configuration/RTE/Default.yaml.twig | 9 + .../TCA/Overrides/pages.php.twig | 4 +- .../TCA/Overrides/sys_template.php.twig | 4 +- .../TsConfig/Page/All.tsconfig.twig | 0 .../WebLayout/BackendLayouts.tsconfig.twig | 0 .../BackendLayouts/example.tsconfig.twig | 29 + .../TsConfig/Page/RTE.tsconfig.twig | 0 .../TsConfig/Page/TCEFORM.tsconfig.twig | 0 .../TsConfig/Page/TCEMAIN.tsconfig.twig | 0 .../TypoScript/constants.typoscript.twig | 60 ++ .../TypoScript/setup.typoscript.twig | 30 + .../templates/skeletons/11.5}/README.md.twig | 0 .../11.5}/Resources/Private/.htaccess | 0 .../Private/Language/locallang.xlf.twig | 0 .../Private/Language/locallang_be.xlf.twig | 17 + .../Private/Language/locallang_db.xlf.twig | 0 .../Layouts/ContentElements/.gitignore | 0 .../Resources/Private/Layouts/Page/.gitignore | 0 .../Partials/ContentElements/.gitignore | 0 .../Private/Partials/Page/.gitignore | 0 .../Templates/ContentElements/.gitignore | 0 .../Private/Templates/Page/Example.html.twig | 22 + .../11.5/Resources/Public/Css/.gitignore | 0 .../11.5/Resources/Public/Fonts/.gitignore | 0 .../Public/Icons/BackendLayouts/example.svg | 1 + .../Resources/Public/Icons/Extension.svg | 0 .../11.5}/Resources/Public/Icons/favicon.ico | Bin .../Resources/Public/Icons/logo-inverted.svg | 1 + .../11.5/Resources/Public/Icons/logo.svg | 1 + .../Resources/Public/Images/logo-inverted.svg | 1 + .../11.5/Resources/Public/Images/logo.svg | 1 + .../Public/JavaScript/Dist/scripts.js.twig | 0 .../Public/JavaScript/Src/main.js.twig | 0 .../Public/Scss/Theme/_variables.scss | 3 + .../Public/Scss/Theme/theme.scss.twig | 9 + .../skeletons/11.5/composer.json.twig | 21 + .../11.5}/ext_conf_template.txt.twig | 0 .../skeletons/11.5/ext_emconf.php.twig | 30 + .../skeletons/11.5}/ext_localconf.php.twig | 2 +- .../skeletons/11.5/ext_tables.php.twig | 2 + .../skeletons/11.5}/ext_tables.sql.twig | 0 .../11.5}/ext_tables_static+adt.sql.twig | 0 .../templates/skeletons/8.7/.editorconfig | 70 ++ .../templates/skeletons/8.7/Build/.htaccess | 2 + .../skeletons/8.7/Build/Gruntfile.js.twig | 72 +++ .../skeletons/8.7/Build/package.json.twig | 18 + .../templates/skeletons/8.7/Classes/.htaccess | 2 + .../8.7/Classes/Controller/.gitignore | 0 .../8.7/Classes/Domain/Model/.gitignore | 0 .../8.7/Classes/Domain/Repository/.gitignore | 0 .../8.7/Classes/ViewHelpers/.gitignore | 0 .../skeletons/8.7/Configuration/.htaccess | 2 + .../8.7/Configuration/RTE/Default.yaml.twig | 9 + .../TCA/Overrides/pages.php.twig | 19 + .../TCA/Overrides/sys_template.php.twig | 19 + .../TsConfig/Page/All.tsconfig.twig | 7 + .../WebLayout/BackendLayouts.tsconfig.twig | 4 + .../BackendLayouts/example.tsconfig.twig | 29 + .../TsConfig/Page/RTE.tsconfig.twig | 8 + .../TsConfig/Page/TCEFORM.tsconfig.twig | 11 + .../TsConfig/Page/TCEMAIN.tsconfig.twig | 6 + .../TypoScript/constants.typoscript.twig | 60 ++ .../TypoScript/setup.typoscript.twig | 30 + .../templates/skeletons/8.7/README.md.twig | 4 + .../skeletons/8.7/Resources/Private/.htaccess | 2 + .../Private/Language/locallang.xlf.twig | 11 + .../Private/Language/locallang_be.xlf.twig | 17 + .../Private/Language/locallang_db.xlf.twig | 11 + .../Layouts/ContentElements/.gitignore | 0 .../Resources/Private/Layouts/Page/.gitignore | 0 .../Partials/ContentElements/.gitignore | 0 .../Private/Partials/Page/.gitignore | 0 .../Templates/ContentElements/.gitignore | 0 .../Private/Templates/Page/Example.html.twig | 22 + .../8.7/Resources/Public/Css/.gitignore | 0 .../8.7/Resources/Public/Fonts/.gitignore | 0 .../Public/Icons/BackendLayouts/example.svg | 1 + .../8.7/Resources/Public/Icons/Extension.svg | 3 + .../8.7/Resources/Public/Icons/favicon.ico | Bin 0 -> 1150 bytes .../Resources/Public/Icons/logo-inverted.svg | 1 + .../8.7/Resources/Public/Icons/logo.svg | 1 + .../Resources/Public/Images/logo-inverted.svg | 1 + .../8.7/Resources/Public/Images/logo.svg | 1 + .../Public/JavaScript/Dist/scripts.js.twig | 6 + .../Public/JavaScript/Src/main.js.twig | 1 + .../Public/Scss/Theme/_variables.scss | 3 + .../Public/Scss/Theme/theme.scss.twig | 9 + .../skeletons/8.7/composer.json.twig | 21 + .../skeletons/8.7/ext_conf_template.txt.twig | 3 + .../skeletons/8.7/ext_emconf.php.twig | 30 + .../skeletons/8.7/ext_localconf.php.twig | 12 + .../skeletons/8.7/ext_tables.php.twig | 2 + .../skeletons/8.7/ext_tables.sql.twig | 3 + .../8.7/ext_tables_static+adt.sql.twig | 3 + .../templates/skeletons/9.5/.editorconfig | 70 ++ .../templates/skeletons/9.5/Build/.htaccess | 2 + .../skeletons/9.5/Build/Gruntfile.js.twig | 72 +++ .../skeletons/9.5/Build/package.json.twig | 18 + .../templates/skeletons/9.5/Classes/.htaccess | 2 + .../9.5/Classes/Controller/.gitignore | 0 .../9.5/Classes/Domain/Model/.gitignore | 0 .../9.5/Classes/Domain/Repository/.gitignore | 0 .../9.5/Classes/ViewHelpers/.gitignore | 0 .../skeletons/9.5/Configuration/.htaccess | 2 + .../9.5/Configuration/RTE/Default.yaml.twig | 9 + .../TCA/Overrides/pages.php.twig | 19 + .../TCA/Overrides/sys_template.php.twig | 19 + .../TsConfig/Page/All.tsconfig.twig | 7 + .../WebLayout/BackendLayouts.tsconfig.twig | 4 + .../BackendLayouts/example.tsconfig.twig | 29 + .../TsConfig/Page/RTE.tsconfig.twig | 8 + .../TsConfig/Page/TCEFORM.tsconfig.twig | 11 + .../TsConfig/Page/TCEMAIN.tsconfig.twig | 6 + .../TypoScript/constants.typoscript.twig | 60 ++ .../TypoScript/setup.typoscript.twig | 30 + .../templates/skeletons/9.5/README.md.twig | 4 + .../skeletons/9.5/Resources/Private/.htaccess | 2 + .../Private/Language/locallang.xlf.twig | 11 + .../Private/Language/locallang_be.xlf.twig | 17 + .../Private/Language/locallang_db.xlf.twig | 11 + .../Layouts/ContentElements/.gitignore | 0 .../Resources/Private/Layouts/Page/.gitignore | 0 .../Partials/ContentElements/.gitignore | 0 .../Private/Partials/Page/.gitignore | 0 .../Templates/ContentElements/.gitignore | 0 .../Private/Templates/Page/Example.html.twig | 22 + .../9.5/Resources/Public/Css/.gitignore | 0 .../9.5/Resources/Public/Fonts/.gitignore | 0 .../Public/Icons/BackendLayouts/example.svg | 1 + .../9.5/Resources/Public/Icons/Extension.svg | 3 + .../9.5/Resources/Public/Icons/favicon.ico | Bin 0 -> 1150 bytes .../Resources/Public/Icons/logo-inverted.svg | 1 + .../9.5/Resources/Public/Icons/logo.svg | 1 + .../Resources/Public/Images/logo-inverted.svg | 1 + .../9.5/Resources/Public/Images/logo.svg | 1 + .../Public/JavaScript/Dist/scripts.js.twig | 6 + .../Public/JavaScript/Src/main.js.twig | 1 + .../Public/Scss/Theme/_variables.scss | 3 + .../Public/Scss/Theme/theme.scss.twig | 9 + .../skeletons/9.5/composer.json.twig | 21 + .../skeletons/9.5/ext_conf_template.txt.twig | 3 + .../skeletons/9.5/ext_emconf.php.twig | 30 + .../skeletons/9.5/ext_localconf.php.twig | 12 + .../skeletons/9.5/ext_tables.php.twig | 2 + .../skeletons/9.5/ext_tables.sql.twig | 3 + .../9.5/ext_tables_static+adt.sql.twig | 3 + .../composer.json | 18 + .../public/images/preview.png | Bin 0 -> 74411 bytes .../templates/skeletons/10.4/.editorconfig | 70 ++ .../templates/skeletons/10.4/Build/.htaccess | 2 + .../skeletons/10.4}/Build/Gruntfile.js.twig | 0 .../skeletons/10.4}/Build/package.json.twig | 2 +- .../skeletons/10.4/Classes/.htaccess | 2 + .../10.4/Classes/Controller/.gitignore | 0 .../10.4/Classes/Domain/Model/.gitignore | 0 .../10.4/Classes/Domain/Repository/.gitignore | 0 .../10.4/Classes/ViewHelpers/.gitignore | 0 .../skeletons/10.4/Configuration/.htaccess | 2 + .../10.4}/Configuration/RTE/Default.yaml.twig | 0 .../TCA/Overrides/pages.php.twig | 19 + .../TCA/Overrides/sys_template.php.twig | 19 + .../TsConfig/Page/All.tsconfig.twig | 7 + .../WebLayout/BackendLayouts.tsconfig.twig | 4 + .../BackendLayouts/default.tsconfig.twig | 0 .../TsConfig/Page/RTE.tsconfig.twig | 8 + .../TsConfig/Page/TCEFORM.tsconfig.twig | 11 + .../TsConfig/Page/TCEMAIN.tsconfig.twig | 6 + .../Helper/DynamicContent.typoscript.twig | 0 .../TypoScript/constants.typoscript.twig | 2 +- .../TypoScript/setup.typoscript.twig | 2 +- .../templates/skeletons/10.4/README.md.twig | 4 + .../10.4/Resources/Private/.htaccess | 2 + .../Private/Language/locallang.xlf.twig | 11 + .../Private/Language/locallang_be.xlf.twig | 0 .../Private/Language/locallang_db.xlf.twig | 11 + .../Layouts/ContentElements/.gitignore | 0 .../Private/Layouts/Page/Default.html.twig | 0 .../Partials/ContentElements/.gitignore | 0 .../Private/Partials/Page/.gitignore | 0 .../Templates/ContentElements/.gitignore | 0 .../Private/Templates/Page/Default.html.twig | 0 .../10.4/Resources/Public/Css/layout.css | 0 .../10.4/Resources/Public/Css/layout.min.css | 0 .../10.4}/Resources/Public/Css/rte.css.twig | 0 .../10.4/Resources/Public/Fonts/.gitignore | 0 .../10.4/Resources/Public/Icons/Extension.svg | 3 + .../10.4/Resources/Public/Icons/favicon.ico | Bin 0 -> 1150 bytes .../Public/Images/BackendLayouts/default.png | Bin .../Public/JavaScript/Dist/scripts.js.twig | 6 + .../Public/JavaScript/Src/main.js.twig | 1 + .../Resources/Public/Scss/layout.scss.twig | 0 .../Resources/Public/Scss/variables.scss.twig | 0 .../skeletons/10.4/composer.json.twig | 23 + .../skeletons/10.4/ext_conf_template.txt.twig | 3 + .../skeletons/10.4/ext_emconf.php.twig | 32 + .../skeletons/10.4/ext_localconf.php.twig | 12 + .../skeletons/10.4/ext_tables.php.twig | 2 + .../skeletons/10.4/ext_tables.sql.twig | 3 + .../10.4/ext_tables_static+adt.sql.twig | 3 + .../templates/skeletons/11.5/.editorconfig | 70 ++ .../templates/skeletons/11.5/Build/.htaccess | 2 + .../skeletons/11.5/Build/Gruntfile.js.twig | 124 ++++ .../skeletons/11.5/Build/package.json.twig | 28 + .../skeletons/11.5/Classes/.htaccess | 2 + .../11.5/Classes/Controller/.gitignore | 0 .../11.5/Classes/Domain/Model/.gitignore | 0 .../11.5/Classes/Domain/Repository/.gitignore | 0 .../11.5/Classes/ViewHelpers/.gitignore | 0 .../skeletons/11.5/Configuration/.htaccess | 2 + .../11.5/Configuration/RTE/Default.yaml.twig | 42 ++ .../TCA/Overrides/pages.php.twig | 19 + .../TCA/Overrides/sys_template.php.twig | 19 + .../TsConfig/Page/All.tsconfig.twig | 7 + .../WebLayout/BackendLayouts.tsconfig.twig | 4 + .../BackendLayouts/default.tsconfig.twig | 29 + .../TsConfig/Page/RTE.tsconfig.twig | 8 + .../TsConfig/Page/TCEFORM.tsconfig.twig | 11 + .../TsConfig/Page/TCEMAIN.tsconfig.twig | 6 + .../Helper/DynamicContent.typoscript.twig | 64 ++ .../TypoScript/constants.typoscript.twig | 56 ++ .../TypoScript/setup.typoscript.twig | 203 ++++++ .../templates/skeletons/11.5/README.md.twig | 4 + .../11.5/Resources/Private/.htaccess | 2 + .../Private/Language/locallang.xlf.twig | 11 + .../Private/Language/locallang_be.xlf.twig | 17 + .../Private/Language/locallang_db.xlf.twig | 11 + .../Layouts/ContentElements/.gitignore | 0 .../Private/Layouts/Page/Default.html.twig | 21 + .../Partials/ContentElements/.gitignore | 0 .../Private/Partials/Page/.gitignore | 0 .../Templates/ContentElements/.gitignore | 0 .../Private/Templates/Page/Default.html.twig | 19 + .../11.5/Resources/Public/Css/layout.css | 0 .../11.5/Resources/Public/Css/layout.min.css | 0 .../11.5/Resources/Public/Css/rte.css.twig | 3 + .../11.5/Resources/Public/Fonts/.gitignore | 0 .../11.5/Resources/Public/Icons/Extension.svg | 3 + .../11.5/Resources/Public/Icons/favicon.ico | Bin 0 -> 1150 bytes .../Public/Images/BackendLayouts/default.png | Bin 0 -> 182 bytes .../Public/JavaScript/Dist/scripts.js.twig | 6 + .../Public/JavaScript/Src/main.js.twig | 1 + .../Resources/Public/Scss/layout.scss.twig | 5 + .../Resources/Public/Scss/variables.scss.twig | 1 + .../skeletons/11.5/composer.json.twig | 23 + .../skeletons/11.5/ext_conf_template.txt.twig | 3 + .../skeletons/11.5/ext_emconf.php.twig | 32 + .../skeletons/11.5/ext_localconf.php.twig | 12 + .../skeletons/11.5/ext_tables.php.twig | 2 + .../skeletons/11.5/ext_tables.sql.twig | 3 + .../11.5/ext_tables_static+adt.sql.twig | 3 + .../templates/skeletons/8.7/.editorconfig | 70 ++ .../templates/skeletons/8.7/Build/.htaccess | 2 + .../skeletons/8.7/Build/Gruntfile.js.twig | 124 ++++ .../skeletons/8.7/Build/package.json.twig | 28 + .../templates/skeletons/8.7/Classes/.htaccess | 2 + .../8.7/Classes/Controller/.gitignore | 0 .../8.7/Classes/Domain/Model/.gitignore | 0 .../8.7/Classes/Domain/Repository/.gitignore | 0 .../8.7/Classes/ViewHelpers/.gitignore | 0 .../skeletons/8.7/Configuration/.htaccess | 2 + .../8.7/Configuration/RTE/Default.yaml.twig | 42 ++ .../TCA/Overrides/pages.php.twig | 19 + .../TCA/Overrides/sys_template.php.twig | 19 + .../TsConfig/Page/All.tsconfig.twig | 7 + .../WebLayout/BackendLayouts.tsconfig.twig | 4 + .../BackendLayouts/default.tsconfig.twig | 29 + .../TsConfig/Page/RTE.tsconfig.twig | 8 + .../TsConfig/Page/TCEFORM.tsconfig.twig | 11 + .../TsConfig/Page/TCEMAIN.tsconfig.twig | 6 + .../Helper/DynamicContent.typoscript.twig | 64 ++ .../TypoScript/constants.typoscript.twig | 56 ++ .../TypoScript/setup.typoscript.twig | 203 ++++++ .../templates/skeletons/8.7/README.md.twig | 4 + .../skeletons/8.7/Resources/Private/.htaccess | 2 + .../Private/Language/locallang.xlf.twig | 11 + .../Private/Language/locallang_be.xlf.twig | 17 + .../Private/Language/locallang_db.xlf.twig | 11 + .../Layouts/ContentElements/.gitignore | 0 .../Private/Layouts/Page/Default.html.twig | 21 + .../Partials/ContentElements/.gitignore | 0 .../Private/Partials/Page/.gitignore | 0 .../Templates/ContentElements/.gitignore | 0 .../Private/Templates/Page/Default.html.twig | 19 + .../8.7/Resources/Public/Css/layout.css | 0 .../8.7/Resources/Public/Css/layout.min.css | 0 .../8.7/Resources/Public/Css/rte.css.twig | 3 + .../8.7/Resources/Public/Fonts/.gitignore | 0 .../8.7/Resources/Public/Icons/Extension.svg | 3 + .../8.7/Resources/Public/Icons/favicon.ico | Bin 0 -> 1150 bytes .../Public/Images/BackendLayouts/default.png | Bin 0 -> 182 bytes .../Public/JavaScript/Dist/scripts.js.twig | 6 + .../Public/JavaScript/Src/main.js.twig | 1 + .../Resources/Public/Scss/layout.scss.twig | 5 + .../Resources/Public/Scss/variables.scss.twig | 1 + .../skeletons/8.7/composer.json.twig | 23 + .../skeletons/8.7/ext_conf_template.txt.twig | 3 + .../skeletons/8.7/ext_emconf.php.twig | 32 + .../skeletons/8.7/ext_localconf.php.twig | 12 + .../skeletons/8.7/ext_tables.php.twig | 2 + .../skeletons/8.7/ext_tables.sql.twig | 3 + .../8.7/ext_tables_static+adt.sql.twig | 3 + .../templates/skeletons/9.5/.editorconfig | 70 ++ .../templates/skeletons/9.5/Build/.htaccess | 2 + .../skeletons/9.5/Build/Gruntfile.js.twig | 124 ++++ .../skeletons/9.5/Build/package.json.twig | 28 + .../templates/skeletons/9.5/Classes/.htaccess | 2 + .../9.5/Classes/Controller/.gitignore | 0 .../9.5/Classes/Domain/Model/.gitignore | 0 .../9.5/Classes/Domain/Repository/.gitignore | 0 .../9.5/Classes/ViewHelpers/.gitignore | 0 .../skeletons/9.5/Configuration/.htaccess | 2 + .../9.5/Configuration/RTE/Default.yaml.twig | 42 ++ .../TCA/Overrides/pages.php.twig | 19 + .../TCA/Overrides/sys_template.php.twig | 19 + .../TsConfig/Page/All.tsconfig.twig | 7 + .../WebLayout/BackendLayouts.tsconfig.twig | 4 + .../BackendLayouts/default.tsconfig.twig | 29 + .../TsConfig/Page/RTE.tsconfig.twig | 8 + .../TsConfig/Page/TCEFORM.tsconfig.twig | 11 + .../TsConfig/Page/TCEMAIN.tsconfig.twig | 6 + .../Helper/DynamicContent.typoscript.twig | 64 ++ .../TypoScript/constants.typoscript.twig | 56 ++ .../TypoScript/setup.typoscript.twig | 203 ++++++ .../templates/skeletons/9.5/README.md.twig | 4 + .../skeletons/9.5/Resources/Private/.htaccess | 2 + .../Private/Language/locallang.xlf.twig | 11 + .../Private/Language/locallang_be.xlf.twig | 17 + .../Private/Language/locallang_db.xlf.twig | 11 + .../Layouts/ContentElements/.gitignore | 0 .../Private/Layouts/Page/Default.html.twig | 21 + .../Partials/ContentElements/.gitignore | 0 .../Private/Partials/Page/.gitignore | 0 .../Templates/ContentElements/.gitignore | 0 .../Private/Templates/Page/Default.html.twig | 19 + .../9.5/Resources/Public/Css/layout.css | 0 .../9.5/Resources/Public/Css/layout.min.css | 0 .../9.5/Resources/Public/Css/rte.css.twig | 3 + .../9.5/Resources/Public/Fonts/.gitignore | 0 .../9.5/Resources/Public/Icons/Extension.svg | 3 + .../9.5/Resources/Public/Icons/favicon.ico | Bin 0 -> 1150 bytes .../Public/Images/BackendLayouts/default.png | Bin 0 -> 182 bytes .../Public/JavaScript/Dist/scripts.js.twig | 6 + .../Public/JavaScript/Src/main.js.twig | 1 + .../Resources/Public/Scss/layout.scss.twig | 5 + .../Resources/Public/Scss/variables.scss.twig | 1 + .../skeletons/9.5/composer.json.twig | 23 + .../skeletons/9.5/ext_conf_template.txt.twig | 3 + .../skeletons/9.5/ext_emconf.php.twig | 32 + .../skeletons/9.5/ext_localconf.php.twig | 12 + .../skeletons/9.5/ext_tables.php.twig | 2 + .../skeletons/9.5/ext_tables.sql.twig | 3 + .../9.5/ext_tables_static+adt.sql.twig | 3 + .../Classes/Controller/.gitkeep | 1 - .../bootstrap_package/Classes/Domain/.gitkeep | 1 - .../Classes/Domain/Model/.gitkeep | 1 - .../Classes/Domain/Repository/.gitkeep | 1 - .../Classes/ViewHelpers/.gitkeep | 1 - .../Private/Layouts/ContentElements/.gitkeep | 1 - .../Private/Partials/ContentElements/.gitkeep | 1 - .../Resources/Private/Partials/Page/.gitkeep | 1 - .../Templates/ContentElements/.gitkeep | 1 - .../Resources/Public/Css/.gitkeep | 1 - .../Resources/Public/Fonts/.gitkeep | 1 - .../Public/Scss/Theme/theme.scss.twig | 9 - .../bootstrap_package/ext_tables.php.twig | 2 - .../Classes/Controller/.gitkeep | 1 - .../Classes/Domain/.gitkeep | 1 - .../Classes/Domain/Model/.gitkeep | 1 - .../Classes/Domain/Repository/.gitkeep | 1 - .../Classes/ViewHelpers/.gitkeep | 1 - .../Private/Layouts/ContentElements/.gitkeep | 1 - .../Private/Partials/ContentElements/.gitkeep | 1 - .../Resources/Private/Partials/Page/.gitkeep | 1 - .../Templates/ContentElements/.gitkeep | 1 - .../Resources/Public/Fonts/.gitkeep | 1 - .../fluid_styled_content/composer.json.twig | 23 - .../fluid_styled_content/ext_emconf.php.twig | 32 - .../fluid_styled_content/ext_tables.php.twig | 2 - .../Admin/BasePackageCrudController.php | 48 ++ src/Controller/Admin/DashboardController.php | 1 + .../MajorVersion/RequirementsController.php | 8 +- src/Controller/Api/SitepackageController.php | 97 +-- .../Wizards/SitepackageController.php | 226 +++---- src/Entity/BasePackage.php | 124 ++++ src/Entity/Sitepackage.php | 370 ----------- src/Enum/BasePackageEnum.php | 7 + src/Enum/Typo3VersionEnum.php | 23 +- src/EventListener/BasePackageListener.php | 47 ++ .../IncompatiblePackageException.php | 30 + .../PackageNotInstalledException.php | 30 + src/Factory/SitepackageFactory.php | 14 +- src/Form/Dto/BasePackageDto.php | 120 ++++ src/Form/Dto/SitepackageDto.php | 188 ++---- src/Form/Extension/AbstractIconExtension.php | 59 ++ .../Extension/ButtonTypeIconExtension.php} | 34 +- src/Form/SitepackageType.php | 68 +- src/Form/Type/BasePackageType.php | 27 +- src/Form/Type/Typo3VersionType.php | 20 +- src/Kernel.php | 29 - src/Menu/MenuBuilder.php | 4 +- src/Package/BasePackageManifest.php | 127 ++++ src/{Entity => Package}/Package/Author.php | 100 +-- src/Package/Sitepackage.php | 275 ++++++++ src/Repository/BasePackageRepository.php | 107 +++ src/Service/BasePackageService.php | 608 ++++++++++++++++++ src/Service/SitepackageGenerator.php | 118 +++- src/Session/WizardSessionTrait.php | 105 +++ src/Twig/Extension/VersionNumberExtension.php | 19 +- src/Utility/StringUtility.php | 18 +- src/Utility/VersionUtility.php | 13 + templates/admin/my-custom-page.html.twig | 10 + templates/form/custom_theme.html.twig | 10 + .../sitepackage/configure.html.twig} | 4 +- templates/wizards/sitepackage/error.html.twig | 23 + .../wizards/sitepackage/index.html.twig | 12 +- templates/wizards/sitepackage/new.html.twig | 50 ++ .../partials/privacy-footer.html.twig | 0 .../wizards/sitepackage/success.html.twig | 36 +- tools/rector/composer.json | 3 +- 490 files changed, 6730 insertions(+), 1021 deletions(-) create mode 100644 migrations/Version20220818183005.php create mode 100644 packages/base-package-bootstrap-package/composer.json create mode 100644 packages/base-package-bootstrap-package/public/images/preview.png rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/.editorconfig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Build/.htaccess (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Build/Gruntfile.js.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Build/package.json.twig (83%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Classes/.htaccess (100%) rename resources/skeletons/BaseExtension/bootstrap_package/Resources/Private/Layouts/Page/.gitkeep => packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/Controller/.gitignore (100%) rename resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Css/layout.css => packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/Domain/Model/.gitignore (100%) rename resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Css/layout.min.css => packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/Domain/Repository/.gitignore (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/ViewHelpers/.gitignore rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/.htaccess (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/RTE/Default.yaml.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/TCA/Overrides/pages.php.twig (64%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/TCA/Overrides/sys_template.php.twig (62%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/TsConfig/Page/All.tsconfig.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/TsConfig/Page/RTE.tsconfig.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/TypoScript/constants.typoscript.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Configuration/TypoScript/setup.typoscript.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/README.md.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Private/.htaccess (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Private/Language/locallang.xlf.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Private/Language/locallang_be.xlf.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Private/Language/locallang_db.xlf.twig (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/10.4/Resources/Private/Layouts/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/10.4/Resources/Private/Layouts/Page/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/10.4/Resources/Private/Partials/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/10.4/Resources/Private/Partials/Page/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/10.4/Resources/Private/Templates/ContentElements/.gitignore rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Private/Templates/Page/Example.html.twig (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/10.4/Resources/Public/Css/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/10.4/Resources/Public/Fonts/.gitignore rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Public/Icons/BackendLayouts/example.svg (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Public/Icons/Extension.svg (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Public/Icons/favicon.ico (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Public/Icons/logo-inverted.svg (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Public/Icons/logo.svg (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Public/Images/logo-inverted.svg (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Public/Images/logo.svg (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Public/JavaScript/Dist/scripts.js.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Public/JavaScript/Src/main.js.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/Resources/Public/Scss/Theme/_variables.scss (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/10.4/Resources/Public/Scss/Theme/theme.scss.twig rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/composer.json.twig (54%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/ext_conf_template.txt.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/ext_emconf.php.twig (71%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/10.4}/ext_localconf.php.twig (75%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/10.4/ext_tables.php.twig rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/ext_tables.sql.twig (100%) rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/10.4}/ext_tables_static+adt.sql.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/.editorconfig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Build/.htaccess (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Build/Gruntfile.js.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Build/package.json.twig rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Classes/.htaccess (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/Controller/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/Domain/Model/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/Domain/Repository/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/ViewHelpers/.gitignore rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Configuration/.htaccess (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/RTE/Default.yaml.twig rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Configuration/TCA/Overrides/pages.php.twig (64%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Configuration/TCA/Overrides/sys_template.php.twig (62%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Configuration/TsConfig/Page/All.tsconfig.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig.twig rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Configuration/TsConfig/Page/RTE.tsconfig.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/TypoScript/constants.typoscript.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/TypoScript/setup.typoscript.twig rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/README.md.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Resources/Private/.htaccess (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Resources/Private/Language/locallang.xlf.twig (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Language/locallang_be.xlf.twig rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Resources/Private/Language/locallang_db.xlf.twig (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Layouts/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Layouts/Page/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Partials/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Partials/Page/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Templates/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Templates/Page/Example.html.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Css/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Fonts/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/BackendLayouts/example.svg rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Resources/Public/Icons/Extension.svg (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Resources/Public/Icons/favicon.ico (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/logo-inverted.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/logo.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Images/logo-inverted.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Images/logo.svg rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Resources/Public/JavaScript/Dist/scripts.js.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/Resources/Public/JavaScript/Src/main.js.twig (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Scss/Theme/_variables.scss create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Scss/Theme/theme.scss.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/composer.json.twig rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/ext_conf_template.txt.twig (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/ext_emconf.php.twig rename {resources/skeletons/BaseExtension/bootstrap_package => packages/base-package-bootstrap-package/templates/skeletons/11.5}/ext_localconf.php.twig (75%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/11.5/ext_tables.php.twig rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/ext_tables.sql.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-bootstrap-package/templates/skeletons/11.5}/ext_tables_static+adt.sql.twig (100%) create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/.editorconfig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Build/.htaccess create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Build/Gruntfile.js.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Build/package.json.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/.htaccess create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/Controller/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/Domain/Model/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/Domain/Repository/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/ViewHelpers/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/.htaccess create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/RTE/Default.yaml.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TCA/Overrides/pages.php.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TCA/Overrides/sys_template.php.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/All.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/RTE.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TypoScript/constants.typoscript.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TypoScript/setup.typoscript.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/README.md.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/.htaccess create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang.xlf.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang_be.xlf.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang_db.xlf.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Layouts/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Layouts/Page/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Partials/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Partials/Page/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Templates/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Templates/Page/Example.html.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Css/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Fonts/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/BackendLayouts/example.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/Extension.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/favicon.ico create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/logo-inverted.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/logo.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Images/logo-inverted.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Images/logo.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/JavaScript/Dist/scripts.js.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/JavaScript/Src/main.js.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Scss/Theme/_variables.scss create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Scss/Theme/theme.scss.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/composer.json.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_conf_template.txt.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_emconf.php.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_localconf.php.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_tables.php.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_tables.sql.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_tables_static+adt.sql.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/.editorconfig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Build/.htaccess create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Build/Gruntfile.js.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Build/package.json.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/.htaccess create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/Controller/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/Domain/Model/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/Domain/Repository/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/ViewHelpers/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/.htaccess create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/RTE/Default.yaml.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TCA/Overrides/pages.php.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TCA/Overrides/sys_template.php.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/All.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/RTE.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TypoScript/constants.typoscript.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TypoScript/setup.typoscript.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/README.md.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/.htaccess create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang.xlf.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang_be.xlf.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang_db.xlf.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Layouts/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Layouts/Page/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Partials/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Partials/Page/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Templates/ContentElements/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Templates/Page/Example.html.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Css/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Fonts/.gitignore create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/BackendLayouts/example.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/Extension.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/favicon.ico create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/logo-inverted.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/logo.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Images/logo-inverted.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Images/logo.svg create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/JavaScript/Dist/scripts.js.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/JavaScript/Src/main.js.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Scss/Theme/_variables.scss create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Scss/Theme/theme.scss.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/composer.json.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_conf_template.txt.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_emconf.php.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_localconf.php.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_tables.php.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_tables.sql.twig create mode 100644 packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_tables_static+adt.sql.twig create mode 100644 packages/base-package-fluid-styled-content/composer.json create mode 100644 packages/base-package-fluid-styled-content/public/images/preview.png create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/.editorconfig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Build/.htaccess rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Build/Gruntfile.js.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Build/package.json.twig (89%) create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/Controller/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/Domain/Model/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/Domain/Repository/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/ViewHelpers/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/.htaccess rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Configuration/RTE/Default.yaml.twig (100%) create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TCA/Overrides/pages.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TCA/Overrides/sys_template.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/All.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig (100%) create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/RTE.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Configuration/TypoScript/constants.typoscript.twig (93%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Configuration/TypoScript/setup.typoscript.twig (98%) create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/README.md.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Language/locallang.xlf.twig rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Resources/Private/Language/locallang_be.xlf.twig (100%) create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Language/locallang_db.xlf.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Layouts/ContentElements/.gitignore rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Resources/Private/Layouts/Page/Default.html.twig (100%) create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Partials/ContentElements/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Partials/Page/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Templates/ContentElements/.gitignore rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Resources/Private/Templates/Page/Default.html.twig (100%) create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Css/layout.css create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Css/layout.min.css rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Resources/Public/Css/rte.css.twig (100%) create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Fonts/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Icons/Extension.svg create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Icons/favicon.ico rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Resources/Public/Images/BackendLayouts/default.png (100%) create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/JavaScript/Dist/scripts.js.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/JavaScript/Src/main.js.twig rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Resources/Public/Scss/layout.scss.twig (100%) rename {resources/skeletons/BaseExtension/fluid_styled_content => packages/base-package-fluid-styled-content/templates/skeletons/10.4}/Resources/Public/Scss/variables.scss.twig (100%) create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/composer.json.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_conf_template.txt.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_emconf.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_localconf.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_tables.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_tables.sql.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_tables_static+adt.sql.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/.editorconfig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Build/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Build/Gruntfile.js.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Build/package.json.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/Controller/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/Domain/Model/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/Domain/Repository/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/ViewHelpers/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/RTE/Default.yaml.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TCA/Overrides/pages.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TCA/Overrides/sys_template.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/All.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/RTE.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/constants.typoscript.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/setup.typoscript.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/README.md.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang.xlf.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang_be.xlf.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang_db.xlf.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Layouts/ContentElements/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Layouts/Page/Default.html.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Partials/ContentElements/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Partials/Page/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Templates/ContentElements/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Templates/Page/Default.html.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Css/layout.css create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Css/layout.min.css create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Css/rte.css.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Fonts/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Icons/Extension.svg create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Icons/favicon.ico create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Images/BackendLayouts/default.png create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/JavaScript/Dist/scripts.js.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/JavaScript/Src/main.js.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Scss/layout.scss.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Scss/variables.scss.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/composer.json.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_conf_template.txt.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_emconf.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_localconf.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_tables.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_tables.sql.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_tables_static+adt.sql.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/.editorconfig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Build/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Build/Gruntfile.js.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Build/package.json.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/Controller/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/Domain/Model/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/Domain/Repository/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/ViewHelpers/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/RTE/Default.yaml.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TCA/Overrides/pages.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TCA/Overrides/sys_template.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/All.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/RTE.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/constants.typoscript.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/setup.typoscript.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/README.md.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang.xlf.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang_be.xlf.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang_db.xlf.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Layouts/ContentElements/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Layouts/Page/Default.html.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Partials/ContentElements/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Partials/Page/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Templates/ContentElements/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Templates/Page/Default.html.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Css/layout.css create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Css/layout.min.css create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Css/rte.css.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Fonts/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Icons/Extension.svg create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Icons/favicon.ico create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Images/BackendLayouts/default.png create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/JavaScript/Dist/scripts.js.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/JavaScript/Src/main.js.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Scss/layout.scss.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Scss/variables.scss.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/composer.json.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_conf_template.txt.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_emconf.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_localconf.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_tables.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_tables.sql.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_tables_static+adt.sql.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/.editorconfig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Build/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Build/Gruntfile.js.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Build/package.json.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/Controller/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/Domain/Model/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/Domain/Repository/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/ViewHelpers/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/RTE/Default.yaml.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TCA/Overrides/pages.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TCA/Overrides/sys_template.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/All.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/RTE.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/constants.typoscript.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/setup.typoscript.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/README.md.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/.htaccess create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang.xlf.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang_be.xlf.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang_db.xlf.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Layouts/ContentElements/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Layouts/Page/Default.html.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Partials/ContentElements/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Partials/Page/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Templates/ContentElements/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Templates/Page/Default.html.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Css/layout.css create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Css/layout.min.css create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Css/rte.css.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Fonts/.gitignore create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Icons/Extension.svg create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Icons/favicon.ico create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Images/BackendLayouts/default.png create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/JavaScript/Dist/scripts.js.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/JavaScript/Src/main.js.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Scss/layout.scss.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Scss/variables.scss.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/composer.json.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_conf_template.txt.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_emconf.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_localconf.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_tables.php.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_tables.sql.twig create mode 100644 packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_tables_static+adt.sql.twig delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Classes/Controller/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Classes/Domain/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Classes/Domain/Model/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Classes/Domain/Repository/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Classes/ViewHelpers/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Resources/Private/Layouts/ContentElements/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Resources/Private/Partials/ContentElements/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Resources/Private/Partials/Page/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Resources/Private/Templates/ContentElements/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Resources/Public/Css/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Resources/Public/Fonts/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/Resources/Public/Scss/Theme/theme.scss.twig delete mode 100644 resources/skeletons/BaseExtension/bootstrap_package/ext_tables.php.twig delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/Classes/Controller/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/Classes/Domain/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/Classes/Domain/Model/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/Classes/Domain/Repository/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/Classes/ViewHelpers/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Layouts/ContentElements/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Partials/ContentElements/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Partials/Page/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Templates/ContentElements/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Fonts/.gitkeep delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/composer.json.twig delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/ext_emconf.php.twig delete mode 100644 resources/skeletons/BaseExtension/fluid_styled_content/ext_tables.php.twig create mode 100644 src/Controller/Admin/BasePackageCrudController.php create mode 100644 src/Entity/BasePackage.php delete mode 100644 src/Entity/Sitepackage.php create mode 100644 src/EventListener/BasePackageListener.php create mode 100644 src/Exception/IncompatiblePackageException.php create mode 100644 src/Exception/PackageNotInstalledException.php create mode 100644 src/Form/Dto/BasePackageDto.php create mode 100644 src/Form/Extension/AbstractIconExtension.php rename src/{Utility/FileUtility.php => Form/Extension/ButtonTypeIconExtension.php} (50%) create mode 100644 src/Package/BasePackageManifest.php rename src/{Entity => Package}/Package/Author.php (50%) create mode 100644 src/Package/Sitepackage.php create mode 100644 src/Repository/BasePackageRepository.php create mode 100644 src/Service/BasePackageService.php create mode 100644 src/Session/WizardSessionTrait.php create mode 100644 templates/admin/my-custom-page.html.twig create mode 100644 templates/form/custom_theme.html.twig rename templates/{default/wizards/sitepackage/edit.html.twig => wizards/sitepackage/configure.html.twig} (65%) create mode 100644 templates/wizards/sitepackage/error.html.twig rename templates/{default => }/wizards/sitepackage/index.html.twig (91%) create mode 100644 templates/wizards/sitepackage/new.html.twig rename templates/{default => }/wizards/sitepackage/partials/privacy-footer.html.twig (100%) rename templates/{default => }/wizards/sitepackage/success.html.twig (70%) diff --git a/.gitignore b/.gitignore index 9bb4b667..deb69fb7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /.idea/ /.mage/ /.vscode/ +/public/base-packages/ /public/p/ /public/p2/ /public/satis/ diff --git a/composer.json b/composer.json index da160628..4b01531d 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,9 @@ "ext-iconv": "*", "ext-json": "*", "ext-sqlite3": "*", + "ext-zip": "*", "ext-zlib": "*", + "composer/composer": "^2.2", "composer/satis": "^3.0@dev", "composer/semver": "^3.3", "doctrine/collections": "^1.6", @@ -64,6 +66,8 @@ "symfony/dependency-injection": "^5.4", "symfony/dotenv": "^5.4", "symfony/expression-language": "^5.4", + "symfony/filesystem": "^5.4", + "symfony/finder": "^5.4", "symfony/flex": "^2.2", "symfony/form": "^5.4", "symfony/framework-bundle": "^5.4", @@ -75,6 +79,7 @@ "symfony/mime": "^5.4", "symfony/monolog-bundle": "^3.1", "symfony/notifier": "^5.4", + "symfony/options-resolver": "^5.4", "symfony/process": "^5.4", "symfony/property-access": "^5.4", "symfony/property-info": "^5.4", diff --git a/composer.lock b/composer.lock index 327164a4..d3338e03 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d9c40c5d84f20946135a6c0317bdd5ec", + "content-hash": "0fa3e4fd862b2bff584071c34abcd72e", "packages": [ { "name": "composer/ca-bundle", @@ -11779,6 +11779,7 @@ "ext-iconv": "*", "ext-json": "*", "ext-sqlite3": "*", + "ext-zip": "*", "ext-zlib": "*" }, "platform-dev": [], diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index 7853e9ed..6a7e85e0 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -17,6 +17,9 @@ framework: php_errors: log: true + form: + legacy_error_messages: false + when@test: framework: test: true diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index 8f4c7e42..5439e3ac 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -5,3 +5,5 @@ twig: packagist: search: https://packagist.org/explore/?type=typo3-cms-extension submit: https://packagist.org/packages/submit + form_themes: + - 'form/custom_theme.html.twig' diff --git a/config/services.yaml b/config/services.yaml index cd4c0610..8535f9d3 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -5,6 +5,8 @@ # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration parameters: app.domain: '%env(APP_DOMAIN)%' + app.base_packages_project_dir: 'var/base-packages' + app.base_packages_assets_dir: 'base-packages' services: # default configuration for services in *this* file @@ -17,10 +19,14 @@ services: App\: resource: '../src/' exclude: + - '../src/DataFixtures/' - '../src/DependencyInjection/' - '../src/Entity/' - - '../src/Kernel.php' + - '../src/Enum/' + - '../src/Exception/' + - '../src/Package/' - '../src/Tests/' + - '../src/Kernel.php' # controllers are imported separately to make sure services can be injected # as action arguments even if you don't extend any base controller class @@ -34,6 +40,9 @@ services: arguments: $appDomain: '%env(APP_DOMAIN)%' + App\EventListener\BasePackageListener: + tags: ['doctrine.orm.entity_listener'] + App\EventListener\MajorVersionListener: tags: ['doctrine.orm.entity_listener'] @@ -43,6 +52,13 @@ services: App\EventListener\RequirementListener: tags: ['doctrine.orm.entity_listener'] + App\Service\BasePackageService: + arguments: + $projectDir: '%app.base_packages_project_dir%' + $assetsDir: '%app.base_packages_assets_dir%' + App\Service\CacheWarmupService: arguments: $baseUrl: '%env(BASE_URL)%' + + Composer\Console\Application: diff --git a/migrations/Version20220818183005.php b/migrations/Version20220818183005.php new file mode 100644 index 00000000..a7f66de9 --- /dev/null +++ b/migrations/Version20220818183005.php @@ -0,0 +1,31 @@ +addSql('CREATE TABLE base_packages (name VARCHAR(255) NOT NULL, version VARCHAR(63) NOT NULL, active BOOLEAN NOT NULL, official BOOLEAN NOT NULL, PRIMARY KEY(name))'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP TABLE base_packages'); + } +} diff --git a/packages/base-package-bootstrap-package/composer.json b/packages/base-package-bootstrap-package/composer.json new file mode 100644 index 00000000..2945f768 --- /dev/null +++ b/packages/base-package-bootstrap-package/composer.json @@ -0,0 +1,21 @@ +{ + "name": "typo3/base-package-bootstrap-package", + "description": "Base package for the generation of a TYPO3 Sitepackage based on bk2k/bootstrap-package at https://get.typo3.org.", + "license": "GPL-2.0-or-later", + "type": "typo3-base-package", + "extra": { + "typo3/base-package": { + "title": "Bootstrap Package", + "description": "Create a Sitepackage based on the popular Bootstrap Package.", + "core-versions": [ + "8.7", + "9.5", + "10.4", + "11.5" + ], + "images": { + "preview": "images/preview.png" + } + } + } +} diff --git a/packages/base-package-bootstrap-package/public/images/preview.png b/packages/base-package-bootstrap-package/public/images/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7d7fd0d02d88c5402b7c78f68c1d42bea71050 GIT binary patch literal 74411 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%0AyS_s=~9L4YxL`86LYdD^ljNp2z2i} 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%0Ai%@Y`eb7>KCT@3p()GbtfeWF$oASZnzyO)h%oga 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

>9c0{Kh^#=7FA_MQAOX9q&TxCYuVsvlf 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 literal 0 HcmV?d00001 diff --git a/resources/skeletons/BaseExtension/bootstrap_package/.editorconfig b/packages/base-package-bootstrap-package/templates/skeletons/10.4/.editorconfig similarity index 100% rename from resources/skeletons/BaseExtension/bootstrap_package/.editorconfig rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/.editorconfig diff --git a/resources/skeletons/BaseExtension/bootstrap_package/Build/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Build/.htaccess similarity index 100% rename from resources/skeletons/BaseExtension/bootstrap_package/Build/.htaccess rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/Build/.htaccess diff --git a/resources/skeletons/BaseExtension/bootstrap_package/Build/Gruntfile.js.twig b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Build/Gruntfile.js.twig similarity index 100% rename from resources/skeletons/BaseExtension/bootstrap_package/Build/Gruntfile.js.twig rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/Build/Gruntfile.js.twig diff --git a/resources/skeletons/BaseExtension/bootstrap_package/Build/package.json.twig b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Build/package.json.twig similarity index 83% rename from resources/skeletons/BaseExtension/bootstrap_package/Build/package.json.twig rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/Build/package.json.twig index 21fc85af..26bebc41 100644 --- a/resources/skeletons/BaseExtension/bootstrap_package/Build/package.json.twig +++ b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Build/package.json.twig @@ -1,5 +1,5 @@ { - "name": "{{ package.vendorNameAlternative }}-{{ package.packageNameAlternative }}", + "name": "{{ package.composerVendorName }}-{{ package.composerProjectName }}", "description": "{{ package.description }}", "repository": { "type": "git", diff --git a/resources/skeletons/BaseExtension/bootstrap_package/Classes/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/.htaccess similarity index 100% rename from resources/skeletons/BaseExtension/bootstrap_package/Classes/.htaccess rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/.htaccess diff --git a/resources/skeletons/BaseExtension/bootstrap_package/Resources/Private/Layouts/Page/.gitkeep b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/Controller/.gitignore similarity index 100% rename from resources/skeletons/BaseExtension/bootstrap_package/Resources/Private/Layouts/Page/.gitkeep rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/Controller/.gitignore diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Css/layout.css b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/Domain/Model/.gitignore similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Css/layout.css rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/Domain/Model/.gitignore diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Css/layout.min.css b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/Domain/Repository/.gitignore similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Css/layout.min.css rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/Domain/Repository/.gitignore diff --git a/packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/ViewHelpers/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Classes/ViewHelpers/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/resources/skeletons/BaseExtension/bootstrap_package/Configuration/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Configuration/.htaccess similarity index 100% rename from resources/skeletons/BaseExtension/bootstrap_package/Configuration/.htaccess rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/Configuration/.htaccess diff --git a/resources/skeletons/BaseExtension/bootstrap_package/Configuration/RTE/Default.yaml.twig b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Configuration/RTE/Default.yaml.twig similarity index 100% rename from resources/skeletons/BaseExtension/bootstrap_package/Configuration/RTE/Default.yaml.twig rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/Configuration/RTE/Default.yaml.twig diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TCA/Overrides/pages.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Configuration/TCA/Overrides/pages.php.twig similarity index 64% rename from resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TCA/Overrides/pages.php.twig rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/Configuration/TCA/Overrides/pages.php.twig index 672a2d1e..beb3dd60 100644 --- a/resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TCA/Overrides/pages.php.twig +++ b/packages/base-package-bootstrap-package/templates/skeletons/10.4/Configuration/TCA/Overrides/pages.php.twig @@ -1,5 +1,5 @@ 'templates', 'constraints' => [ 'depends' => [ - 'bootstrap_package' => '{% if package.typo3version < 9000000 %}10.0.0-10.0.99{% elseif package.typo3version < 10000000 %}10.0.0-11.0.99{% else %}12.0.0-12.9.99{% endif %}', + 'bootstrap_package' => '12.0.0-12.9.99', ], 'conflicts' => [ ], ], 'autoload' => [ 'psr-4' => [ - '{{ package.vendorName }}\\{{ package.packageName }}\\' => 'Classes', + '{{ package.psr4Namespace }}\\' => 'Classes', ], ], 'state' => 'stable', diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/ext_localconf.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/10.4/ext_localconf.php.twig similarity index 75% rename from resources/skeletons/BaseExtension/fluid_styled_content/ext_localconf.php.twig rename to packages/base-package-bootstrap-package/templates/skeletons/10.4/ext_localconf.php.twig index cc9f50b7..1845e195 100644 --- a/resources/skeletons/BaseExtension/fluid_styled_content/ext_localconf.php.twig +++ b/packages/base-package-bootstrap-package/templates/skeletons/10.4/ext_localconf.php.twig @@ -1,5 +1,5 @@ Resources/', + fonts: '<%= paths.resources %>Public/Fonts/', + img: '<%= paths.resources %>Public/Images/', + js: '<%= paths.resources %>Public/JavaScript/' + }, + banner: '/*!\n' + + ' * {{ package.title }} v<%= pkg.version %> (<%= pkg.homepage %>)\n' + + ' * Copyright 2017-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + + ' * Licensed under the <%= pkg.license %> license\n' + + ' */\n', + uglify: { + all: { + options: { + banner: '<%= banner %>', + mangle: true, + compress: true, + beautify: false + }, + files: { + "<%= paths.js %>/Dist/scripts.js": [ + "<%= paths.js %>Src/main.js" + ] + } + } + }, + imagemin: { + extension: { + files: [{ + expand: true, + cwd: '<%= paths.resources %>', + src: [ + '**/*.{png,jpg,gif,svg}' + ], + dest: '<%= paths.resources %>' + }] + } + }, + watch: { + options: { + livereload: true + }, + javascript: { + files: '<%= paths.js %>Src/**/*.js', + tasks: ['js'] + } + } + }); + + /** + * Register tasks + */ + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-imagemin'); + + /** + * Grunt update task + */ + grunt.registerTask('js', ['uglify']); + grunt.registerTask('build', ['js', 'imagemin']); + grunt.registerTask('default', ['build']); + +}; diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Build/package.json.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Build/package.json.twig new file mode 100644 index 00000000..26bebc41 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Build/package.json.twig @@ -0,0 +1,18 @@ +{ + "name": "{{ package.composerVendorName }}-{{ package.composerProjectName }}", + "description": "{{ package.description }}", + "repository": { + "type": "git", + "url": "{{ package.repositoryUrl }}" + }, + "homepage": "{{ package.author.homepage }}", + "author": "{{ package.author.name }}", + "version": "1.0.0", + "license": "GPL-2.0-or-later", + "devDependencies": { + "grunt": "^1.0.3", + "grunt-contrib-uglify": "^4.0.0", + "grunt-contrib-watch": "^1.1.0", + "grunt-contrib-imagemin": "^2.0.1" + } +} diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Classes/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/.htaccess similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Classes/.htaccess rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/.htaccess diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/Controller/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/Controller/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/Domain/Model/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/Domain/Model/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/Domain/Repository/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/Domain/Repository/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/ViewHelpers/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Classes/ViewHelpers/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Configuration/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/.htaccess similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Configuration/.htaccess rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/.htaccess diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/RTE/Default.yaml.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/RTE/Default.yaml.twig new file mode 100644 index 00000000..282236ed --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/RTE/Default.yaml.twig @@ -0,0 +1,9 @@ +imports: + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" } + - { resource: "EXT:bootstrap_package/Configuration/RTE/Default.yaml" } + +editor: + config: + contentsCss: "EXT:bootstrap_package/Resources/Public/Css/bootstrap4-rte.min.css" diff --git a/resources/skeletons/BaseExtension/bootstrap_package/Configuration/TCA/Overrides/pages.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/TCA/Overrides/pages.php.twig similarity index 64% rename from resources/skeletons/BaseExtension/bootstrap_package/Configuration/TCA/Overrides/pages.php.twig rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/TCA/Overrides/pages.php.twig index 672a2d1e..53e0502b 100644 --- a/resources/skeletons/BaseExtension/bootstrap_package/Configuration/TCA/Overrides/pages.php.twig +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/TCA/Overrides/pages.php.twig @@ -1,5 +1,5 @@ + + +############ +### PAGE ### +############ +page { + logo { + file = EXT:{{ package.extensionKey }}/Resources/Public/Images/logo.svg + fileInverted = EXT:{{ package.extensionKey }}/Resources/Public/Images/logo-inverted.svg + height = 52 + width = 192 + alt = {{ package.title }} + linktitle = {{ package.title }} + } + favicon { + file = EXT:{{ package.extensionKey }}/Resources/Public/Icons/favicon.ico + } + fluidtemplate { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/Page/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/Page/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/Page/ + } +} + + +################## +### EXTENSIONS ### +################## +plugin.bootstrap_package { + view { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/ + } +} + + +######################## +### CONTENT ELEMENTS ### +######################## +plugin.bootstrap_package_contentelements { + view { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/ContentElements/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/ContentElements/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/ContentElements/ + } +} + + +################################ +### BOOTSTRAP SCSS CONSTANTS ### +################################ +plugin.bootstrap_package.settings.scss { + primary = #eb3e4a + secondary = #013859 +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/TypoScript/setup.typoscript.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/TypoScript/setup.typoscript.twig new file mode 100644 index 00000000..00a04208 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Configuration/TypoScript/setup.typoscript.twig @@ -0,0 +1,30 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +############## +#### PAGE #### +############## +page { + includeCSS { + theme = EXT:{{ package.extensionKey }}/Resources/Public/Scss/Theme/theme.scss + } + + includeJSLibs { + + } + + includeJS { + + } + + includeJSFooterlibs { + + } + + includeJSFooter { + {{ package.extensionKey }}_scripts = EXT:{{ package.extensionKey }}/Resources/Public/JavaScript/Dist/scripts.js + } +} diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/README.md.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/README.md.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/README.md.twig rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/README.md.twig diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/.htaccess similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/.htaccess rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/.htaccess diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Language/locallang.xlf.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Language/locallang.xlf.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Language/locallang.xlf.twig rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Language/locallang.xlf.twig diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Language/locallang_be.xlf.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Language/locallang_be.xlf.twig new file mode 100644 index 00000000..8b09912d --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Language/locallang_be.xlf.twig @@ -0,0 +1,17 @@ + + + +

+ {{ package.author.name }} + {{ package.author.email }} +
+ + + Example + + + Normal + + + + diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Language/locallang_db.xlf.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Language/locallang_db.xlf.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Language/locallang_db.xlf.twig rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Language/locallang_db.xlf.twig diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Layouts/ContentElements/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Layouts/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Layouts/Page/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Layouts/Page/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Partials/ContentElements/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Partials/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Partials/Page/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Partials/Page/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Templates/ContentElements/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Templates/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Templates/Page/Example.html.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Templates/Page/Example.html.twig new file mode 100644 index 00000000..2b67bb11 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Private/Templates/Page/Example.html.twig @@ -0,0 +1,22 @@ + + + + +
+
+
+
Template file
+
+ typo3conf/ext/{{ package.extensionKey }}/Resources/Private/Templates/Page/Example.html +
+
Backend Configuration
+
+ typo3conf/ext/{{ package.extensionKey }}/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig +
+
+
+
+ + +
+ diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Css/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Css/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Fonts/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Fonts/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/BackendLayouts/example.svg b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/BackendLayouts/example.svg new file mode 100644 index 00000000..d05abec2 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/BackendLayouts/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Icons/Extension.svg b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/Extension.svg similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Icons/Extension.svg rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/Extension.svg diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Icons/favicon.ico b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/favicon.ico similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Icons/favicon.ico rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/favicon.ico diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/logo-inverted.svg b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/logo-inverted.svg new file mode 100644 index 00000000..f465b080 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/logo-inverted.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/logo.svg b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/logo.svg new file mode 100644 index 00000000..dc1615ff --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Icons/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Images/logo-inverted.svg b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Images/logo-inverted.svg new file mode 100644 index 00000000..f465b080 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Images/logo-inverted.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Images/logo.svg b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Images/logo.svg new file mode 100644 index 00000000..dc1615ff --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/JavaScript/Dist/scripts.js.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/JavaScript/Dist/scripts.js.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/JavaScript/Dist/scripts.js.twig rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/JavaScript/Dist/scripts.js.twig diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/JavaScript/Src/main.js.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/JavaScript/Src/main.js.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/JavaScript/Src/main.js.twig rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/JavaScript/Src/main.js.twig diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Scss/Theme/_variables.scss b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Scss/Theme/_variables.scss new file mode 100644 index 00000000..4a4e02e8 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Scss/Theme/_variables.scss @@ -0,0 +1,3 @@ +// +// Variables +// diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Scss/Theme/theme.scss.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Scss/Theme/theme.scss.twig new file mode 100644 index 00000000..bec14c0e --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/Resources/Public/Scss/Theme/theme.scss.twig @@ -0,0 +1,9 @@ +// +// Variables +// +@import "variables"; + +// +// Import needed Bootstrap Package Files +// +@import "EXT:bootstrap_package/Resources/Public/Scss/bootstrap5/theme"; diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/composer.json.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/composer.json.twig new file mode 100644 index 00000000..eb82cf33 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/composer.json.twig @@ -0,0 +1,21 @@ +{ + "name": "{{ package.composerName }}", + "type": "typo3-cms-extension", + "description": "{{ package.description}}", + "homepage": "{{ package.author.homepage }}", + "license": ["GPL-2.0-or-later"], + "keywords": ["TYPO3 CMS"], + "require": { + "bk2k/bootstrap-package": "^12.0" + }, + "autoload": { + "psr-4": { + "{{ package.psr4Namespace }}\\": "Classes" + } + }, + "extra": { + "typo3/cms": { + "extension-key": "{{ package.extensionKey }}" + } + } +} diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/ext_conf_template.txt.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/ext_conf_template.txt.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/ext_conf_template.txt.twig rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/ext_conf_template.txt.twig diff --git a/packages/base-package-bootstrap-package/templates/skeletons/11.5/ext_emconf.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/ext_emconf.php.twig new file mode 100644 index 00000000..8800de1f --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/ext_emconf.php.twig @@ -0,0 +1,30 @@ + '{{ package.title }}', + 'description' => '{{ package.description }}', + 'category' => 'templates', + 'constraints' => [ + 'depends' => [ + 'bootstrap_package' => '12.0.0-12.9.99', + ], + 'conflicts' => [ + ], + ], + 'autoload' => [ + 'psr-4' => [ + '{{ package.psr4Namespace }}\\' => 'Classes', + ], + ], + 'state' => 'stable', + 'uploadfolder' => 0, + 'createDirs' => '', + 'clearCacheOnLoad' => 1, + 'author' => '{{ package.author.name }}', + 'author_email' => '{{ package.author.email }}', + 'author_company' => '{{ package.author.company }}', + 'version' => '1.0.0', +]; diff --git a/resources/skeletons/BaseExtension/bootstrap_package/ext_localconf.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/11.5/ext_localconf.php.twig similarity index 75% rename from resources/skeletons/BaseExtension/bootstrap_package/ext_localconf.php.twig rename to packages/base-package-bootstrap-package/templates/skeletons/11.5/ext_localconf.php.twig index cc9f50b7..1845e195 100644 --- a/resources/skeletons/BaseExtension/bootstrap_package/ext_localconf.php.twig +++ b/packages/base-package-bootstrap-package/templates/skeletons/11.5/ext_localconf.php.twig @@ -1,5 +1,5 @@ Resources/', + fonts: '<%= paths.resources %>Public/Fonts/', + img: '<%= paths.resources %>Public/Images/', + js: '<%= paths.resources %>Public/JavaScript/' + }, + banner: '/*!\n' + + ' * {{ package.title }} v<%= pkg.version %> (<%= pkg.homepage %>)\n' + + ' * Copyright 2017-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + + ' * Licensed under the <%= pkg.license %> license\n' + + ' */\n', + uglify: { + all: { + options: { + banner: '<%= banner %>', + mangle: true, + compress: true, + beautify: false + }, + files: { + "<%= paths.js %>/Dist/scripts.js": [ + "<%= paths.js %>Src/main.js" + ] + } + } + }, + imagemin: { + extension: { + files: [{ + expand: true, + cwd: '<%= paths.resources %>', + src: [ + '**/*.{png,jpg,gif,svg}' + ], + dest: '<%= paths.resources %>' + }] + } + }, + watch: { + options: { + livereload: true + }, + javascript: { + files: '<%= paths.js %>Src/**/*.js', + tasks: ['js'] + } + } + }); + + /** + * Register tasks + */ + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-imagemin'); + + /** + * Grunt update task + */ + grunt.registerTask('js', ['uglify']); + grunt.registerTask('build', ['js', 'imagemin']); + grunt.registerTask('default', ['build']); + +}; diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Build/package.json.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Build/package.json.twig new file mode 100644 index 00000000..26bebc41 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Build/package.json.twig @@ -0,0 +1,18 @@ +{ + "name": "{{ package.composerVendorName }}-{{ package.composerProjectName }}", + "description": "{{ package.description }}", + "repository": { + "type": "git", + "url": "{{ package.repositoryUrl }}" + }, + "homepage": "{{ package.author.homepage }}", + "author": "{{ package.author.name }}", + "version": "1.0.0", + "license": "GPL-2.0-or-later", + "devDependencies": { + "grunt": "^1.0.3", + "grunt-contrib-uglify": "^4.0.0", + "grunt-contrib-watch": "^1.1.0", + "grunt-contrib-imagemin": "^2.0.1" + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/Controller/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/Controller/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/Domain/Model/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/Domain/Model/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/Domain/Repository/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/Domain/Repository/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/ViewHelpers/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Classes/ViewHelpers/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/RTE/Default.yaml.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/RTE/Default.yaml.twig new file mode 100644 index 00000000..282236ed --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/RTE/Default.yaml.twig @@ -0,0 +1,9 @@ +imports: + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" } + - { resource: "EXT:bootstrap_package/Configuration/RTE/Default.yaml" } + +editor: + config: + contentsCss: "EXT:bootstrap_package/Resources/Public/Css/bootstrap4-rte.min.css" diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TCA/Overrides/pages.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TCA/Overrides/pages.php.twig new file mode 100644 index 00000000..beb3dd60 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TCA/Overrides/pages.php.twig @@ -0,0 +1,19 @@ + + + + diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig new file mode 100644 index 00000000..8213cfae --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig @@ -0,0 +1,4 @@ +# +# BACKENDLAYOUTS +# + diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig.twig new file mode 100644 index 00000000..628a7254 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig.twig @@ -0,0 +1,29 @@ +# +# BACKENDLAYOUT: EXAMPLE +# +mod { + web_layout { + BackendLayouts { + example { + title = LLL:EXT:{{ package.extensionKey }}/Resources/Private/Language/locallang_be.xlf:backend_layout.example + config { + backend_layout { + colCount = 1 + rowCount = 1 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:{{ package.extensionKey }}/Resources/Private/Language/locallang_be.xlf:backend_layout.column.normal + colPos = 0 + } + } + } + } + } + } + icon = EXT:{{ package.extensionKey }}/Resources/Public/Icons/BackendLayouts/example.svg + } + } + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/RTE.tsconfig.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/RTE.tsconfig.twig new file mode 100644 index 00000000..38353247 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/RTE.tsconfig.twig @@ -0,0 +1,8 @@ +############# +#### RTE #### +############# +RTE { + default { + preset = {{ package.extensionKey }} + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig new file mode 100644 index 00000000..55f97ce7 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig @@ -0,0 +1,11 @@ +# +# TCEFORM +# +TCEFORM { + pages { + + } + tt_content { + + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig new file mode 100644 index 00000000..9d4a5e4e --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig @@ -0,0 +1,6 @@ +# +# TCEMAIN +# +TCEMAIN { + +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TypoScript/constants.typoscript.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TypoScript/constants.typoscript.twig new file mode 100644 index 00000000..32904169 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TypoScript/constants.typoscript.twig @@ -0,0 +1,60 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +############ +### PAGE ### +############ +page { + logo { + file = EXT:{{ package.extensionKey }}/Resources/Public/Images/logo.svg + fileInverted = EXT:{{ package.extensionKey }}/Resources/Public/Images/logo-inverted.svg + height = 52 + width = 192 + alt = {{ package.title }} + linktitle = {{ package.title }} + } + favicon { + file = EXT:{{ package.extensionKey }}/Resources/Public/Icons/favicon.ico + } + fluidtemplate { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/Page/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/Page/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/Page/ + } +} + + +################## +### EXTENSIONS ### +################## +plugin.bootstrap_package { + view { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/ + } +} + + +######################## +### CONTENT ELEMENTS ### +######################## +plugin.bootstrap_package_contentelements { + view { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/ContentElements/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/ContentElements/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/ContentElements/ + } +} + + +################################ +### BOOTSTRAP SCSS CONSTANTS ### +################################ +plugin.bootstrap_package.settings.scss { + primary = #eb3e4a + secondary = #013859 +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TypoScript/setup.typoscript.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TypoScript/setup.typoscript.twig new file mode 100644 index 00000000..00a04208 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Configuration/TypoScript/setup.typoscript.twig @@ -0,0 +1,30 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +############## +#### PAGE #### +############## +page { + includeCSS { + theme = EXT:{{ package.extensionKey }}/Resources/Public/Scss/Theme/theme.scss + } + + includeJSLibs { + + } + + includeJS { + + } + + includeJSFooterlibs { + + } + + includeJSFooter { + {{ package.extensionKey }}_scripts = EXT:{{ package.extensionKey }}/Resources/Public/JavaScript/Dist/scripts.js + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/README.md.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/README.md.twig new file mode 100644 index 00000000..8b095c79 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/README.md.twig @@ -0,0 +1,4 @@ +Sitepackage for the project "{{ package.title }}" +============================================================== + +Add some explanation here. diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang.xlf.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang_be.xlf.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang_be.xlf.twig new file mode 100644 index 00000000..8b09912d --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang_be.xlf.twig @@ -0,0 +1,17 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + + Example + + + Normal + + +
+
diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang_db.xlf.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang_db.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Language/locallang_db.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Layouts/ContentElements/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Layouts/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Layouts/Page/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Layouts/Page/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Partials/ContentElements/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Partials/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Partials/Page/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Partials/Page/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Templates/ContentElements/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Templates/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Templates/Page/Example.html.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Templates/Page/Example.html.twig new file mode 100644 index 00000000..2b67bb11 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Private/Templates/Page/Example.html.twig @@ -0,0 +1,22 @@ + + + + +
+
+
+
Template file
+
+ typo3conf/ext/{{ package.extensionKey }}/Resources/Private/Templates/Page/Example.html +
+
Backend Configuration
+
+ typo3conf/ext/{{ package.extensionKey }}/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig +
+
+
+
+ + +
+ diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Css/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Css/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Fonts/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Fonts/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/BackendLayouts/example.svg b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/BackendLayouts/example.svg new file mode 100644 index 00000000..d05abec2 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/BackendLayouts/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/Extension.svg b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/Extension.svg new file mode 100644 index 00000000..d8536373 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/Extension.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/favicon.ico b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..46d4c14df35ee4ccdf7c5a7eba53f00bc4457963 GIT binary patch literal 1150 zcmaKszb^zq6vrP&t{`y*Vj}8oqXL6Y$R~|E{BN6xxSFH~V-8J?S315x+S4 zj-Y)ybmKo(YfpQ6?x1gZYOBicJEMBKKl2?Y;7851p!}yw*Ju2g^_YOA4@`k=u$$QG%PiuMovJt++@ORg$yF+-?obfjA|?e@V(Z#s}~VJtDD0 literal 0 HcmV?d00001 diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/logo-inverted.svg b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/logo-inverted.svg new file mode 100644 index 00000000..f465b080 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/logo-inverted.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/logo.svg b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/logo.svg new file mode 100644 index 00000000..dc1615ff --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Icons/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Images/logo-inverted.svg b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Images/logo-inverted.svg new file mode 100644 index 00000000..f465b080 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Images/logo-inverted.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Images/logo.svg b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Images/logo.svg new file mode 100644 index 00000000..dc1615ff --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/JavaScript/Dist/scripts.js.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/JavaScript/Dist/scripts.js.twig new file mode 100644 index 00000000..af832405 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/JavaScript/Dist/scripts.js.twig @@ -0,0 +1,6 @@ +/*! + * {{ package.title }} v1.0.0 ({{ package.author.homepage }}) + * Copyright 2017-{{ 'now'|date('Y') }} {{ package.author.name }} + * Licensed under the GPL-2.0-or-later license + */ +console.log("WE LOVE TYPO3"); diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/JavaScript/Src/main.js.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/JavaScript/Src/main.js.twig new file mode 100644 index 00000000..a5e49024 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/JavaScript/Src/main.js.twig @@ -0,0 +1 @@ +console.log('WE LOVE TYPO3'); diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Scss/Theme/_variables.scss b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Scss/Theme/_variables.scss new file mode 100644 index 00000000..4a4e02e8 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Scss/Theme/_variables.scss @@ -0,0 +1,3 @@ +// +// Variables +// diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Scss/Theme/theme.scss.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Scss/Theme/theme.scss.twig new file mode 100644 index 00000000..5c34ad17 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/Resources/Public/Scss/Theme/theme.scss.twig @@ -0,0 +1,9 @@ +// +// Variables +// +@import "variables"; + +// +// Import needed Bootstrap Package Files +// +@import "../../../../../bootstrap_package/Resources/Public/Scss/Theme/theme"; diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/composer.json.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/composer.json.twig new file mode 100644 index 00000000..d9625163 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/composer.json.twig @@ -0,0 +1,21 @@ +{ + "name": "{{ package.composerName }}", + "type": "typo3-cms-extension", + "description": "{{ package.description}}", + "homepage": "{{ package.author.homepage }}", + "license": ["GPL-2.0-or-later"], + "keywords": ["TYPO3 CMS"], + "require": { + "bk2k/bootstrap-package": "^10.0" + }, + "autoload": { + "psr-4": { + "{{ package.psr4Namespace }}\\": "Classes" + } + }, + "extra": { + "typo3/cms": { + "extension-key": "{{ package.extensionKey }}" + } + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_conf_template.txt.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_conf_template.txt.twig new file mode 100644 index 00000000..e87dc9ce --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_conf_template.txt.twig @@ -0,0 +1,3 @@ +# +# Extension Configuration template +# diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_emconf.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_emconf.php.twig new file mode 100644 index 00000000..65537e2e --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_emconf.php.twig @@ -0,0 +1,30 @@ + '{{ package.title }}', + 'description' => '{{ package.description }}', + 'category' => 'templates', + 'constraints' => [ + 'depends' => [ + 'bootstrap_package' => '10.0.0-10.0.99', + ], + 'conflicts' => [ + ], + ], + 'autoload' => [ + 'psr-4' => [ + '{{ package.psr4Namespace }}\\' => 'Classes', + ], + ], + 'state' => 'stable', + 'uploadfolder' => 0, + 'createDirs' => '', + 'clearCacheOnLoad' => 1, + 'author' => '{{ package.author.name }}', + 'author_email' => '{{ package.author.email }}', + 'author_company' => '{{ package.author.company }}', + 'version' => '1.0.0', +]; diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_localconf.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_localconf.php.twig new file mode 100644 index 00000000..0dfcdc81 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_localconf.php.twig @@ -0,0 +1,12 @@ +'); diff --git a/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_tables.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_tables.php.twig new file mode 100644 index 00000000..25a831db --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/8.7/ext_tables.php.twig @@ -0,0 +1,2 @@ +Resources/', + fonts: '<%= paths.resources %>Public/Fonts/', + img: '<%= paths.resources %>Public/Images/', + js: '<%= paths.resources %>Public/JavaScript/' + }, + banner: '/*!\n' + + ' * {{ package.title }} v<%= pkg.version %> (<%= pkg.homepage %>)\n' + + ' * Copyright 2017-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + + ' * Licensed under the <%= pkg.license %> license\n' + + ' */\n', + uglify: { + all: { + options: { + banner: '<%= banner %>', + mangle: true, + compress: true, + beautify: false + }, + files: { + "<%= paths.js %>/Dist/scripts.js": [ + "<%= paths.js %>Src/main.js" + ] + } + } + }, + imagemin: { + extension: { + files: [{ + expand: true, + cwd: '<%= paths.resources %>', + src: [ + '**/*.{png,jpg,gif,svg}' + ], + dest: '<%= paths.resources %>' + }] + } + }, + watch: { + options: { + livereload: true + }, + javascript: { + files: '<%= paths.js %>Src/**/*.js', + tasks: ['js'] + } + } + }); + + /** + * Register tasks + */ + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-imagemin'); + + /** + * Grunt update task + */ + grunt.registerTask('js', ['uglify']); + grunt.registerTask('build', ['js', 'imagemin']); + grunt.registerTask('default', ['build']); + +}; diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Build/package.json.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Build/package.json.twig new file mode 100644 index 00000000..26bebc41 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Build/package.json.twig @@ -0,0 +1,18 @@ +{ + "name": "{{ package.composerVendorName }}-{{ package.composerProjectName }}", + "description": "{{ package.description }}", + "repository": { + "type": "git", + "url": "{{ package.repositoryUrl }}" + }, + "homepage": "{{ package.author.homepage }}", + "author": "{{ package.author.name }}", + "version": "1.0.0", + "license": "GPL-2.0-or-later", + "devDependencies": { + "grunt": "^1.0.3", + "grunt-contrib-uglify": "^4.0.0", + "grunt-contrib-watch": "^1.1.0", + "grunt-contrib-imagemin": "^2.0.1" + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/Controller/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/Controller/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/Domain/Model/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/Domain/Model/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/Domain/Repository/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/Domain/Repository/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/ViewHelpers/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Classes/ViewHelpers/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/RTE/Default.yaml.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/RTE/Default.yaml.twig new file mode 100644 index 00000000..282236ed --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/RTE/Default.yaml.twig @@ -0,0 +1,9 @@ +imports: + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" } + - { resource: "EXT:bootstrap_package/Configuration/RTE/Default.yaml" } + +editor: + config: + contentsCss: "EXT:bootstrap_package/Resources/Public/Css/bootstrap4-rte.min.css" diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TCA/Overrides/pages.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TCA/Overrides/pages.php.twig new file mode 100644 index 00000000..beb3dd60 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TCA/Overrides/pages.php.twig @@ -0,0 +1,19 @@ + + + + diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig new file mode 100644 index 00000000..8213cfae --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig @@ -0,0 +1,4 @@ +# +# BACKENDLAYOUTS +# + diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig.twig new file mode 100644 index 00000000..628a7254 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig.twig @@ -0,0 +1,29 @@ +# +# BACKENDLAYOUT: EXAMPLE +# +mod { + web_layout { + BackendLayouts { + example { + title = LLL:EXT:{{ package.extensionKey }}/Resources/Private/Language/locallang_be.xlf:backend_layout.example + config { + backend_layout { + colCount = 1 + rowCount = 1 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:{{ package.extensionKey }}/Resources/Private/Language/locallang_be.xlf:backend_layout.column.normal + colPos = 0 + } + } + } + } + } + } + icon = EXT:{{ package.extensionKey }}/Resources/Public/Icons/BackendLayouts/example.svg + } + } + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/RTE.tsconfig.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/RTE.tsconfig.twig new file mode 100644 index 00000000..38353247 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/RTE.tsconfig.twig @@ -0,0 +1,8 @@ +############# +#### RTE #### +############# +RTE { + default { + preset = {{ package.extensionKey }} + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig new file mode 100644 index 00000000..55f97ce7 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig @@ -0,0 +1,11 @@ +# +# TCEFORM +# +TCEFORM { + pages { + + } + tt_content { + + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig new file mode 100644 index 00000000..9d4a5e4e --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig @@ -0,0 +1,6 @@ +# +# TCEMAIN +# +TCEMAIN { + +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TypoScript/constants.typoscript.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TypoScript/constants.typoscript.twig new file mode 100644 index 00000000..32904169 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TypoScript/constants.typoscript.twig @@ -0,0 +1,60 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +############ +### PAGE ### +############ +page { + logo { + file = EXT:{{ package.extensionKey }}/Resources/Public/Images/logo.svg + fileInverted = EXT:{{ package.extensionKey }}/Resources/Public/Images/logo-inverted.svg + height = 52 + width = 192 + alt = {{ package.title }} + linktitle = {{ package.title }} + } + favicon { + file = EXT:{{ package.extensionKey }}/Resources/Public/Icons/favicon.ico + } + fluidtemplate { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/Page/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/Page/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/Page/ + } +} + + +################## +### EXTENSIONS ### +################## +plugin.bootstrap_package { + view { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/ + } +} + + +######################## +### CONTENT ELEMENTS ### +######################## +plugin.bootstrap_package_contentelements { + view { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/ContentElements/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/ContentElements/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/ContentElements/ + } +} + + +################################ +### BOOTSTRAP SCSS CONSTANTS ### +################################ +plugin.bootstrap_package.settings.scss { + primary = #eb3e4a + secondary = #013859 +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TypoScript/setup.typoscript.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TypoScript/setup.typoscript.twig new file mode 100644 index 00000000..00a04208 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Configuration/TypoScript/setup.typoscript.twig @@ -0,0 +1,30 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +############## +#### PAGE #### +############## +page { + includeCSS { + theme = EXT:{{ package.extensionKey }}/Resources/Public/Scss/Theme/theme.scss + } + + includeJSLibs { + + } + + includeJS { + + } + + includeJSFooterlibs { + + } + + includeJSFooter { + {{ package.extensionKey }}_scripts = EXT:{{ package.extensionKey }}/Resources/Public/JavaScript/Dist/scripts.js + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/README.md.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/README.md.twig new file mode 100644 index 00000000..8b095c79 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/README.md.twig @@ -0,0 +1,4 @@ +Sitepackage for the project "{{ package.title }}" +============================================================== + +Add some explanation here. diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/.htaccess b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang.xlf.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang_be.xlf.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang_be.xlf.twig new file mode 100644 index 00000000..8b09912d --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang_be.xlf.twig @@ -0,0 +1,17 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + + Example + + + Normal + + +
+
diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang_db.xlf.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang_db.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Language/locallang_db.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Layouts/ContentElements/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Layouts/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Layouts/Page/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Layouts/Page/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Partials/ContentElements/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Partials/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Partials/Page/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Partials/Page/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Templates/ContentElements/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Templates/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Templates/Page/Example.html.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Templates/Page/Example.html.twig new file mode 100644 index 00000000..2b67bb11 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Private/Templates/Page/Example.html.twig @@ -0,0 +1,22 @@ + + + + +
+
+
+
Template file
+
+ typo3conf/ext/{{ package.extensionKey }}/Resources/Private/Templates/Page/Example.html +
+
Backend Configuration
+
+ typo3conf/ext/{{ package.extensionKey }}/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/example.tsconfig +
+
+
+
+ + +
+ diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Css/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Css/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Fonts/.gitignore b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Fonts/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/BackendLayouts/example.svg b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/BackendLayouts/example.svg new file mode 100644 index 00000000..d05abec2 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/BackendLayouts/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/Extension.svg b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/Extension.svg new file mode 100644 index 00000000..d8536373 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/Extension.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/favicon.ico b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..46d4c14df35ee4ccdf7c5a7eba53f00bc4457963 GIT binary patch literal 1150 zcmaKszb^zq6vrP&t{`y*Vj}8oqXL6Y$R~|E{BN6xxSFH~V-8J?S315x+S4 zj-Y)ybmKo(YfpQ6?x1gZYOBicJEMBKKl2?Y;7851p!}yw*Ju2g^_YOA4@`k=u$$QG%PiuMovJt++@ORg$yF+-?obfjA|?e@V(Z#s}~VJtDD0 literal 0 HcmV?d00001 diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/logo-inverted.svg b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/logo-inverted.svg new file mode 100644 index 00000000..f465b080 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/logo-inverted.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/logo.svg b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/logo.svg new file mode 100644 index 00000000..dc1615ff --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Icons/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Images/logo-inverted.svg b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Images/logo-inverted.svg new file mode 100644 index 00000000..f465b080 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Images/logo-inverted.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Images/logo.svg b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Images/logo.svg new file mode 100644 index 00000000..dc1615ff --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/JavaScript/Dist/scripts.js.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/JavaScript/Dist/scripts.js.twig new file mode 100644 index 00000000..af832405 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/JavaScript/Dist/scripts.js.twig @@ -0,0 +1,6 @@ +/*! + * {{ package.title }} v1.0.0 ({{ package.author.homepage }}) + * Copyright 2017-{{ 'now'|date('Y') }} {{ package.author.name }} + * Licensed under the GPL-2.0-or-later license + */ +console.log("WE LOVE TYPO3"); diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/JavaScript/Src/main.js.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/JavaScript/Src/main.js.twig new file mode 100644 index 00000000..a5e49024 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/JavaScript/Src/main.js.twig @@ -0,0 +1 @@ +console.log('WE LOVE TYPO3'); diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Scss/Theme/_variables.scss b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Scss/Theme/_variables.scss new file mode 100644 index 00000000..4a4e02e8 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Scss/Theme/_variables.scss @@ -0,0 +1,3 @@ +// +// Variables +// diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Scss/Theme/theme.scss.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Scss/Theme/theme.scss.twig new file mode 100644 index 00000000..5c34ad17 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/Resources/Public/Scss/Theme/theme.scss.twig @@ -0,0 +1,9 @@ +// +// Variables +// +@import "variables"; + +// +// Import needed Bootstrap Package Files +// +@import "../../../../../bootstrap_package/Resources/Public/Scss/Theme/theme"; diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/composer.json.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/composer.json.twig new file mode 100644 index 00000000..f159d0a7 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/composer.json.twig @@ -0,0 +1,21 @@ +{ + "name": "{{ package.composerName }}", + "type": "typo3-cms-extension", + "description": "{{ package.description}}", + "homepage": "{{ package.author.homepage }}", + "license": ["GPL-2.0-or-later"], + "keywords": ["TYPO3 CMS"], + "require": { + "bk2k/bootstrap-package": "^10.0 || ^11.0" + }, + "autoload": { + "psr-4": { + "{{ package.psr4Namespace }}\\": "Classes" + } + }, + "extra": { + "typo3/cms": { + "extension-key": "{{ package.extensionKey }}" + } + } +} diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_conf_template.txt.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_conf_template.txt.twig new file mode 100644 index 00000000..e87dc9ce --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_conf_template.txt.twig @@ -0,0 +1,3 @@ +# +# Extension Configuration template +# diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_emconf.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_emconf.php.twig new file mode 100644 index 00000000..384c137c --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_emconf.php.twig @@ -0,0 +1,30 @@ + '{{ package.title }}', + 'description' => '{{ package.description }}', + 'category' => 'templates', + 'constraints' => [ + 'depends' => [ + 'bootstrap_package' => '10.0.0-11.0.99', + ], + 'conflicts' => [ + ], + ], + 'autoload' => [ + 'psr-4' => [ + '{{ package.psr4Namespace }}\\' => 'Classes', + ], + ], + 'state' => 'stable', + 'uploadfolder' => 0, + 'createDirs' => '', + 'clearCacheOnLoad' => 1, + 'author' => '{{ package.author.name }}', + 'author_email' => '{{ package.author.email }}', + 'author_company' => '{{ package.author.company }}', + 'version' => '1.0.0', +]; diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_localconf.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_localconf.php.twig new file mode 100644 index 00000000..0dfcdc81 --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_localconf.php.twig @@ -0,0 +1,12 @@ +'); diff --git a/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_tables.php.twig b/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_tables.php.twig new file mode 100644 index 00000000..25a831db --- /dev/null +++ b/packages/base-package-bootstrap-package/templates/skeletons/9.5/ext_tables.php.twig @@ -0,0 +1,2 @@ +lDLDW&BM;RqrqW4asml!RCU_@^* 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%0AyS_s=~9L4YxL`86LYdD^ljNp2z2i} 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%0Ai%@Y`eb7>KCT@3p()GbtfeWF$oASZnzyO)h%oga zN85R{c^T)aR;!c1w!m!v9|~o3_(+G}O;07%#XHolo&6L*M(##*V!jJ0{BlnvG6*pV z4Iyh{uEJ1*V)=f)GP4}|qBT58d`l)3+!3*a?v*0RdzNLRq?_Nhpod<=ZCL89-RLTy zf9X`|p)pv;G%3gGz-6iS2SIl2aJF-nyeYrFbwW5~s`zghnP+Xlh9q=ZBrauQ>K3l1 z@_57({|ew3nNa$(v`9jh*?^$@i0n4dvT2(UV7GZ|0VLI2Zq|k>1EL;%o3i6yEPFj~ z)H+u|x}N=})l-->HiftL_u)eXY?&$WFp#!yG-yJ!q@#~KQvd9p6vr)6<=dWTEv2NH z%8hUcnYsdPoX0HNDX|;(gbQ0W7c~agZ1Z5F0;epDF1mLahwsp$h}Qkz+%vk3y?H4U z!s8gQTwqu93qNg`Exs?Z*>P|r2$H~Y+wx(y412l8rUB}>?F{y9PAO5D95MHmqBDSG zLyXP7us*W1w&v$YXwc&!2K(Lqp}sT$d9kHv#XY-x7*h!n?w;_#o7r^5)&IsHGCGB#`+2TT@lY`?^a-`79um- z;s;r~`uOp}4*GR&vEI~IvmJN{qq*9M9h@o#=XI0711D1B0N1$G(A3*phc{x;mZaT;~x~nl_Zfdx$uwXBsP;kL`DX%!3l{P8G{pA?3iU(2(v`Y zCk|{-`4Wgkv4qv!aFt?XdTS)dqgBJ^)olv`ZiHJ&b8%3UC+QO#aprn_arSriuM;dx zTwcnje08uN6NW>Cd|WL;AJ{tO&*M89#ial{-g8Jiw{Ie#A2?yw*x(grk-na>R_7U% z9}j3ZVeXFCL(oRS;R?#1O~l+R2k$*}0VCP{A|H1R+87~*Lt9fDXeg4pUL^3;0vc8q zqt`+?*9gP9jmQZS3p!F?91pW}&;ZU3b;Vy%{Kqnjn3-ZZu3-jJgAtd?&c~|bH*?AR zbeX~8w-7_1Vd3FY$>zt&7vCcO@Mrb9;8xbYA8%9B`YKm^>0RZKjgiMMHR`X@c`aO~ zUx!D{S&fcE`@~Y8oBC zHpQa{pX3zv!jU^S^$PqiTackgx7bwbx21;wCjPCv1*K9+NG(`9%!ixPd97@)@!EIx?#1 zQ_M=y&P#UplybbnY|D>3Qb_hF*`$XM5yl(sud`t^&B+*ooND%-)e1PDPcL@aygtsZ zapSK@!xlb4 zfd9C|e1KQ~o>ycIO%+U6e27>RcC$9Nmm%DMq)5YKjX;l~x*dOSTCcWLMU=diuq*m* zHK3Y0xAq05qp*rE<@V^RW~}B;-0U}Gm*FYh$}&+_Ho03bZr&1YgQ)sUI7g3U)n_v@05GYvYM#1Jd zw_9iXMe66lB+mKk^kQ3eI8ef9Qy-K`mFyjiIn!I$1k?V36#m=k1E%&^@O-nVD(8kT zgjL_JuDBsIybl6)6m&LL6BNbqS~)E_ji5a`9iv3bcbtvAv@((H+}(_kV>f)i4`Fhw zP}~c53F>U}t5VIa`g8jEZeToo>7BXyl<4QBiwXiIiHaUF) zJY*T@KbH0Pb#4NAQ;V#!tMgZ^LoBfA zlR+qUpQ$U_=)aj!#svbIft2OPjtKfdSBZ}E;CB=BJt;*DHJj=a^B24kI9_p~;=Z5( z9feZ|-KJ=Do|x1*N&F9*Yqw-ygN0ilDJ0#qSV6FjUJ^6ykewbXFGGD4fNuW0Qf2yN zvN?Jr5O${Y(V#b_;J1auXji)`@3M<;Xna7qkhn}4sF^IKX*Iu#HhQYor%7v4V-a^k zac5-GWtc3S*XYWXg>(EOGWfzioUg>NbSbfo8A9z$_vux~v;|_7f(n**;GGJT%W>}t zo7g+aJhF2e$PE3>l#83Vu<970)QQT^zFefN!xTng$lI48;k=7GzJ0No+W&ycC5twInIQw z5s=!9gO}(%hQ6Y)dB@X;p75raPgo9_E)60PE-@SCknC2u4>eE^%dox8Jl_5vHO3=h z9jyd)L@b9Zubecsk~pf*QPOh;z(4sRPO@g9$k97wFvV+P!|1pU=dJYJjqCwwlS~x} zE%^?gxaivZaXl1a7xs7+ksaR4>v)IZ=6+#+-fYODPJJYmvHPf|dSl{ATKN}}WM^Qi z98Z}gCC^+SDDoc=ekRL48WNh!O7Q5yXHg7h4{wEE;7t(#u~?DZCwi{gV07UDKK!EI zS^GI#z%5k5ynbHfa=M>#?tIr_jFlz#5I)HtawftG#LS`%Hr2Z_F*vC*#9#kphs5?v z3TNI~ChU4$;lOLqhu-ETZB2^M2<;7}cT_cfx;h34VXvg>pDpdrBVXdbX&*3waR0$| z`IFuAgPuy1^uQ6^Pl}nA)$cUPcjFQE`x=R9!ZmxDbn56P2@0P#t0JDFKhh%uFGn`t ztjv~5T7qPu9Ln1h#edrr>i#!OrUXo_fCF7Wyynzi>>VV-KrD=9FZX{(PC+e%(_L8624My--tARfKd;T%__sYd={5pPSMt78q$TycIg`<93#(<arbEh`(DgKp8A)9HV%~K}{yKl~>&Q0XwKgc2~)MkuEuC ztgw*#t7ZZ6z0bA1D=x{%e8@mVCVqmwNs&U-9Q}W7|}J7fa=1!?CLIlhRFAW=cljh+EoSV znUh(h>{OsnKofBu_K-+N$2T%VBXdhL6{%IP6b77EZUn+#TJ4k8Tem!)h2b>{WeJ0-GKi zKZcb^%UkM%(Mi7ZJ4{Bfn0rDPe^?d{@l6zJ8;lrf8uU}qfA{+BnN9kR6SDZuMbJJF zQmh;2(o%>%7XRWb&HmXqn~RH3qCF?<&?UG_m{?<|;+KAD%iaYZsNVXEhCrXU0rjcM z&$w3S%t|(GYYC&*xeH#3i&~rgw&#|+=;bByU>CQ+gfa_18Vy(j0(-&&aAL0SWjGEd zR4|A>Fr`eHGDoeIlqm^?fl}CW>I>%xQd*EC#g=Pi{poe?S4%v8z*~2Cf(3>p=#W49 z7k3WIAyw6~L_@W6KJ1`UY|0dgoZma>%jGMy)Yvr%r;tT6I@n~42Yb6WQj#pEi|Z`x z^P^m|?$w^LRJr6=Tev+u8BGL952G3lCQ?c3Ul&3S<8OYrg!bdr(GjU)mGCL-gudnK zc?_&g39^?J)GyAe&8%)4j~z;`4q3#mUQ~(DBx9o@BHCK$^Tdp}vqS&oQC5%CK~zQh zXKR6#97{(w#v2&sdl?>UZhY&Ve*$NCl-QK5;NQzrh(rdJCy1BUPXFUU8Nci0%e!g2 zSFa#jMBsy&ix#FV!I4)c803XA_jZ{lzKV)CYx6SQ#_CNU_%F3}SejW$guADOe5v}& zhiP$0SkCokjFG?+^S;`QW@9Ay#s=6FE=T=187?aosozZ7sk?Vf$WvsaOfy>b=JtcI zFV^uazCG#dDj{YAhnLL1@ziLnAE7C9Pi<&lQQ<%IEFRyFpEeotY1Fk@QR0G|Jsyzl6d#DunUFWH*bx!GId0V=A^uK$mJMlF(F5iG3BqY zBIOXqp>N+fLoRmL9pRYkbSl+-2Ggl~R3lN`(xVj~&e(PijRno5an7fc!=?0>c!L|; zRa*m}I#FDxn<(A9kr4X*y(|q#BE$t6lZP*wqXACSAo-jzK9W%7v8xnObMt^Ok&O*X zR_%Bkp;O1~@ZjAZ=Mne_7W3%nDrm?1*RSFLhy4tG)|~CT4E+(*GRhA|<6iGHmp<)` z2U6IbJ>po4t!%Lx>yZNJ(DgF`A5 zBeh=hm}--N9Dc-R{F~iGyQ#NterY4Ysgw*KKRzha{3VSjKyGRJ5XiNu^SRE7HwGPS z!c}GU+l4_(c?%44Tn-e-N@F`_SpEbdZZ0f1y5t=mnL7P!6U}Q1yn#kaw|!{B(AZbV zaEqFe2Yjb&zp16v2RBCE>N)?#O=mG}Jh?9TRqNEqDUrFcXj%HROoN->&YT7;dL;kZ>j zEuqts+4oBv9fV2#R7|X>5g1KL;Ps6_oQ~k7)nmq#lG#@?!Z{iJbnrmW+F%ju+Zd8%2HE}2?cFzx4HX>aLuV&Z_(?n?+|LBn_0To`w-`$}TTvTAW|Yw8Gn2^OwhJ=98<1#jNJEg&Yb;+HxPq zI`m)8kEn4GEH&zQCY$>Ty!79X@P=~S7>l$rfJuK!E-b2QP1sTxMI;?Mf=cwCnaX>sW=7dC?VCTS7tS z0$?K*TeEPn2rnvhcU^d2jrS6~V_1W|5hoWiBk}%{fjO%f!_mSP-)es_g1m8(p|POM z>OLmJfSuG=qCL_Tz4F^Ihrs7-hy3kUloSt_=b>Q?(xt!4Ag9|fB?ExHp44;3x5UEk zN@dO}APK9up2(&C$k?E|!X%i_B1rJDhQvH0?_FVS_>y-T&d}pJXmtb0kmAcFJxq<> z(0!w&*+^gTQ5r_nZ+uhMUwF7UhB$kv)=Vlc|Fk$ILw7JcV6b6!7X?ywz;>dI^3uNv zD>f$ndTB@U{49OrdMI;V13NND69fAm`0Q_ytb$43?RL2Ii0vJZYX)4Vx+veD@->IP z^?lKZ-VlviUe~Db)%x9HD{JDeV3Bwhbiz5SF<)P_$P^Otdv`wk z1daM(o%yRtLy#nwE<%;~?xGeag6o8}9r@o#qhxNiI`Noow6zW+lSHPxh(oH)Kf#k- z*fV2?5pTv2t?R=Dbole^Hvshuy}WQUgf|GX!>Wj*QCHgzzac@IKt3SxL6v z&oz^j&&s@u>T&wwc&fGCZU5a# zV5-`l#G1$wD)*~gi{Olj34Zq7Df)N7=Y=|`PfW%?%~+wf5HB&xndv(+Av`MSTCn0+ z;OFdVV{X=lo+G?P1umkLp}#wm)(_-&}6e+#kJOnjLXY> zoh;Q~Q@Jj5oyiR3UBBn6_&Vuz!lADVbf!w(ZZ;#tz(JhO+7n<NQiE_ee3`*Zz? zdi=?fp(Bo6l&Gv@w(y@U`gYVfi8j;+V)-Ma)R5q&e*{HV!A$ zk0lE9A@Pcg??E^i61ucuNz_W#?P`~nq5tko28!qll6dbdty5JE-?pkKR~JvoGlo@n z-A2=^CL*=`m3jK8Qc_(3%Km3Kaiv(CuZ)@?!B}2Y6g^*hRg~SG2^RP`ag~K%8R1lY z5H+^ooY&7P$E*-&a1|3T016eLNk42mr5zqvaCx!)_jC&ivzW9UY|XA%mkn8eZC)BQ z4;o}>(WLa>hZBX+TUnI;s$wkjG<_DA`#Lsu*s0tpZvMrYrao80 zGOHx!r{T&IFIVDE0QGIeJB6zv(sD>gAIVDjzYOQ_KW=)F{q|-w)@FB+uk7(U;mH&M zXT}R9qC)lzy(q0^-+oPVs7yvmfO6^ACCZ8yxyDdCu6F@PL7xrNRR*xNTZb!5)iboE zowAjKb}3?#OgA!`ZI#|V8e-~pb|ke38~nU~a?oSej3J}?_W4T#y1|yWu!1&BkOHZJZt>!YyTMaxxx1ML3zg3rqgo9 z({>7$L~m*gv@;?dXUV{%-on#UH*Mzl?*eICS#(j6vA-1YW+xCLG+==N`rqQG#&{R@pALx*O$4w=37r%A*t!=+pknV!DqL zoC8k)@YhDV1Im+`dkE(Y+#T{3nH?ngc3A=NH!Q-{$zik2A;ng3vIS25P!|NH0rmHD z;_EJ~0YrrwonJQVpE{bFtYx$2{W5>=fBf^P4{THI=l~*IvwwES4?v?$)!`Me6Shl|s zRn~$7%{$=>MfG$0f18`nDrQzu-(%SVaMF?J(@q1dxiUdf@b*P;v(gy&+i%eB_dpo~ z-ztzM7L`Y(WXzwxvkH|cw2Rk|2lbcjS2gR?Tucat9y^QV$1U#A?B7uxVDHP36Ny!p zygu*R>nwJ6gQJ_LWyNl&iFMblJW{H1^mvqSmkFx36Mc@7-PWrFJvq@u2ET5B>ESIUw7) z5bcuYeSZi)b8Rp@S{EZ_N<}KqFC;AM)OR^2|&q;_sUGcD7$bQtqb<2 zNzl2&9p?19R{hxmK$-dtp#E~`5< zeQyT%Eoj^~zAmb-_|8VV92yn+oE>FuQ=OJ|&VeEA%FP=Wg%>vuc_Bt~soTur|_ zoL8GKqF6^T@-FaY8yRSj=6w zRe3YRjlba}j}T>>w$H6FbQuELUp3tvxY~Vy;A2>3YgR3e^tI?L`0rQt)&X8eGlRo9 zd$+OOx#rc58mtWWX}=}Cx$U$=$ViaepX6P;w)7IT_QQbIGU(Ko!Va^orHE&;5>r3@DJncJQB=Wc~|R@L`E8prI8ycObd%W+dc zP4^XoC*%5BDKvgp6^*V@0&OFot{O`ke%xp>+Zlx*?~XRRfj)W+Qj3_Jl+5`SAR(c+ z4D^zWLVAfuQgJzx&LE=^Xv&~+;?9Q~PYTr2+Fk%(bJ`=yc3vys^ zQbLX;nLYGi26b6_-N_JRq6WhxZQZD0KJ%u{ckzWT%FB$!nRRL^o@b`bJK=>FahG6- z=7Bd$wCpRj`-ACRNcthEN(Bh~&?}g9C}q@rW2S8J`n)qTp#YoNMA#4dy|ASX_P(Ss1*+IR6Onty7s-g50%*+`5ppG9%b*! zI131>xqcu1W6TZYx5#?Aop62Gi)+M!>p5iFe8bPa-9phY2j)ujJtU{poI46HPab`7 zi}qMuxvu4h&1=EL9D(RtxK(BzbKdTW$OpGhVpr#h=v;}av)6Y=QKQ=hqTthV^!}b6 zfXF4b(tKs&?JFGSAV~wLdi)|0*&yx!1?cQ<`dtS!H?7>RX&&y*af3q!8bn{O0`FTo zBxCBEI#&2i_RofTcMjSTFQB#V?$50|i`x!uA-ZYJ6|h6=Vh#wQit*lx?$c*P~Qz7Q7n9X&A8ODzWR8b37k0gv+ARr7^U)8QVhb4+~7cJ?MEB@4tMfKHv$*Fy} z+N7=&nY;^A#V%VkX59Vut+^{F@#dwq(KL1 zzVoFM6n2_C!d#}KYFHV4pu^s!wI2pGCf^5}!~mO6bZvs>=CE#LUIP47Mp z^lfr+(VhL%ZMo?!{6TP6F3Ae9y8V`wiutazTvv!pdQd(PxwRUzQ*9m>0^io8(ohKljggZk`Bt&Wn55sil* z75v(*Eh2qH6o{^7Y$S9$IQxK(4(b$@>^j+dz!7Hb+WRr`rgi~$Nu#-S@s#2pcF;~A z_49+9bY?O1$^vyq=8zOxd3Dt_5@`HVifO~l0d-+ba!`@{e(kxdi!fhB&4xa`YxIu~ zatK8~QwHCiQ3ve)8u`r&w-jI91oC(4X2lfFnj)Rkim1?4)R*tELv*+a2>2JOp(Bun)%Nc!bNJWk5s zrpPjpAu~XL`@V*Pxzi_*?E_+mRFeaS?B{@QRg0>!17EMff^4)N2dr4jX#bQ{Nhh!E zg4NbK9}~VhyDpE}`KWj_(F*baGF`RO*=RxWwIVoGYc8HlZ8GdE7ckX1@Dd>VG3VbB z5Xe%#Nd5L})Y$#?)^D%796&Hfm}@6v*7OPZi{90xyw3H)yAb7%n#%L_^(ye!A^7vI^UXd9ef0( z0{ZzsG}s=9R$E?0Ajh5Vv9FCa(yZci1=9wTk>DbYhg+w93M*CLCauqeKFijh3jH~rOe~MFlshW1 z92|kd`<2FyC*f{z?xH6n{lnzB20-Gz({b~t#oXzot#4ZGEw}zFWVUb3Go8B=S`h{E ztjxxmWzODQ3{lm>34RN{s>WKrUJkBW8r+by^_{P~F=q8no_kqk9X(w9KV*GlaAr}{ zZESPmOst9h#F^lUZQHgdoY>~Xwr$(CZR6(sZoT#0s{5yZb@i@OefB=xeb!#f3nSgs zUh__0#*1L_Xl}5z{HChntgzu_v!&LO-W6i(!o@S2PZ!R6J_Xx~E?kr$w+}NfFOz)< z5U}7n@Cwj%sp_HW>z|BV^35k~FUo9}yM(T0(A-K|Jl12-T!T!n8>pWAjJkN@3ccoo zQS&rVNzrA=KBrQA^GdODNdp9TdssYKt<^)te0|ZAwp!o7yO{Z`PE@RWa?J3`&$l$G zydBl}0>H&uoshe(Hg%Uid}o$frF*>RBsk-a<&`#D3ju06pSoEy(u4L0^@#^<{3;l? zuA4Q?lVzUz%0nD3GAc3FpqGvf&=W_7QbbDxz7Ia3zUd|)!$H>> z{~D_){Da)JzievG9SC*kp11}cA=JLYNhHLa-o_K_rnY8YNPwSP+asNN_-ama5lB&= zuCUn*P*X1hEnm?c-wYCTfUCF8H-#e}mW_B<6ZXl$6>TFr2ry!CKML{q`rq<03W>^C z7c{hLDv8!3xfL{{aR&~GR$=u6%s_E6eSb0-3ZrupI`$(*u8_-Azdc2n2Vwyn0E{;!wbueT_zR;5@D9flJ}*-ZK>-T1iIt$(QPiVB97(jET%iV9O% z$Z-r4xu1_u;ml3PmAXWg4DhpB{D3o>mHW|$T91U%e$BD{DPh zCHkrWW~U%*onND8Zhap3?k@*%QaVrKaqVK<88o3z8!kW8mV3B`O6gi8#GU6h+bmxP zLyxnO@G%LW;NvbO4?pJSDw)T!-*n`&QN4WTQw#!wOZ^m~_);E$+)mo9jSQ57w6_ga zM;~0R@}Q zSxqH>xeJ#<+t?frkm`iiAA^9Ohj`=<3A}E;8ZE-nL=&e%#vXBVNHFM>mEz?n`u8EJw7rppLwOQtP8`N7qoiuQ^AU z!VmqP{dLHfvSmXS7R=wO0_`EqU-m`O)Tq;be_jZvuWQ7ZaY=3iu){|udhX`UPalij zm&!~~TTP(&oatz7f1qq~#i<}8!(W^fu_$Pv7O>zmU!7hCZpzDB47CmM&K?f&#U(y% zG0+YeII9~u6p|1Ha2R#I%|ydVK)(z_*N)B^%fPxFci*B+_Dew_1Yk5E2-lXj=xO
+ {{ package.author.name }} + {{ package.author.email }} +
+ + + + diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Language/locallang_be.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Language/locallang_be.xlf.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Language/locallang_be.xlf.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Language/locallang_be.xlf.twig diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Language/locallang_db.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Language/locallang_db.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Language/locallang_db.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Layouts/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Layouts/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Layouts/Page/Default.html.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Layouts/Page/Default.html.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Layouts/Page/Default.html.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Layouts/Page/Default.html.twig diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Partials/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Partials/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Partials/Page/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Partials/Page/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Templates/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Templates/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Templates/Page/Default.html.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Templates/Page/Default.html.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Private/Templates/Page/Default.html.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Templates/Page/Default.html.twig diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Css/layout.css b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Css/layout.css new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Css/layout.min.css b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Css/layout.min.css new file mode 100644 index 00000000..e69de29b diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Css/rte.css.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Css/rte.css.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Css/rte.css.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Css/rte.css.twig diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Fonts/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Fonts/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Icons/Extension.svg b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Icons/Extension.svg new file mode 100644 index 00000000..d8536373 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Icons/Extension.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Icons/favicon.ico b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..46d4c14df35ee4ccdf7c5a7eba53f00bc4457963 GIT binary patch literal 1150 zcmaKszb^zq6vrP&t{`y*Vj}8oqXL6Y$R~|E{BN6xxSFH~V-8J?S315x+S4 zj-Y)ybmKo(YfpQ6?x1gZYOBicJEMBKKl2?Y;7851p!}yw*Ju2g^_YOA4@`k=u$$QG%PiuMovJt++@ORg$yF+-?obfjA|?e@V(Z#s}~VJtDD0 literal 0 HcmV?d00001 diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Images/BackendLayouts/default.png b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Images/BackendLayouts/default.png similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Images/BackendLayouts/default.png rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Images/BackendLayouts/default.png diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/JavaScript/Dist/scripts.js.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/JavaScript/Dist/scripts.js.twig new file mode 100644 index 00000000..af832405 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/JavaScript/Dist/scripts.js.twig @@ -0,0 +1,6 @@ +/*! + * {{ package.title }} v1.0.0 ({{ package.author.homepage }}) + * Copyright 2017-{{ 'now'|date('Y') }} {{ package.author.name }} + * Licensed under the GPL-2.0-or-later license + */ +console.log("WE LOVE TYPO3"); diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/JavaScript/Src/main.js.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/JavaScript/Src/main.js.twig new file mode 100644 index 00000000..a5e49024 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/JavaScript/Src/main.js.twig @@ -0,0 +1 @@ +console.log('WE LOVE TYPO3'); diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Scss/layout.scss.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Scss/layout.scss.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Scss/layout.scss.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Scss/layout.scss.twig diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Scss/variables.scss.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Scss/variables.scss.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Resources/Public/Scss/variables.scss.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Public/Scss/variables.scss.twig diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/composer.json.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/composer.json.twig new file mode 100644 index 00000000..bedc162e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/composer.json.twig @@ -0,0 +1,23 @@ +{ + "name": "{{ package.composerName }}", + "type": "typo3-cms-extension", + "description": "{{ package.description}}", + "homepage": "{{ package.author.homepage }}", + "license": ["GPL-2.0-or-later"], + "keywords": ["TYPO3 CMS"], + "require": { + "typo3/cms-core": "^10.4", + "typo3/cms-rte-ckeditor": "^10.4", + "typo3/cms-fluid-styled-content": "^10.4" + }, + "autoload": { + "psr-4": { + "{{ package.psr4Namespace }}\\": "Classes" + } + }, + "extra": { + "typo3/cms": { + "extension-key": "{{ package.extensionKey }}" + } + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_conf_template.txt.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_conf_template.txt.twig new file mode 100644 index 00000000..e87dc9ce --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_conf_template.txt.twig @@ -0,0 +1,3 @@ +# +# Extension Configuration template +# diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_emconf.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_emconf.php.twig new file mode 100644 index 00000000..d8613ba8 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_emconf.php.twig @@ -0,0 +1,32 @@ + '{{ package.title }}', + 'description' => '{{ package.description }}', + 'category' => 'templates', + 'constraints' => [ + 'depends' => [ + 'typo3' => '10.4.0-10.4.99', + 'fluid_styled_content' => '10.4.0-10.4.99', + 'rte_ckeditor' => '10.4.0-10.4.99', + ], + 'conflicts' => [ + ], + ], + 'autoload' => [ + 'psr-4' => [ + '{{ package.psr4Namespace }}\\' => 'Classes', + ], + ], + 'state' => 'stable', + 'uploadfolder' => 0, + 'createDirs' => '', + 'clearCacheOnLoad' => 1, + 'author' => '{{ package.author.name }}', + 'author_email' => '{{ package.author.email }}', + 'author_company' => '{{ package.author.company }}', + 'version' => '1.0.0', +]; diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_localconf.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_localconf.php.twig new file mode 100644 index 00000000..0dfcdc81 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_localconf.php.twig @@ -0,0 +1,12 @@ +'); diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_tables.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_tables.php.twig new file mode 100644 index 00000000..25a831db --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/ext_tables.php.twig @@ -0,0 +1,2 @@ +Resources/', + sass: '<%= paths.resources %>Public/Scss/', + css: '<%= paths.resources %>Public/Css/', + fonts: '<%= paths.resources %>Public/Fonts/', + img: '<%= paths.resources %>Public/Images/', + js: '<%= paths.resources %>Public/JavaScript/' + }, + banner: '/*!\n' + + ' * {{ package.title }} v<%= pkg.version %> (<%= pkg.homepage %>)\n' + + ' * Copyright 2017-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + + ' * Licensed under the <%= pkg.license %> license\n' + + ' */\n', + uglify: { + all: { + options: { + banner: '<%= banner %>', + mangle: true, + compress: true, + beautify: false + }, + files: { + "<%= paths.js %>/Dist/scripts.js": [ + "<%= paths.js %>Src/main.js" + ] + } + } + }, + sass: { + options: { + implementation: sass, + outputStyle: 'expanded', + precision: 8, + sourceMap: false + }, + layout: { + files: { + '<%= paths.css %>layout.css': '<%= paths.sass %>layout.scss' + } + } + }, + postcss: { + options: { + map: false, + processors: [ + require('autoprefixer')({ + browsers: [ + 'Last 2 versions', + 'Firefox ESR', + 'IE 9' + ] + }) + ] + }, + layout: { + src: '<%= paths.css %>layout.css' + } + }, + cssmin: { + options: { + keepSpecialComments: '*', + advanced: false + }, + layout: { + src: '<%= paths.css %>layout.css', + dest: '<%= paths.css %>layout.min.css' + } + }, + imagemin: { + extension: { + files: [{ + expand: true, + cwd: '<%= paths.resources %>', + src: [ + '**/*.{png,jpg,gif}' + ], + dest: '<%= paths.resources %>' + }] + } + }, + watch: { + options: { + livereload: true + }, + sass: { + files: '<%= paths.sass %>**/*.scss', + tasks: ['css'] + }, + javascript: { + files: '<%= paths.js %>Src/**/*.js', + tasks: ['js'] + } + } + }); + + /** + * Register tasks + // */ + grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-imagemin'); + grunt.loadNpmTasks('grunt-postcss'); + grunt.loadNpmTasks('grunt-sass'); + + /** + * Grunt update task + */ + grunt.registerTask('css', ['sass', 'postcss', 'cssmin']); + grunt.registerTask('js', ['uglify']); + grunt.registerTask('build', ['js', 'css', 'imagemin']); + grunt.registerTask('default', ['build']); + +}; diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Build/package.json.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Build/package.json.twig new file mode 100644 index 00000000..01d38717 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Build/package.json.twig @@ -0,0 +1,28 @@ +{ + "name": "{{ package.composerVendorName }}-{{ package.composerProjectName }}", + "description": "{{ package.description }}", + "repository": { + "type": "git", + "url": "{{ package.repositoryUrl }}" + }, + "homepage": "{{ package.author.homepage }}", + "author": "{{ package.author.name }}", + "version": "1.0.0", + "license": "GPL-2.0-or-later", + "devDependencies": { + "grunt": "^1.0.4", + "grunt-contrib-cssmin": "^3.0.0", + "grunt-contrib-uglify": "^4.0.1", + "grunt-contrib-watch": "^1.1.0", + "grunt-contrib-imagemin": "^3.1.0", + "grunt-postcss": "^0.9.0", + "grunt-sass": "^3.0.2", + "autoprefixer": "^9.5.0", + "node-sass": "^4.11.0" + }, + "scripts": { + "build": "./node_modules/.bin/grunt", + "css": "./node_modules/.bin/grunt css", + "watch": "./node_modules/.bin/grunt watch" + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/Controller/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/Controller/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/Domain/Model/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/Domain/Model/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/Domain/Repository/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/Domain/Repository/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/ViewHelpers/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Classes/ViewHelpers/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/RTE/Default.yaml.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/RTE/Default.yaml.twig new file mode 100644 index 00000000..5d5556da --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/RTE/Default.yaml.twig @@ -0,0 +1,42 @@ +imports: + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" } + +editor: + config: + contentsCss: "EXT:{{ package.extensionKey }}/Resources/Public/Css/rte.css" + + stylesSet: + - { name: "Lead", element: "p", attributes: { 'class': 'lead' } } + + toolbarGroups: + - { name: styles, groups: [ format, styles ] } + - { name: basicstyles, groups: [ basicstyles ] } + - { name: paragraph, groups: [ list, indent, blocks, align ] } + - "/" + - { name: links, groups: [ links ] } + - { name: clipboard, groups: [ clipboard, cleanup, undo ] } + - { name: editing, groups: [ spellchecker ] } + - { name: insert, groups: [ insert ] } + - { name: tools, groups: [ table, specialchar ] } + - { name: document, groups: [ mode ] } + + format_tags: "p;h1;h2;h3;h4;h5;pre" + + justifyClasses: + - text-left + - text-center + - text-right + - text-justify + + extraPlugins: + - justify + + removePlugins: + - image + + removeButtons: + - Anchor + - Underline + - Strike diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TCA/Overrides/pages.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TCA/Overrides/pages.php.twig new file mode 100644 index 00000000..53e0502b --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TCA/Overrides/pages.php.twig @@ -0,0 +1,19 @@ + + + + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig new file mode 100644 index 00000000..8213cfae --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig @@ -0,0 +1,4 @@ +# +# BACKENDLAYOUTS +# + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig new file mode 100644 index 00000000..a16a9db6 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig @@ -0,0 +1,29 @@ +# +# BACKENDLAYOUT: DEFAULT +# +mod { + web_layout { + BackendLayouts { + default { + title = LLL:EXT:{{ package.extensionKey }}/Resources/Private/Language/locallang_be.xlf:backend_layout.default + config { + backend_layout { + colCount = 1 + rowCount = 1 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:{{ package.extensionKey }}/Resources/Private/Language/locallang_be.xlf:backend_layout.column.normal + colPos = 0 + } + } + } + } + } + } + icon = EXT:{{ package.extensionKey }}/Resources/Public/Images/BackendLayouts/default.png + } + } + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/RTE.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/RTE.tsconfig.twig new file mode 100644 index 00000000..38353247 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/RTE.tsconfig.twig @@ -0,0 +1,8 @@ +############# +#### RTE #### +############# +RTE { + default { + preset = {{ package.extensionKey }} + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig new file mode 100644 index 00000000..55f97ce7 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig @@ -0,0 +1,11 @@ +# +# TCEFORM +# +TCEFORM { + pages { + + } + tt_content { + + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig new file mode 100644 index 00000000..9d4a5e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig @@ -0,0 +1,6 @@ +# +# TCEMAIN +# +TCEMAIN { + +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig new file mode 100644 index 00000000..993b020b --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig @@ -0,0 +1,64 @@ +################################################ +#### DYNAMIC CONTENT LIB FOR USAGE IN FLUID #### +################################################ +# +# EXAMPLE +# --------------- +# |'}" /> +# +# +# COLUMN NUMBERS +# --------------- +# +# 0 = main +# 1 = left +# 2 = right +# 3 = border +# +################# +lib.dynamicContent = COA +lib.dynamicContent { + 5 = LOAD_REGISTER + 5 { + colPos.cObject = TEXT + colPos.cObject { + field = colPos + ifEmpty.cObject = TEXT + ifEmpty.cObject { + value.current = 1 + ifEmpty = 0 + } + } + pageUid.cObject = TEXT + pageUid.cObject { + field = pageUid + ifEmpty.data = TSFE:id + } + contentFromPid.cObject = TEXT + contentFromPid.cObject { + data = DB:pages:{register:pageUid}:content_from_pid + data.insertData = 1 + } + wrap.cObject = TEXT + wrap.cObject { + field = wrap + } + } + 20 = CONTENT + 20 { + table = tt_content + select { + includeRecordsWithoutDefaultTranslation = 1 + orderBy = sorting + where = {{ '{#colPos}={register:colPos}' }} + where.insertData = 1 + pidInList.data = register:pageUid + pidInList.override.data = register:contentFromPid + } + stdWrap { + dataWrap = {register:wrap} + required = 1 + } + } + 90 = RESTORE_REGISTER +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/constants.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/constants.typoscript.twig new file mode 100644 index 00000000..1a79054a --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/constants.typoscript.twig @@ -0,0 +1,56 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +############################## +#### FLUID STYLED CONTENT #### +############################## +styles { + templates { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/ContentElements/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/ContentElements/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/ContentElements/ + } +} + + +############ +### PAGE ### +############ +page { + fluidtemplate { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/Page/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/Page/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/Page/ + } + meta { + description = + author = + keywords = + viewport = width=device-width, initial-scale=1 + robots = index,follow + apple-mobile-web-app-capable = no + compatible = IE=edge + } + tracking { + google { + trackingID = + anonymizeIp = 1 + } + } +} + + +############## +### CONFIG ### +############## +config { + no_cache = 0 + removeDefaultJS = 0 + admPanel = 1 + prefixLocalAnchors = all + headerComment = build by sitepackagebuilder.com + sendCacheHeaders = 1 +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/setup.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/setup.typoscript.twig new file mode 100644 index 00000000..1f765576 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Configuration/TypoScript/setup.typoscript.twig @@ -0,0 +1,203 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +################ +#### HELPER #### +################ + + + +############## +#### PAGE #### +############## +page = PAGE +page { + typeNum = 0 + shortcutIcon = EXT:{{ package.extensionKey }}/Resources/Public/Icons/favicon.ico + + 10 = FLUIDTEMPLATE + 10 { + # Template names will be generated automatically by converting the applied + # backend_layout, there is no explicit mapping necessary anymore. + # + # BackendLayout Key + # subnavigation_right_2_columns -> SubnavigationRight2Columns.html + # + # Backend Record + # uid: 1 -> 1.html + # + # Database Entry + # value: -1 -> None.html + # value: pagets__subnavigation_right_2_columns -> SubnavigationRight2Columns.html + templateName = TEXT + templateName { + cObject = TEXT + cObject { + data = pagelayout + required = 1 + case = uppercamelcase + split { + token = pagets__ + cObjNum = 1 + 1.current = 1 + } + } + ifEmpty = Default + } + templateRootPaths { + 0 = EXT:{{ package.extensionKey }}/Resources/Private/Templates/Page/ + 1 = {$page.fluidtemplate.templateRootPath} + } + partialRootPaths { + 0 = EXT:{{ package.extensionKey }}/Resources/Private/Partials/Page/ + 1 = {$page.fluidtemplate.partialRootPath} + } + layoutRootPaths { + 0 = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/Page/ + 1 = {$page.fluidtemplate.layoutRootPath} + } + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 20 { + levels = 2 + includeSpacer = 1 + as = mainnavigation + } + } + } + + meta { + viewport = {$page.meta.viewport} + robots = {$page.meta.robots} + apple-mobile-web-app-capable = {$page.meta.apple-mobile-web-app-capable} + description = {$page.meta.description} + description { + override.field = description + } + author = {$page.meta.author} + author { + override.field = author + } + keywords = {$page.meta.keywords} + keywords { + override.field = keywords + } + X-UA-Compatible = {$page.meta.compatible} + X-UA-Compatible { + attribute = http-equiv + } + + # OpenGraph Tags + og:title { + attribute = property + field = title + } + og:site_name { + attribute = property + data = TSFE:tmpl|setup|sitetitle + } + og:description = {$page.meta.description} + og:description { + attribute = property + field = description + } + og:image { + attribute = property + stdWrap.cObject = FILES + stdWrap.cObject { + references { + data = levelfield:-1, media, slide + } + maxItems = 1 + renderObj = COA + renderObj { + 10 = IMG_RESOURCE + 10 { + file { + import.data = file:current:uid + treatIdAsReference = 1 + width = 1280c + height = 720c + } + stdWrap { + typolink { + parameter.data = TSFE:lastImgResourceInfo|3 + returnLast = url + forceAbsoluteUrl = 1 + } + } + } + } + } + } + } + + includeCSSLibs { + + } + + includeCSS { + {{ package.extensionKey }}_layout = EXT:{{ package.extensionKey }}/Resources/Public/Css/layout.min.css + } + + includeJSLibs { + + } + + includeJS { + + } + + includeJSFooterlibs { + + } + + includeJSFooter { + {{ package.extensionKey }}_scripts = EXT:{{ package.extensionKey }}/Resources/Public/JavaScript/Dist/scripts.js + } +} + + +################ +#### CONFIG #### +################ +config { + absRefPrefix = auto + no_cache = {$config.no_cache} + uniqueLinkVars = 1 + pageTitleFirst = 1 + linkVars = L + prefixLocalAnchors = {$config.prefixLocalAnchors} + renderCharset = utf-8 + metaCharset = utf-8 + doctype = html5 + removeDefaultJS = {$config.removeDefaultJS} + inlineStyle2TempFile = 1 + admPanel = {$config.admPanel} + debug = 0 + cache_period = 86400 + sendCacheHeaders = {$config.sendCacheHeaders} + intTarget = + extTarget = + disablePrefixComment = 1 + index_enable = 1 + index_externals = 1 + index_metatags = 1 + headerComment = {$config.headerComment} + + // Disable Image Upscaling + noScaleUp = 1 + + // Compression and Concatenation of CSS and JS Files + compressJs = 0 + compressCss = 0 + concatenateJs = 0 + concatenateCss = 0 +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/README.md.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/README.md.twig new file mode 100644 index 00000000..8b095c79 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/README.md.twig @@ -0,0 +1,4 @@ +Sitepackage for the project "{{ package.title }}" +============================================================== + +Add some explanation here. diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang_be.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang_be.xlf.twig new file mode 100644 index 00000000..fb3e2d8e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang_be.xlf.twig @@ -0,0 +1,17 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + + Default + + + Normal + + +
+
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang_db.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang_db.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Language/locallang_db.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Layouts/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Layouts/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Layouts/Page/Default.html.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Layouts/Page/Default.html.twig new file mode 100644 index 00000000..ad57953f --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Layouts/Page/Default.html.twig @@ -0,0 +1,21 @@ +
+ diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Partials/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Partials/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Partials/Page/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Partials/Page/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Templates/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Templates/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Templates/Page/Default.html.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Templates/Page/Default.html.twig new file mode 100644 index 00000000..312fc91f --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Private/Templates/Page/Default.html.twig @@ -0,0 +1,19 @@ + + + +
+
+
Template file
+
+ typo3conf/ext/{{ package.extensionKey }}/Resources/Private/Templates/Page/Default.html +
+
Backend Configuration
+
+ typo3conf/ext/{{ package.extensionKey }}/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig +
+
+
+ + + +
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Css/layout.css b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Css/layout.css new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Css/layout.min.css b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Css/layout.min.css new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Css/rte.css.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Css/rte.css.twig new file mode 100644 index 00000000..1ce5278d --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Css/rte.css.twig @@ -0,0 +1,3 @@ +/** + * Created from sitepackagebuilder.com + */ diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Fonts/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Fonts/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Icons/Extension.svg b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Icons/Extension.svg new file mode 100644 index 00000000..d8536373 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Icons/Extension.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Icons/favicon.ico b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..46d4c14df35ee4ccdf7c5a7eba53f00bc4457963 GIT binary patch literal 1150 zcmaKszb^zq6vrP&t{`y*Vj}8oqXL6Y$R~|E{BN6xxSFH~V-8J?S315x+S4 zj-Y)ybmKo(YfpQ6?x1gZYOBicJEMBKKl2?Y;7851p!}yw*Ju2g^_YOA4@`k=u$$QG%PiuMovJt++@ORg$yF+-?obfjA|?e@V(Z#s}~VJtDD0 literal 0 HcmV?d00001 diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Images/BackendLayouts/default.png b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/Resources/Public/Images/BackendLayouts/default.png new file mode 100644 index 0000000000000000000000000000000000000000..0bed87019c8f61d46b9493157358054e2af23994 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^MnLSq!3HEFuBuc6saj7L$B>N1x3?X6TLMH_4jxZ? zT5x1PQ{RuD+D*PICg`zVW=f0BUR&At{>+(;^8W94Jl%8dr;Y8Sc&>{gi!@z=JC+If mD$a5;Y0V%};H~cVZu$S++?AJ4w7LNu!r '{{ package.title }}', + 'description' => '{{ package.description }}', + 'category' => 'templates', + 'constraints' => [ + 'depends' => [ + 'typo3' => '11.5.0-11.5.99', + 'fluid_styled_content' => '11.5.0-11.5.99', + 'rte_ckeditor' => '11.5.0-11.5.99', + ], + 'conflicts' => [ + ], + ], + 'autoload' => [ + 'psr-4' => [ + '{{ package.psr4Namespace }}\\' => 'Classes', + ], + ], + 'state' => 'stable', + 'uploadfolder' => 0, + 'createDirs' => '', + 'clearCacheOnLoad' => 1, + 'author' => '{{ package.author.name }}', + 'author_email' => '{{ package.author.email }}', + 'author_company' => '{{ package.author.company }}', + 'version' => '1.0.0', +]; diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_localconf.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_localconf.php.twig new file mode 100644 index 00000000..1845e195 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_localconf.php.twig @@ -0,0 +1,12 @@ +'); diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_tables.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_tables.php.twig new file mode 100644 index 00000000..d09aa3fa --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/11.5/ext_tables.php.twig @@ -0,0 +1,2 @@ +Resources/', + sass: '<%= paths.resources %>Public/Scss/', + css: '<%= paths.resources %>Public/Css/', + fonts: '<%= paths.resources %>Public/Fonts/', + img: '<%= paths.resources %>Public/Images/', + js: '<%= paths.resources %>Public/JavaScript/' + }, + banner: '/*!\n' + + ' * {{ package.title }} v<%= pkg.version %> (<%= pkg.homepage %>)\n' + + ' * Copyright 2017-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + + ' * Licensed under the <%= pkg.license %> license\n' + + ' */\n', + uglify: { + all: { + options: { + banner: '<%= banner %>', + mangle: true, + compress: true, + beautify: false + }, + files: { + "<%= paths.js %>/Dist/scripts.js": [ + "<%= paths.js %>Src/main.js" + ] + } + } + }, + sass: { + options: { + implementation: sass, + outputStyle: 'expanded', + precision: 8, + sourceMap: false + }, + layout: { + files: { + '<%= paths.css %>layout.css': '<%= paths.sass %>layout.scss' + } + } + }, + postcss: { + options: { + map: false, + processors: [ + require('autoprefixer')({ + browsers: [ + 'Last 2 versions', + 'Firefox ESR', + 'IE 9' + ] + }) + ] + }, + layout: { + src: '<%= paths.css %>layout.css' + } + }, + cssmin: { + options: { + keepSpecialComments: '*', + advanced: false + }, + layout: { + src: '<%= paths.css %>layout.css', + dest: '<%= paths.css %>layout.min.css' + } + }, + imagemin: { + extension: { + files: [{ + expand: true, + cwd: '<%= paths.resources %>', + src: [ + '**/*.{png,jpg,gif}' + ], + dest: '<%= paths.resources %>' + }] + } + }, + watch: { + options: { + livereload: true + }, + sass: { + files: '<%= paths.sass %>**/*.scss', + tasks: ['css'] + }, + javascript: { + files: '<%= paths.js %>Src/**/*.js', + tasks: ['js'] + } + } + }); + + /** + * Register tasks + // */ + grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-imagemin'); + grunt.loadNpmTasks('grunt-postcss'); + grunt.loadNpmTasks('grunt-sass'); + + /** + * Grunt update task + */ + grunt.registerTask('css', ['sass', 'postcss', 'cssmin']); + grunt.registerTask('js', ['uglify']); + grunt.registerTask('build', ['js', 'css', 'imagemin']); + grunt.registerTask('default', ['build']); + +}; diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Build/package.json.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Build/package.json.twig new file mode 100644 index 00000000..01d38717 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Build/package.json.twig @@ -0,0 +1,28 @@ +{ + "name": "{{ package.composerVendorName }}-{{ package.composerProjectName }}", + "description": "{{ package.description }}", + "repository": { + "type": "git", + "url": "{{ package.repositoryUrl }}" + }, + "homepage": "{{ package.author.homepage }}", + "author": "{{ package.author.name }}", + "version": "1.0.0", + "license": "GPL-2.0-or-later", + "devDependencies": { + "grunt": "^1.0.4", + "grunt-contrib-cssmin": "^3.0.0", + "grunt-contrib-uglify": "^4.0.1", + "grunt-contrib-watch": "^1.1.0", + "grunt-contrib-imagemin": "^3.1.0", + "grunt-postcss": "^0.9.0", + "grunt-sass": "^3.0.2", + "autoprefixer": "^9.5.0", + "node-sass": "^4.11.0" + }, + "scripts": { + "build": "./node_modules/.bin/grunt", + "css": "./node_modules/.bin/grunt css", + "watch": "./node_modules/.bin/grunt watch" + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/Controller/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/Controller/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/Domain/Model/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/Domain/Model/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/Domain/Repository/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/Domain/Repository/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/ViewHelpers/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Classes/ViewHelpers/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/RTE/Default.yaml.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/RTE/Default.yaml.twig new file mode 100644 index 00000000..5d5556da --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/RTE/Default.yaml.twig @@ -0,0 +1,42 @@ +imports: + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" } + +editor: + config: + contentsCss: "EXT:{{ package.extensionKey }}/Resources/Public/Css/rte.css" + + stylesSet: + - { name: "Lead", element: "p", attributes: { 'class': 'lead' } } + + toolbarGroups: + - { name: styles, groups: [ format, styles ] } + - { name: basicstyles, groups: [ basicstyles ] } + - { name: paragraph, groups: [ list, indent, blocks, align ] } + - "/" + - { name: links, groups: [ links ] } + - { name: clipboard, groups: [ clipboard, cleanup, undo ] } + - { name: editing, groups: [ spellchecker ] } + - { name: insert, groups: [ insert ] } + - { name: tools, groups: [ table, specialchar ] } + - { name: document, groups: [ mode ] } + + format_tags: "p;h1;h2;h3;h4;h5;pre" + + justifyClasses: + - text-left + - text-center + - text-right + - text-justify + + extraPlugins: + - justify + + removePlugins: + - image + + removeButtons: + - Anchor + - Underline + - Strike diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TCA/Overrides/pages.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TCA/Overrides/pages.php.twig new file mode 100644 index 00000000..beb3dd60 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TCA/Overrides/pages.php.twig @@ -0,0 +1,19 @@ + + + + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig new file mode 100644 index 00000000..8213cfae --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig @@ -0,0 +1,4 @@ +# +# BACKENDLAYOUTS +# + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig new file mode 100644 index 00000000..a16a9db6 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig @@ -0,0 +1,29 @@ +# +# BACKENDLAYOUT: DEFAULT +# +mod { + web_layout { + BackendLayouts { + default { + title = LLL:EXT:{{ package.extensionKey }}/Resources/Private/Language/locallang_be.xlf:backend_layout.default + config { + backend_layout { + colCount = 1 + rowCount = 1 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:{{ package.extensionKey }}/Resources/Private/Language/locallang_be.xlf:backend_layout.column.normal + colPos = 0 + } + } + } + } + } + } + icon = EXT:{{ package.extensionKey }}/Resources/Public/Images/BackendLayouts/default.png + } + } + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/RTE.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/RTE.tsconfig.twig new file mode 100644 index 00000000..38353247 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/RTE.tsconfig.twig @@ -0,0 +1,8 @@ +############# +#### RTE #### +############# +RTE { + default { + preset = {{ package.extensionKey }} + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig new file mode 100644 index 00000000..55f97ce7 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig @@ -0,0 +1,11 @@ +# +# TCEFORM +# +TCEFORM { + pages { + + } + tt_content { + + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig new file mode 100644 index 00000000..9d4a5e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig @@ -0,0 +1,6 @@ +# +# TCEMAIN +# +TCEMAIN { + +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig new file mode 100644 index 00000000..993b020b --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig @@ -0,0 +1,64 @@ +################################################ +#### DYNAMIC CONTENT LIB FOR USAGE IN FLUID #### +################################################ +# +# EXAMPLE +# --------------- +# |'}" /> +# +# +# COLUMN NUMBERS +# --------------- +# +# 0 = main +# 1 = left +# 2 = right +# 3 = border +# +################# +lib.dynamicContent = COA +lib.dynamicContent { + 5 = LOAD_REGISTER + 5 { + colPos.cObject = TEXT + colPos.cObject { + field = colPos + ifEmpty.cObject = TEXT + ifEmpty.cObject { + value.current = 1 + ifEmpty = 0 + } + } + pageUid.cObject = TEXT + pageUid.cObject { + field = pageUid + ifEmpty.data = TSFE:id + } + contentFromPid.cObject = TEXT + contentFromPid.cObject { + data = DB:pages:{register:pageUid}:content_from_pid + data.insertData = 1 + } + wrap.cObject = TEXT + wrap.cObject { + field = wrap + } + } + 20 = CONTENT + 20 { + table = tt_content + select { + includeRecordsWithoutDefaultTranslation = 1 + orderBy = sorting + where = {{ '{#colPos}={register:colPos}' }} + where.insertData = 1 + pidInList.data = register:pageUid + pidInList.override.data = register:contentFromPid + } + stdWrap { + dataWrap = {register:wrap} + required = 1 + } + } + 90 = RESTORE_REGISTER +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/constants.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/constants.typoscript.twig new file mode 100644 index 00000000..fb2cc513 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/constants.typoscript.twig @@ -0,0 +1,56 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +############################## +#### FLUID STYLED CONTENT #### +############################## +styles { + templates { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/ContentElements/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/ContentElements/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/ContentElements/ + } +} + + +############ +### PAGE ### +############ +page { + fluidtemplate { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/Page/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/Page/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/Page/ + } + meta { + description = + author = + keywords = + viewport = width=device-width, initial-scale=1 + robots = index,follow + apple-mobile-web-app-capable = no + compatible = IE=edge + } + tracking { + google { + trackingID = + anonymizeIp = 1 + } + } +} + + +############## +### CONFIG ### +############## +config { + no_cache = 0 + removeDefaultJS = 0 + admPanel = 1 + prefixLocalAnchors = all + headerComment = build by sitepackagebuilder.com + sendCacheHeaders = 1 +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/setup.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/setup.typoscript.twig new file mode 100644 index 00000000..987ce19a --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Configuration/TypoScript/setup.typoscript.twig @@ -0,0 +1,203 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +################ +#### HELPER #### +################ + + + +############## +#### PAGE #### +############## +page = PAGE +page { + typeNum = 0 + shortcutIcon = EXT:{{ package.extensionKey }}/Resources/Public/Icons/favicon.ico + + 10 = FLUIDTEMPLATE + 10 { + # Template names will be generated automatically by converting the applied + # backend_layout, there is no explicit mapping necessary anymore. + # + # BackendLayout Key + # subnavigation_right_2_columns -> SubnavigationRight2Columns.html + # + # Backend Record + # uid: 1 -> 1.html + # + # Database Entry + # value: -1 -> None.html + # value: pagets__subnavigation_right_2_columns -> SubnavigationRight2Columns.html + templateName = TEXT + templateName { + cObject = TEXT + cObject { + data = pagelayout + required = 1 + case = uppercamelcase + split { + token = pagets__ + cObjNum = 1 + 1.current = 1 + } + } + ifEmpty = Default + } + templateRootPaths { + 0 = EXT:{{ package.extensionKey }}/Resources/Private/Templates/Page/ + 1 = {$page.fluidtemplate.templateRootPath} + } + partialRootPaths { + 0 = EXT:{{ package.extensionKey }}/Resources/Private/Partials/Page/ + 1 = {$page.fluidtemplate.partialRootPath} + } + layoutRootPaths { + 0 = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/Page/ + 1 = {$page.fluidtemplate.layoutRootPath} + } + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 20 { + levels = 2 + includeSpacer = 1 + as = mainnavigation + } + } + } + + meta { + viewport = {$page.meta.viewport} + robots = {$page.meta.robots} + apple-mobile-web-app-capable = {$page.meta.apple-mobile-web-app-capable} + description = {$page.meta.description} + description { + override.field = description + } + author = {$page.meta.author} + author { + override.field = author + } + keywords = {$page.meta.keywords} + keywords { + override.field = keywords + } + X-UA-Compatible = {$page.meta.compatible} + X-UA-Compatible { + attribute = http-equiv + } + + # OpenGraph Tags + og:title { + attribute = property + field = title + } + og:site_name { + attribute = property + data = TSFE:tmpl|setup|sitetitle + } + og:description = {$page.meta.description} + og:description { + attribute = property + field = description + } + og:image { + attribute = property + stdWrap.cObject = FILES + stdWrap.cObject { + references { + data = levelfield:-1, media, slide + } + maxItems = 1 + renderObj = COA + renderObj { + 10 = IMG_RESOURCE + 10 { + file { + import.data = file:current:uid + treatIdAsReference = 1 + width = 1280c + height = 720c + } + stdWrap { + typolink { + parameter.data = TSFE:lastImgResourceInfo|3 + returnLast = url + forceAbsoluteUrl = 1 + } + } + } + } + } + } + } + + includeCSSLibs { + + } + + includeCSS { + {{ package.extensionKey }}_layout = EXT:{{ package.extensionKey }}/Resources/Public/Css/layout.min.css + } + + includeJSLibs { + + } + + includeJS { + + } + + includeJSFooterlibs { + + } + + includeJSFooter { + {{ package.extensionKey }}_scripts = EXT:{{ package.extensionKey }}/Resources/Public/JavaScript/Dist/scripts.js + } +} + + +################ +#### CONFIG #### +################ +config { + absRefPrefix = auto + no_cache = {$config.no_cache} + uniqueLinkVars = 1 + pageTitleFirst = 1 + linkVars = L + prefixLocalAnchors = {$config.prefixLocalAnchors} + renderCharset = utf-8 + metaCharset = utf-8 + doctype = html5 + removeDefaultJS = {$config.removeDefaultJS} + inlineStyle2TempFile = 1 + admPanel = {$config.admPanel} + debug = 0 + cache_period = 86400 + sendCacheHeaders = {$config.sendCacheHeaders} + intTarget = + extTarget = + disablePrefixComment = 1 + index_enable = 1 + index_externals = 1 + index_metatags = 1 + headerComment = {$config.headerComment} + + // Disable Image Upscaling + noScaleUp = 1 + + // Compression and Concatenation of CSS and JS Files + compressJs = 0 + compressCss = 0 + concatenateJs = 0 + concatenateCss = 0 +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/README.md.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/README.md.twig new file mode 100644 index 00000000..8b095c79 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/README.md.twig @@ -0,0 +1,4 @@ +Sitepackage for the project "{{ package.title }}" +============================================================== + +Add some explanation here. diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang_be.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang_be.xlf.twig new file mode 100644 index 00000000..fb3e2d8e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang_be.xlf.twig @@ -0,0 +1,17 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + + Default + + + Normal + + +
+
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang_db.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang_db.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Language/locallang_db.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Layouts/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Layouts/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Layouts/Page/Default.html.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Layouts/Page/Default.html.twig new file mode 100644 index 00000000..ad57953f --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Layouts/Page/Default.html.twig @@ -0,0 +1,21 @@ + + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Partials/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Partials/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Partials/Page/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Partials/Page/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Templates/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Templates/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Templates/Page/Default.html.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Templates/Page/Default.html.twig new file mode 100644 index 00000000..312fc91f --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Private/Templates/Page/Default.html.twig @@ -0,0 +1,19 @@ + + + +
+
+
Template file
+
+ typo3conf/ext/{{ package.extensionKey }}/Resources/Private/Templates/Page/Default.html +
+
Backend Configuration
+
+ typo3conf/ext/{{ package.extensionKey }}/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig +
+
+
+ + + +
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Css/layout.css b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Css/layout.css new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Css/layout.min.css b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Css/layout.min.css new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Css/rte.css.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Css/rte.css.twig new file mode 100644 index 00000000..1ce5278d --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Css/rte.css.twig @@ -0,0 +1,3 @@ +/** + * Created from sitepackagebuilder.com + */ diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Fonts/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Fonts/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Icons/Extension.svg b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Icons/Extension.svg new file mode 100644 index 00000000..d8536373 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Icons/Extension.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Icons/favicon.ico b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..46d4c14df35ee4ccdf7c5a7eba53f00bc4457963 GIT binary patch literal 1150 zcmaKszb^zq6vrP&t{`y*Vj}8oqXL6Y$R~|E{BN6xxSFH~V-8J?S315x+S4 zj-Y)ybmKo(YfpQ6?x1gZYOBicJEMBKKl2?Y;7851p!}yw*Ju2g^_YOA4@`k=u$$QG%PiuMovJt++@ORg$yF+-?obfjA|?e@V(Z#s}~VJtDD0 literal 0 HcmV?d00001 diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Images/BackendLayouts/default.png b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/Resources/Public/Images/BackendLayouts/default.png new file mode 100644 index 0000000000000000000000000000000000000000..0bed87019c8f61d46b9493157358054e2af23994 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^MnLSq!3HEFuBuc6saj7L$B>N1x3?X6TLMH_4jxZ? zT5x1PQ{RuD+D*PICg`zVW=f0BUR&At{>+(;^8W94Jl%8dr;Y8Sc&>{gi!@z=JC+If mD$a5;Y0V%};H~cVZu$S++?AJ4w7LNu!r '{{ package.title }}', + 'description' => '{{ package.description }}', + 'category' => 'templates', + 'constraints' => [ + 'depends' => [ + 'typo3' => '8.7.0-8.7.99', + 'fluid_styled_content' => '8.7.0-8.7.99', + 'rte_ckeditor' => '8.7.0-8.7.99', + ], + 'conflicts' => [ + ], + ], + 'autoload' => [ + 'psr-4' => [ + '{{ package.psr4Namespace }}\\' => 'Classes', + ], + ], + 'state' => 'stable', + 'uploadfolder' => 0, + 'createDirs' => '', + 'clearCacheOnLoad' => 1, + 'author' => '{{ package.author.name }}', + 'author_email' => '{{ package.author.email }}', + 'author_company' => '{{ package.author.company }}', + 'version' => '1.0.0', +]; diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_localconf.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_localconf.php.twig new file mode 100644 index 00000000..0dfcdc81 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_localconf.php.twig @@ -0,0 +1,12 @@ +'); diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_tables.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_tables.php.twig new file mode 100644 index 00000000..25a831db --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/8.7/ext_tables.php.twig @@ -0,0 +1,2 @@ +Resources/', + sass: '<%= paths.resources %>Public/Scss/', + css: '<%= paths.resources %>Public/Css/', + fonts: '<%= paths.resources %>Public/Fonts/', + img: '<%= paths.resources %>Public/Images/', + js: '<%= paths.resources %>Public/JavaScript/' + }, + banner: '/*!\n' + + ' * {{ package.title }} v<%= pkg.version %> (<%= pkg.homepage %>)\n' + + ' * Copyright 2017-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + + ' * Licensed under the <%= pkg.license %> license\n' + + ' */\n', + uglify: { + all: { + options: { + banner: '<%= banner %>', + mangle: true, + compress: true, + beautify: false + }, + files: { + "<%= paths.js %>/Dist/scripts.js": [ + "<%= paths.js %>Src/main.js" + ] + } + } + }, + sass: { + options: { + implementation: sass, + outputStyle: 'expanded', + precision: 8, + sourceMap: false + }, + layout: { + files: { + '<%= paths.css %>layout.css': '<%= paths.sass %>layout.scss' + } + } + }, + postcss: { + options: { + map: false, + processors: [ + require('autoprefixer')({ + browsers: [ + 'Last 2 versions', + 'Firefox ESR', + 'IE 9' + ] + }) + ] + }, + layout: { + src: '<%= paths.css %>layout.css' + } + }, + cssmin: { + options: { + keepSpecialComments: '*', + advanced: false + }, + layout: { + src: '<%= paths.css %>layout.css', + dest: '<%= paths.css %>layout.min.css' + } + }, + imagemin: { + extension: { + files: [{ + expand: true, + cwd: '<%= paths.resources %>', + src: [ + '**/*.{png,jpg,gif}' + ], + dest: '<%= paths.resources %>' + }] + } + }, + watch: { + options: { + livereload: true + }, + sass: { + files: '<%= paths.sass %>**/*.scss', + tasks: ['css'] + }, + javascript: { + files: '<%= paths.js %>Src/**/*.js', + tasks: ['js'] + } + } + }); + + /** + * Register tasks + // */ + grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-imagemin'); + grunt.loadNpmTasks('grunt-postcss'); + grunt.loadNpmTasks('grunt-sass'); + + /** + * Grunt update task + */ + grunt.registerTask('css', ['sass', 'postcss', 'cssmin']); + grunt.registerTask('js', ['uglify']); + grunt.registerTask('build', ['js', 'css', 'imagemin']); + grunt.registerTask('default', ['build']); + +}; diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Build/package.json.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Build/package.json.twig new file mode 100644 index 00000000..01d38717 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Build/package.json.twig @@ -0,0 +1,28 @@ +{ + "name": "{{ package.composerVendorName }}-{{ package.composerProjectName }}", + "description": "{{ package.description }}", + "repository": { + "type": "git", + "url": "{{ package.repositoryUrl }}" + }, + "homepage": "{{ package.author.homepage }}", + "author": "{{ package.author.name }}", + "version": "1.0.0", + "license": "GPL-2.0-or-later", + "devDependencies": { + "grunt": "^1.0.4", + "grunt-contrib-cssmin": "^3.0.0", + "grunt-contrib-uglify": "^4.0.1", + "grunt-contrib-watch": "^1.1.0", + "grunt-contrib-imagemin": "^3.1.0", + "grunt-postcss": "^0.9.0", + "grunt-sass": "^3.0.2", + "autoprefixer": "^9.5.0", + "node-sass": "^4.11.0" + }, + "scripts": { + "build": "./node_modules/.bin/grunt", + "css": "./node_modules/.bin/grunt css", + "watch": "./node_modules/.bin/grunt watch" + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/Controller/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/Controller/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/Domain/Model/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/Domain/Model/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/Domain/Repository/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/Domain/Repository/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/ViewHelpers/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Classes/ViewHelpers/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/RTE/Default.yaml.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/RTE/Default.yaml.twig new file mode 100644 index 00000000..5d5556da --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/RTE/Default.yaml.twig @@ -0,0 +1,42 @@ +imports: + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" } + +editor: + config: + contentsCss: "EXT:{{ package.extensionKey }}/Resources/Public/Css/rte.css" + + stylesSet: + - { name: "Lead", element: "p", attributes: { 'class': 'lead' } } + + toolbarGroups: + - { name: styles, groups: [ format, styles ] } + - { name: basicstyles, groups: [ basicstyles ] } + - { name: paragraph, groups: [ list, indent, blocks, align ] } + - "/" + - { name: links, groups: [ links ] } + - { name: clipboard, groups: [ clipboard, cleanup, undo ] } + - { name: editing, groups: [ spellchecker ] } + - { name: insert, groups: [ insert ] } + - { name: tools, groups: [ table, specialchar ] } + - { name: document, groups: [ mode ] } + + format_tags: "p;h1;h2;h3;h4;h5;pre" + + justifyClasses: + - text-left + - text-center + - text-right + - text-justify + + extraPlugins: + - justify + + removePlugins: + - image + + removeButtons: + - Anchor + - Underline + - Strike diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TCA/Overrides/pages.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TCA/Overrides/pages.php.twig new file mode 100644 index 00000000..beb3dd60 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TCA/Overrides/pages.php.twig @@ -0,0 +1,19 @@ + + + + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig new file mode 100644 index 00000000..8213cfae --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig @@ -0,0 +1,4 @@ +# +# BACKENDLAYOUTS +# + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig new file mode 100644 index 00000000..a16a9db6 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig @@ -0,0 +1,29 @@ +# +# BACKENDLAYOUT: DEFAULT +# +mod { + web_layout { + BackendLayouts { + default { + title = LLL:EXT:{{ package.extensionKey }}/Resources/Private/Language/locallang_be.xlf:backend_layout.default + config { + backend_layout { + colCount = 1 + rowCount = 1 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:{{ package.extensionKey }}/Resources/Private/Language/locallang_be.xlf:backend_layout.column.normal + colPos = 0 + } + } + } + } + } + } + icon = EXT:{{ package.extensionKey }}/Resources/Public/Images/BackendLayouts/default.png + } + } + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/RTE.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/RTE.tsconfig.twig new file mode 100644 index 00000000..38353247 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/RTE.tsconfig.twig @@ -0,0 +1,8 @@ +############# +#### RTE #### +############# +RTE { + default { + preset = {{ package.extensionKey }} + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig new file mode 100644 index 00000000..55f97ce7 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig @@ -0,0 +1,11 @@ +# +# TCEFORM +# +TCEFORM { + pages { + + } + tt_content { + + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig new file mode 100644 index 00000000..9d4a5e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig @@ -0,0 +1,6 @@ +# +# TCEMAIN +# +TCEMAIN { + +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig new file mode 100644 index 00000000..993b020b --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig @@ -0,0 +1,64 @@ +################################################ +#### DYNAMIC CONTENT LIB FOR USAGE IN FLUID #### +################################################ +# +# EXAMPLE +# --------------- +# |'}" /> +# +# +# COLUMN NUMBERS +# --------------- +# +# 0 = main +# 1 = left +# 2 = right +# 3 = border +# +################# +lib.dynamicContent = COA +lib.dynamicContent { + 5 = LOAD_REGISTER + 5 { + colPos.cObject = TEXT + colPos.cObject { + field = colPos + ifEmpty.cObject = TEXT + ifEmpty.cObject { + value.current = 1 + ifEmpty = 0 + } + } + pageUid.cObject = TEXT + pageUid.cObject { + field = pageUid + ifEmpty.data = TSFE:id + } + contentFromPid.cObject = TEXT + contentFromPid.cObject { + data = DB:pages:{register:pageUid}:content_from_pid + data.insertData = 1 + } + wrap.cObject = TEXT + wrap.cObject { + field = wrap + } + } + 20 = CONTENT + 20 { + table = tt_content + select { + includeRecordsWithoutDefaultTranslation = 1 + orderBy = sorting + where = {{ '{#colPos}={register:colPos}' }} + where.insertData = 1 + pidInList.data = register:pageUid + pidInList.override.data = register:contentFromPid + } + stdWrap { + dataWrap = {register:wrap} + required = 1 + } + } + 90 = RESTORE_REGISTER +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/constants.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/constants.typoscript.twig new file mode 100644 index 00000000..1a79054a --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/constants.typoscript.twig @@ -0,0 +1,56 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +############################## +#### FLUID STYLED CONTENT #### +############################## +styles { + templates { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/ContentElements/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/ContentElements/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/ContentElements/ + } +} + + +############ +### PAGE ### +############ +page { + fluidtemplate { + layoutRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/Page/ + partialRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Partials/Page/ + templateRootPath = EXT:{{ package.extensionKey }}/Resources/Private/Templates/Page/ + } + meta { + description = + author = + keywords = + viewport = width=device-width, initial-scale=1 + robots = index,follow + apple-mobile-web-app-capable = no + compatible = IE=edge + } + tracking { + google { + trackingID = + anonymizeIp = 1 + } + } +} + + +############## +### CONFIG ### +############## +config { + no_cache = 0 + removeDefaultJS = 0 + admPanel = 1 + prefixLocalAnchors = all + headerComment = build by sitepackagebuilder.com + sendCacheHeaders = 1 +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/setup.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/setup.typoscript.twig new file mode 100644 index 00000000..1f765576 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Configuration/TypoScript/setup.typoscript.twig @@ -0,0 +1,203 @@ +###################### +#### DEPENDENCIES #### +###################### + + + +################ +#### HELPER #### +################ + + + +############## +#### PAGE #### +############## +page = PAGE +page { + typeNum = 0 + shortcutIcon = EXT:{{ package.extensionKey }}/Resources/Public/Icons/favicon.ico + + 10 = FLUIDTEMPLATE + 10 { + # Template names will be generated automatically by converting the applied + # backend_layout, there is no explicit mapping necessary anymore. + # + # BackendLayout Key + # subnavigation_right_2_columns -> SubnavigationRight2Columns.html + # + # Backend Record + # uid: 1 -> 1.html + # + # Database Entry + # value: -1 -> None.html + # value: pagets__subnavigation_right_2_columns -> SubnavigationRight2Columns.html + templateName = TEXT + templateName { + cObject = TEXT + cObject { + data = pagelayout + required = 1 + case = uppercamelcase + split { + token = pagets__ + cObjNum = 1 + 1.current = 1 + } + } + ifEmpty = Default + } + templateRootPaths { + 0 = EXT:{{ package.extensionKey }}/Resources/Private/Templates/Page/ + 1 = {$page.fluidtemplate.templateRootPath} + } + partialRootPaths { + 0 = EXT:{{ package.extensionKey }}/Resources/Private/Partials/Page/ + 1 = {$page.fluidtemplate.partialRootPath} + } + layoutRootPaths { + 0 = EXT:{{ package.extensionKey }}/Resources/Private/Layouts/Page/ + 1 = {$page.fluidtemplate.layoutRootPath} + } + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 20 { + levels = 2 + includeSpacer = 1 + as = mainnavigation + } + } + } + + meta { + viewport = {$page.meta.viewport} + robots = {$page.meta.robots} + apple-mobile-web-app-capable = {$page.meta.apple-mobile-web-app-capable} + description = {$page.meta.description} + description { + override.field = description + } + author = {$page.meta.author} + author { + override.field = author + } + keywords = {$page.meta.keywords} + keywords { + override.field = keywords + } + X-UA-Compatible = {$page.meta.compatible} + X-UA-Compatible { + attribute = http-equiv + } + + # OpenGraph Tags + og:title { + attribute = property + field = title + } + og:site_name { + attribute = property + data = TSFE:tmpl|setup|sitetitle + } + og:description = {$page.meta.description} + og:description { + attribute = property + field = description + } + og:image { + attribute = property + stdWrap.cObject = FILES + stdWrap.cObject { + references { + data = levelfield:-1, media, slide + } + maxItems = 1 + renderObj = COA + renderObj { + 10 = IMG_RESOURCE + 10 { + file { + import.data = file:current:uid + treatIdAsReference = 1 + width = 1280c + height = 720c + } + stdWrap { + typolink { + parameter.data = TSFE:lastImgResourceInfo|3 + returnLast = url + forceAbsoluteUrl = 1 + } + } + } + } + } + } + } + + includeCSSLibs { + + } + + includeCSS { + {{ package.extensionKey }}_layout = EXT:{{ package.extensionKey }}/Resources/Public/Css/layout.min.css + } + + includeJSLibs { + + } + + includeJS { + + } + + includeJSFooterlibs { + + } + + includeJSFooter { + {{ package.extensionKey }}_scripts = EXT:{{ package.extensionKey }}/Resources/Public/JavaScript/Dist/scripts.js + } +} + + +################ +#### CONFIG #### +################ +config { + absRefPrefix = auto + no_cache = {$config.no_cache} + uniqueLinkVars = 1 + pageTitleFirst = 1 + linkVars = L + prefixLocalAnchors = {$config.prefixLocalAnchors} + renderCharset = utf-8 + metaCharset = utf-8 + doctype = html5 + removeDefaultJS = {$config.removeDefaultJS} + inlineStyle2TempFile = 1 + admPanel = {$config.admPanel} + debug = 0 + cache_period = 86400 + sendCacheHeaders = {$config.sendCacheHeaders} + intTarget = + extTarget = + disablePrefixComment = 1 + index_enable = 1 + index_externals = 1 + index_metatags = 1 + headerComment = {$config.headerComment} + + // Disable Image Upscaling + noScaleUp = 1 + + // Compression and Concatenation of CSS and JS Files + compressJs = 0 + compressCss = 0 + concatenateJs = 0 + concatenateCss = 0 +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/README.md.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/README.md.twig new file mode 100644 index 00000000..8b095c79 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/README.md.twig @@ -0,0 +1,4 @@ +Sitepackage for the project "{{ package.title }}" +============================================================== + +Add some explanation here. diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang_be.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang_be.xlf.twig new file mode 100644 index 00000000..fb3e2d8e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang_be.xlf.twig @@ -0,0 +1,17 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + + Default + + + Normal + + +
+
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang_db.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang_db.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Language/locallang_db.xlf.twig @@ -0,0 +1,11 @@ + + + +
+ {{ package.author.name }} + {{ package.author.email }} +
+ + +
+
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Layouts/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Layouts/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Layouts/Page/Default.html.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Layouts/Page/Default.html.twig new file mode 100644 index 00000000..ad57953f --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Layouts/Page/Default.html.twig @@ -0,0 +1,21 @@ + + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Partials/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Partials/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Partials/Page/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Partials/Page/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Templates/ContentElements/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Templates/ContentElements/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Templates/Page/Default.html.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Templates/Page/Default.html.twig new file mode 100644 index 00000000..312fc91f --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Private/Templates/Page/Default.html.twig @@ -0,0 +1,19 @@ + + + +
+
+
Template file
+
+ typo3conf/ext/{{ package.extensionKey }}/Resources/Private/Templates/Page/Default.html +
+
Backend Configuration
+
+ typo3conf/ext/{{ package.extensionKey }}/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig +
+
+
+ + + +
diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Css/layout.css b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Css/layout.css new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Css/layout.min.css b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Css/layout.min.css new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Css/rte.css.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Css/rte.css.twig new file mode 100644 index 00000000..1ce5278d --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Css/rte.css.twig @@ -0,0 +1,3 @@ +/** + * Created from sitepackagebuilder.com + */ diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Fonts/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Fonts/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Icons/Extension.svg b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Icons/Extension.svg new file mode 100644 index 00000000..d8536373 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Icons/Extension.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Icons/favicon.ico b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..46d4c14df35ee4ccdf7c5a7eba53f00bc4457963 GIT binary patch literal 1150 zcmaKszb^zq6vrP&t{`y*Vj}8oqXL6Y$R~|E{BN6xxSFH~V-8J?S315x+S4 zj-Y)ybmKo(YfpQ6?x1gZYOBicJEMBKKl2?Y;7851p!}yw*Ju2g^_YOA4@`k=u$$QG%PiuMovJt++@ORg$yF+-?obfjA|?e@V(Z#s}~VJtDD0 literal 0 HcmV?d00001 diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Images/BackendLayouts/default.png b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/Resources/Public/Images/BackendLayouts/default.png new file mode 100644 index 0000000000000000000000000000000000000000..0bed87019c8f61d46b9493157358054e2af23994 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^MnLSq!3HEFuBuc6saj7L$B>N1x3?X6TLMH_4jxZ? zT5x1PQ{RuD+D*PICg`zVW=f0BUR&At{>+(;^8W94Jl%8dr;Y8Sc&>{gi!@z=JC+If mD$a5;Y0V%};H~cVZu$S++?AJ4w7LNu!r '{{ package.title }}', + 'description' => '{{ package.description }}', + 'category' => 'templates', + 'constraints' => [ + 'depends' => [ + 'typo3' => '9.5.0-9.5.99', + 'fluid_styled_content' => '9.5.0-9.5.99', + 'rte_ckeditor' => '9.5.0-9.5.99', + ], + 'conflicts' => [ + ], + ], + 'autoload' => [ + 'psr-4' => [ + '{{ package.psr4Namespace }}\\' => 'Classes', + ], + ], + 'state' => 'stable', + 'uploadfolder' => 0, + 'createDirs' => '', + 'clearCacheOnLoad' => 1, + 'author' => '{{ package.author.name }}', + 'author_email' => '{{ package.author.email }}', + 'author_company' => '{{ package.author.company }}', + 'version' => '1.0.0', +]; diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_localconf.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_localconf.php.twig new file mode 100644 index 00000000..0dfcdc81 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_localconf.php.twig @@ -0,0 +1,12 @@ +'); diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_tables.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_tables.php.twig new file mode 100644 index 00000000..25a831db --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/9.5/ext_tables.php.twig @@ -0,0 +1,2 @@ + '{{ package.title }}', - 'description' => '{{ package.description }}', - 'category' => 'templates', - 'constraints' => [ - 'depends' => [ - 'typo3' => '{% if package.typo3version < 9000000 %}8.7.0-8.7.99{% elseif package.typo3version < 10000000 %}9.5.0-9.5.99{% elseif package.typo3version < 11000000 %}10.4.0-10.4.99{% else %}11.5.0-11.5.99{% endif %}', - 'fluid_styled_content' => '{% if package.typo3version < 9000000 %}8.7.0-8.7.99{% elseif package.typo3version < 10000000 %}9.5.0-9.5.99{% elseif package.typo3version < 11000000 %}10.4.0-10.4.99{% else %}11.5.0-11.5.99{% endif %}', - 'rte_ckeditor' => '{% if package.typo3version < 9000000 %}8.7.0-8.7.99{% elseif package.typo3version < 10000000 %}9.5.0-9.5.99{% elseif package.typo3version < 11000000 %}10.4.0-10.4.99{% else %}11.5.0-11.5.99{% endif %}', - ], - 'conflicts' => [ - ], - ], - 'autoload' => [ - 'psr-4' => [ - '{{ package.vendorName }}\\{{ package.packageName }}\\' => 'Classes', - ], - ], - 'state' => 'stable', - 'uploadfolder' => 0, - 'createDirs' => '', - 'clearCacheOnLoad' => 1, - 'author' => '{{ package.author.name }}', - 'author_email' => '{{ package.author.email }}', - 'author_company' => '{{ package.author.company }}', - 'version' => '1.0.0', -]; diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/ext_tables.php.twig b/resources/skeletons/BaseExtension/fluid_styled_content/ext_tables.php.twig deleted file mode 100644 index 8eb918c9..00000000 --- a/resources/skeletons/BaseExtension/fluid_styled_content/ext_tables.php.twig +++ /dev/null @@ -1,2 +0,0 @@ -getVersion() instanceof MajorVersion) { + throw new PreconditionFailedHttpException('Requirement does not have a major version assigned.'); } $requirement->setVersion($entity->getVersion()); diff --git a/src/Controller/Api/SitepackageController.php b/src/Controller/Api/SitepackageController.php index a51bcc9c..32e1aa24 100644 --- a/src/Controller/Api/SitepackageController.php +++ b/src/Controller/Api/SitepackageController.php @@ -23,81 +23,87 @@ namespace App\Controller\Api; -use App\Entity\Sitepackage; -use App\Service\SitepackageGenerator; +use App\Package\Sitepackage; use App\Utility\StringUtility; -use JMS\Serializer\SerializerInterface; use Nelmio\ApiDocBundle\Annotation\Model; -use Swagger\Annotations as SWG; +use OpenApi\Annotations as OA; +//use OpenApi\Attributes as OA; +use OpenApi\Attributes\MediaType; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\Routing\Annotation\Route; - +use Symfony\Component\Validator\ConstraintViolationInterface; use Symfony\Component\Validator\Validation; -/** - * @Route("/api/v1/sitepackage", defaults={"_format": "json"}) - * @Route("/v1/api/sitepackage", defaults={"_format": "json"}) - */ +#[Route(path: '/api/v1/sitepackage', defaults: ['_format' => 'json'])] class SitepackageController extends AbstractController { - /** - * @var \JMS\Serializer\SerializerInterface - */ - protected $serializer; - - /** - * @var SitepackageGenerator - */ - protected $sitepackageGenerator; - public function __construct( - SerializerInterface $serializer, - SitepackageGenerator $sitepackageGenerator + private \JMS\Serializer\SerializerInterface $serializer, + private \App\Service\SitepackageGenerator $sitepackageGenerator, ) { - $this->serializer = $serializer; - $this->sitepackageGenerator = $sitepackageGenerator; } /** - * @Route("/", methods={"POST"}) - * @SWG\Parameter( - * name="sitepackage", - * in="body", - * @Model(type=Sitepackage::class) + * @OA\RequestBody( + * @Model(type=Sitepackage::class), + * request="sitepackage", + * required=true * ) - * @SWG\Response( + * @OA\Response( * response=200, * description="Successfully generated.", - * @SWG\Schema(type="file") + * @OA\Schema(type="file") * ) - * @SWG\Response( + * @OA\Response( * response=400, * description="Request malformed." * ) - * @SWG\Tag(name="sitepackage") + * @OA\Tag(name="sitepackage") */ - public function createSitepackage(Request $request): Response + /* + #[OA\RequestBody( + //new Model(type: Sitepackage::class) + //ref: new OA\Schema(type: Sitepackage::class), + request: 'sitepackage', + required: true, + //new Model(type: Sitepackage::class) + content: new Model(type: Sitepackage::class) + //content: new OA\Schema(ref: new Model(type: Sitepackage::class)) + )] + #[OA\RequestBody(new Model(type: Sitepackage::class))] + #[OA\Response( + response: 200, + description: 'Successfully generated.', + //content: new OA\Schema(type: 'file') + content: new OA\MediaType(mediaType: 'application/zip') + )] + #[OA\Response( + response: 400, + description: 'Request malformed.' + )] + #[OA\Tag(name: 'sitepackage')] + */ + #[Route(path: '/create', methods: ['POST'])] + public function createSitepackage(Request $request): BinaryFileResponse { - $content = $request->getContent(); + if (!\is_string($content = $request->getContent())) { + throw new BadRequestHttpException('Missing or invalid request body.'); + } + /** @var Sitepackage $sitepackage */ $sitepackage = $this->serializer->deserialize($content, Sitepackage::class, 'json'); $this->validateObject($sitepackage); $this->sitepackageGenerator->create($sitepackage); $filename = $this->sitepackageGenerator->getFilename(); BinaryFileResponse::trustXSendfileTypeHeader(); - return $this ->file($this->sitepackageGenerator->getZipPath(), StringUtility::toASCII($filename)) ->deleteFileAfterSend(true); } - /** - * @param Sitepackage $object - */ protected function validateObject(Sitepackage $object): void { $validator = Validation::createValidatorBuilder() @@ -108,10 +114,15 @@ protected function validateObject(Sitepackage $object): void if ($violations->count() > 0) { $messages = ''; - \iterator_apply($violations, function (\Iterator $iterator) use ($messages) { - $messages .= $iterator->current()->getMessage() . "\n"; - return true; - }); + \iterator_apply( + $violations, + static function (ConstraintViolationInterface $violation) use (&$messages): bool { + $messages .= \sprintf("%s: %s\n", $violation->getPropertyPath(), $violation->getMessage()); + return true; + }, + \iterator_to_array($violations) + ); + throw new BadRequestHttpException(trim($messages)); } } diff --git a/src/Controller/Wizards/SitepackageController.php b/src/Controller/Wizards/SitepackageController.php index 11579be3..33be4ad9 100644 --- a/src/Controller/Wizards/SitepackageController.php +++ b/src/Controller/Wizards/SitepackageController.php @@ -23,204 +23,190 @@ namespace App\Controller\Wizards; -use App\Entity\Sitepackage; use App\Factory\SitepackageFactory; use App\Form\Dto\SitepackageDto; use App\Form\SitepackageType; -use App\Service\SitepackageGenerator; +use App\Session\WizardSessionTrait; use App\Utility\StringUtility; +use App\Utility\VersionUtility; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\SubmitButton; use Symfony\Component\HttpFoundation\BinaryFileResponse; +use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\Routing\Annotation\Route; +use Throwable; +use Twig\Error\RuntimeError; use UnexpectedValueException; -/** - * @Route("/wizards/sitepackage") -*/ +#[Route(path: '/wizards/sitepackage')] final class SitepackageController extends AbstractController { - /** - * @Route("/", name="wizards_sitepackage") - */ + use WizardSessionTrait; + + public function __construct( + private \App\Service\BasePackageService $basePackageService, + private \App\Service\SitepackageGenerator $sitepackageGenerator, + ) { + } + + #[Route(path: '', name: 'wizards_sitepackage')] public function index(): Response { return $this->render( - 'default/wizards/sitepackage/index.html.twig', - [] + 'wizards/sitepackage/index.html.twig' ); } - /** - * @Route("/new/", name="wizards_sitepackage_new") - */ - public function new(Request $request): Response + #[Route(path: '/new', name: 'wizards_sitepackage_new')] + public function new(): Response { - $session = $request->getSession(); + $this->setSitepackageConfig(new SitepackageDto(), false); - $this->setAdvanced($session, false); - $this->setConfiguration($session, new SitepackageDto()); - - return $this->redirectToRoute('wizards_sitepackage_edit'); + return $this->render( + 'wizards/sitepackage/new.html.twig', + [ + 'basePackages' => $this->basePackageService->getBasePackages(), + ] + ); } - /** - * @Route("/edit/", name="wizards_sitepackage_edit") - */ - public function edit(Request $request): Response + #[Route(path: '/validate/{vendor}/{project}', name: 'wizards_sitepackage_validate')] + public function validate(string $vendor, string $project): RedirectResponse { - $session = $request->getSession(); + try { + $configuration = $this->getSitepackageConfig(); + } catch (UnexpectedValueException) { + return $this->redirectToRoute('wizards_sitepackage_new'); + } + + $configuration->basePackage = \sprintf('%s/%s', $vendor, $project); try { - $configuration = $this->getConfiguration($session); - } catch (UnexpectedValueException $th) { + $basePackage = $this->basePackageService->checkAndInstallMissingBasePackage($configuration->basePackage); + $configuration->typo3Version = VersionUtility::versionToInt($basePackage->typo3Versions[0]); + } catch (Throwable $throwable) { + $this->addFlash( + 'fatal', + $throwable->getMessage() + ); return $this->redirectToRoute('wizards_sitepackage_new'); } - $form = $this->createSitepackageForm($configuration, $this->getAdvanced($session)); + $this->setSitepackageConfig($configuration, $this->isAdvancedSitepackageConfig()); + + return $this->redirectToRoute('wizards_sitepackage_configure'); + } + + #[Route(path: '/configure', name: 'wizards_sitepackage_configure')] + public function configure(Request $request): Response + { + try { + $configuration = $this->getSitepackageConfig(); + } catch (UnexpectedValueException) { + return $this->redirectToRoute('wizards_sitepackage_new'); + } + + $form = $this->createForm( + SitepackageType::class, + $configuration, + [ + 'action' => $this->generateUrl('wizards_sitepackage_configure'), + 'advanced' => $this->isAdvancedSitepackageConfig(), + ] + ); $form->handleRequest($request); if ($form->isSubmitted()) { - if ($form->has('simple') && ($simple = $form->get('simple')) instanceof SubmitButton && $simple->isClicked()) { - $this->setAdvanced($session, false); - $this->setConfiguration($session, $configuration); + if ( + $form->has('simple') && + ($simple = $form->get('simple')) instanceof SubmitButton && $simple->isClicked() + ) { + $this->setSitepackageConfig($configuration, false); - return $this->redirectToRoute('wizards_sitepackage_edit'); + return $this->redirectToRoute('wizards_sitepackage_configure'); } - if ($form->has('advanced') && ($advanced = $form->get('advanced')) instanceof SubmitButton && $advanced->isClicked()) { - $this->setAdvanced($session, true); - $this->setConfiguration($session, $configuration); - return $this->redirectToRoute('wizards_sitepackage_edit'); + if ( + $form->has('advanced') && + ($advanced = $form->get('advanced')) instanceof SubmitButton && $advanced->isClicked() + ) { + $this->setSitepackageConfig($configuration, true); + + return $this->redirectToRoute('wizards_sitepackage_configure'); } if ($form->isValid()) { - $this->setConfiguration($session, $configuration); + $this->setSitepackageConfig($configuration, $this->isAdvancedSitepackageConfig()); return $this->redirectToRoute('wizards_sitepackage_success'); } } return $this->render( - 'default/wizards/sitepackage/edit.html.twig', + 'wizards/sitepackage/configure.html.twig', [ 'form' => $form->createView(), ] ); } - /** - * @Route("/success/", name="wizards_sitepackage_success") - */ - public function success(Request $request): Response + #[Route(path: '/success', name: 'wizards_sitepackage_success')] + public function success(): Response { - $session = $request->getSession(); - try { - $configuration = $this->getConfiguration($session); - } catch (UnexpectedValueException $th) { + $sitepackage = SitepackageFactory::fromDto($this->getSitepackageConfig()); + } catch (UnexpectedValueException) { return $this->redirectToRoute('wizards_sitepackage_new'); } - $sitepackage = SitepackageFactory::fromDto($configuration); - $this->setSitepackage($session, $sitepackage); + $this->setSitepackage($sitepackage); return $this->render( - 'default/wizards/sitepackage/success.html.twig', + 'wizards/sitepackage/success.html.twig', [ - 'sitepackage' => $sitepackage + 'base_package' => $this->basePackageService->getInstalledBasePackage($sitepackage->getBasePackage()), + 'sitepackage' => $sitepackage, ] ); } - /** - * @Route("/download/", name="wizards_sitepackage_download") - */ - public function download(Request $request, SitepackageGenerator $sitepackageGenerator): Response + #[Route(path: '/download', name: 'wizards_sitepackage_download')] + public function download(): Response { - $session = $request->getSession(); - try { - $sitepackage = $this->getSitepackage($session); - } catch (UnexpectedValueException $th) { + $sitepackage = $this->getSitepackage(); + } catch (UnexpectedValueException) { return $this->redirectToRoute('wizards_sitepackage_new'); } - $sitepackageGenerator->create($sitepackage); - $filename = $sitepackageGenerator->getFilename(); + try { + $this->sitepackageGenerator->create($sitepackage); + } catch (RuntimeError $runtimeError) { + $this->setSitepackageError($runtimeError->getMessage()); + + return $this->redirectToRoute('wizards_sitepackage_error'); + } BinaryFileResponse::trustXSendfileTypeHeader(); return $this - ->file($sitepackageGenerator->getZipPath(), StringUtility::toASCII($filename)) + ->file( + $this->sitepackageGenerator->getZipPath(), + StringUtility::toASCII($this->sitepackageGenerator->getFilename()) + ) ->deleteFileAfterSend(true); } - private function createSitepackageForm(SitepackageDto $configuration, bool $advanced = false): FormInterface + #[Route(path: '/error', name: 'wizards_sitepackage_error')] + public function error(): Response { - return $this->createForm( - SitepackageType::class, - $configuration, + return $this->render( + 'wizards/sitepackage/error.html.twig', [ - 'action' => $this->generateUrl('wizards_sitepackage_edit'), - 'advanced' => $advanced, + 'error' => $this->getSitepackageError(), ] ); } - - private function getAdvanced(SessionInterface $session): bool - { - return $session->get('sitepackage_advanced') === true; - } - - private function setAdvanced(SessionInterface $session, bool $advanced): void - { - $session->set('sitepackage_advanced', $advanced); - } - - private function getConfiguration(SessionInterface $session): SitepackageDto - { - $configuration = $session->get('sitepackage_configuration'); - - if ($configuration === null || !($configuration instanceof SitepackageDto)) { - $this->addFlash( - 'danger', - 'Whoops, we could not find the package configuration. Please submit the configuration again.' - ); - - throw new UnexpectedValueException('Invalid or missing configuration.', 1638038672); - } - - return $configuration; - } - - private function setConfiguration(SessionInterface $session, SitepackageDto $configuration): void - { - $session->set('sitepackage_configuration', $configuration); - } - - private function getSitepackage(SessionInterface $session): Sitepackage - { - $sitepackage = $session->get('sitepackage'); - - if ($sitepackage === null || !($sitepackage instanceof Sitepackage)) { - $this->addFlash( - 'danger', - 'Whoops, we could not find the Sitepackage. Please submit the configuration again.' - ); - - throw new UnexpectedValueException('Invalid or missing Sitepackage.', 1638038673); - } - - return $sitepackage; - } - - private function setSitepackage(SessionInterface $session, Sitepackage $sitepackage): void - { - $session->set('sitepackage', $sitepackage); - } } diff --git a/src/Entity/BasePackage.php b/src/Entity/BasePackage.php new file mode 100644 index 00000000..ddbebf94 --- /dev/null +++ b/src/Entity/BasePackage.php @@ -0,0 +1,124 @@ +name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function getVersion(): string + { + return $this->version; + } + + public function setPackageVersion(string $version): self + { + $this->version = $version; + + return $this; + } + + public function isActive(): bool + { + return $this->active; + } + + public function setActive(bool $active): self + { + $this->active = $active; + + return $this; + } + + public function isOfficial(): bool + { + return $this->official; + } + + public function setOfficial(bool $official): self + { + $this->official = $official; + + return $this; + } + + /** + * @return array{name: string, version: string, active: bool, official: bool} + */ + public function jsonSerialize(): array + { + return [ + 'name' => $this->getName(), + 'version' => $this->getVersion(), + 'active' => $this->isActive(), + 'official' => $this->isOfficial(), + ]; + } +} diff --git a/src/Entity/Sitepackage.php b/src/Entity/Sitepackage.php deleted file mode 100644 index 58b8340e..00000000 --- a/src/Entity/Sitepackage.php +++ /dev/null @@ -1,370 +0,0 @@ -company if empty") - * @Serializer\Type("string") - * @var string - */ - private string $vendorName = ''; - - /** - * @Assert\Length( - * allowEmptyString=true, - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[a-z][a-z0-9-]+$/", - * message="Only letters, numbers and hyphens are allowed" - * ) - * @SWG\Property(type="string", example="bk2k", default="generated from vendor name if empty") - * @Serializer\Type("string") - * @var string - */ - private string $composerVendorName = ''; - - /** - * @Assert\NotBlank( - * message="Please enter a title for your Sitepackage" - * ) - * @Assert\Length( - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[A-Za-z0-9\x7f-\xff .:&-]+$/", - * message="Only letters, numbers and spaces are allowed" - * ) - * - * @SWG\Property(type="string", example="My Sitepackage") - * @Serializer\Type("string") - * @var string - */ - private string $title; - - /** - * @Assert\Regex( - * pattern="/^[A-Za-z0-9\x7f-\xff .,:!?&-]+$/", - * message="Only letters, numbers and spaces are allowed" - * ) - * - * @SWG\Property(type="string", example="Project Configuration for Client") - * @Serializer\Type("string") - * @var string - */ - private string $description; - - /** - * @Assert\Length( - * allowEmptyString=true, - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[A-Z][A-Za-z0-9]+$/", - * message="Only letters and numbers are allowed" - * ) - * @SWG\Property(type="string", example="MySitepackage", default="generated from title if empty") - * @Serializer\Type("string") - * @var string - */ - private string $packageName = ''; - - /** - * @Assert\Length( - * allowEmptyString=true, - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[a-z][a-z0-9-]+$/", - * message="Only lower case letters, numbers and hyphens are allowed" - * ) - * @SWG\Property(type="string", example="my-sitepackage", default="generated from package name if empty") - * @Serializer\Type("string") - * @var string - */ - private string $composerProjectName = ''; - - /** - * @Assert\Length( - * allowEmptyString=true, - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[a-z][a-z0-9_]+$/", - * message="Only lower case letters, numbers and undscores are allowed" - * ) - * @SWG\Property(type="string", example="my_sitepackage", default="generated from package name if empty") - * @Serializer\Type("string") - * @var string - */ - private string $extensionKey = ''; - - /** - * @Assert\Url - * @SWG\Property(type="string", example="https://github.com/benjaminkott/packagebuilder") - * - * @Serializer\Type("string") - * @var string - */ - private string $repositoryUrl = ''; - - /** - * @Assert\Valid - * @Serializer\Type(Author::class) - */ - private Author $author; - - public function __construct() - { - $this->author = new Author(); - } - - public function getTypo3Version(): int - { - return $this->typo3Version; - } - - public function setTypo3Version(int $typo3Version): self - { - $this->typo3Version = $typo3Version; - - return $this; - } - - public function getBasePackage(): string - { - return $this->basePackage; - } - - public function setBasePackage(string $basePackage): self - { - $this->basePackage = $basePackage; - - return $this; - } - - public function getVendorName(): string - { - if ($this->vendorName === '') { - return StringUtility::stringToUpperCamelCase($this->getAuthor()->getCompany()); - } - - return $this->vendorName; - } - - public function setVendorName(string $vendorName): self - { - if ($this->getVendorName() !== $vendorName) { - $this->vendorName = StringUtility::stringToUpperCamelCase($vendorName); - } - - return $this; - } - - public function getComposerVendorName(): string - { - if ($this->composerVendorName === '') { - return StringUtility::camelCaseToLowerCaseDashed($this->getVendorName()); - } - - return $this->composerVendorName; - } - - public function setComposerVendorName(string $composerVendorName): self - { - if ($this->getComposerVendorName() !== $composerVendorName) { - $this->composerVendorName = StringUtility::camelCaseToLowerCaseDashed($composerVendorName); - } - - return $this; - } - - public function getTitle(): string - { - return $this->title; - } - - public function setTitle(string $title): self - { - $this->title = $title; - - return $this; - } - - public function getDescription(): string - { - return $this->description; - } - - public function setDescription(string $description): self - { - $this->description = $description; - - return $this; - } - - public function getPackageName(): string - { - if ($this->packageName === '') { - return StringUtility::stringToUpperCamelCase($this->getTitle()); - } - - return $this->packageName; - } - - public function setPackageName(string $packageName): self - { - if ($this->getPackageName() !== $packageName) { - $this->packageName = StringUtility::stringToUpperCamelCase($packageName); - } - - return $this; - } - - public function getComposerProjectName(): string - { - if ($this->composerProjectName === '') { - return StringUtility::camelCaseToLowerCaseDashed($this->getPackageName()); - } - - return $this->composerProjectName; - } - - public function setComposerProjectName(string $composerProjectName): self - { - if ($this->getComposerProjectName() !== $composerProjectName) { - $this->composerProjectName = StringUtility::camelCaseToLowerCaseDashed($composerProjectName); - } - - return $this; - } - - public function getExtensionKey(): string - { - if ($this->extensionKey === '') { - return StringUtility::camelCaseToLowerCaseUnderscored($this->getPackageName()); - } - - return $this->extensionKey; - } - - public function setExtensionKey(string $extensionKey): self - { - if ($this->getExtensionKey() !== $extensionKey) { - $this->extensionKey = StringUtility::camelCaseToLowerCaseUnderscored($extensionKey); - } - - return $this; - } - - public function getRepositoryUrl(): string - { - return $this->repositoryUrl; - } - - public function setRepositoryUrl(string $repositoryUrl): self - { - $this->repositoryUrl = $repositoryUrl; - - return $this; - } - - public function getAuthor(): Author - { - return $this->author; - } - - public function setAuthor(Author $author): self - { - $this->author = $author; - - return $this; - } - - /** - * @return array - */ - public function jsonSerialize(): array - { - return [ - 'typo3Version' => $this->getTypo3Version(), - 'basePackage' => $this->getBasePackage(), - 'vendorName' => $this->getVendorName(), - 'composerVendorName' => $this->getComposerVendorName(), - 'title' => $this->getTitle(), - 'description' => $this->getDescription(), - 'packageName' => $this->getPackageName(), - 'composerProjectName' => $this->getComposerProjectName(), - 'extensionKey' => $this->getExtensionKey(), - 'repositoryUrl' => $this->getRepositoryUrl(), - 'author' => $this->getAuthor(), - ]; - } -} diff --git a/src/Enum/BasePackageEnum.php b/src/Enum/BasePackageEnum.php index bd8f5adc..9d3f8470 100644 --- a/src/Enum/BasePackageEnum.php +++ b/src/Enum/BasePackageEnum.php @@ -25,7 +25,14 @@ final class BasePackageEnum extends AbstractEnum { + /** + * @var string + */ public const OPTION_BOOTSTRAP_PACKAGE = 'bootstrap_package'; + + /** + * @var string + */ public const OPTION_FLUID_STYLED_CONTENT = 'fluid_styled_content'; protected static array $optionNames = [ diff --git a/src/Enum/Typo3VersionEnum.php b/src/Enum/Typo3VersionEnum.php index c70ffd4a..77967a8f 100644 --- a/src/Enum/Typo3VersionEnum.php +++ b/src/Enum/Typo3VersionEnum.php @@ -25,10 +25,25 @@ final class Typo3VersionEnum extends AbstractEnum { - public const OPTION_8 = 8007000; - public const OPTION_9 = 9005000; - public const OPTION_10 = 10004000; - public const OPTION_11 = 11005000; + /** + * @var int + */ + public const OPTION_8 = 8_007_000; + + /** + * @var int + */ + public const OPTION_9 = 9_005_000; + + /** + * @var int + */ + public const OPTION_10 = 10_004_000; + + /** + * @var int + */ + public const OPTION_11 = 11_005_000; protected static array $optionNames = [ self::OPTION_11 => '11.5 LTS', diff --git a/src/EventListener/BasePackageListener.php b/src/EventListener/BasePackageListener.php new file mode 100644 index 00000000..596438cc --- /dev/null +++ b/src/EventListener/BasePackageListener.php @@ -0,0 +1,47 @@ +basePackageService->resetCache(); + } + + public function postRemove(): void + { + $this->basePackageService->resetCache(); + } + + public function postPersist(): void + { + $this->basePackageService->resetCache(); + } +} diff --git a/src/Exception/IncompatiblePackageException.php b/src/Exception/IncompatiblePackageException.php new file mode 100644 index 00000000..279d9610 --- /dev/null +++ b/src/Exception/IncompatiblePackageException.php @@ -0,0 +1,30 @@ +setTypo3Version($dto->typo3Version) ->setBasePackage($dto->basePackage) - ->setVendorName($dto->vendorName ?? '') - ->setComposerVendorName($dto->composerVendorName ?? '') + ->setTypo3Version($dto->typo3Version) ->setTitle($dto->title ?? '') ->setDescription($dto->description ?? '') - ->setPackageName($dto->packageName ?? '') - ->setComposerProjectName($dto->composerProjectName ?? '') ->setExtensionKey($dto->extensionKey ?? '') ->setRepositoryUrl($dto->repositoryUrl ?? '') + ->setComposerName($dto->composerName ?? '') + ->setPsr4Namespace($dto->psr4Namespace ?? '') ->getAuthor() ->setName($dto->name ?? '') ->setEmail($dto->email ?? '') @@ -54,8 +52,6 @@ public static function fromDto(SitepackageDto $dto, Sitepackage $entity = null): public static function fromEntity(Sitepackage $sitepackage): SitepackageDto { - $dto = SitepackageDto::fromEntity($sitepackage); - - return $dto; + return SitepackageDto::fromEntity($sitepackage); } } diff --git a/src/Form/Dto/BasePackageDto.php b/src/Form/Dto/BasePackageDto.php new file mode 100644 index 00000000..e550de85 --- /dev/null +++ b/src/Form/Dto/BasePackageDto.php @@ -0,0 +1,120 @@ + + */ + public array $typo3Versions = []; + + #[Assert\NotBlank(message: 'Please enter a preview image for the base package.')] + #[Assert\Length(min: 5)] + public string $previewImage = 'images/preview.png'; + + public static function fromPackage(string $installPath, PackageInterface $package, ?BasePackageEntity $entity = null): self + { + $dto = new self($installPath); + $dto->loadManifest($package); + + $dto->active = ($entity !== null) ? $entity->isActive() : true; + $dto->official = ($entity !== null) ? $entity->isOfficial() : false; + $dto->thirdParty = ($entity === null); + + return $dto; + } + + public function __construct( + private readonly string $installPath, + ) { + } + + public function getInstallPath(): string + { + return $this->installPath; + } + + public function getAssetsDir(): string + { + return str_replace('/', '-', strtolower($this->packageName)); + } + + public function getVendorName(): string + { + return \explode('/', strtolower($this->packageName))[0]; + } + + public function getProjectName(): string + { + return \explode('/', strtolower($this->packageName))[1]; + } + + private function loadManifest(PackageInterface $package): void + { + $manifest = new BasePackageManifest($package); + + $this->packageName = $package->getName(); + $this->packageVersion = $package->getVersion(); + $this->title = $manifest->getTitle(); + $this->description = $manifest->getDescription(); + $this->typo3Versions = $manifest->getCoreVersions(); + $this->previewImage = $manifest->getPreviewImage(); + } +} diff --git a/src/Form/Dto/SitepackageDto.php b/src/Form/Dto/SitepackageDto.php index 81910bae..1c6c4d65 100644 --- a/src/Form/Dto/SitepackageDto.php +++ b/src/Form/Dto/SitepackageDto.php @@ -23,135 +23,85 @@ namespace App\Form\Dto; -use App\Entity\Sitepackage; -use App\Enum\BasePackageEnum; -use App\Enum\Typo3VersionEnum; +use App\Package\Sitepackage; use Symfony\Component\Validator\Constraints as Assert; class SitepackageDto { - /** - * @Assert\NotBlank - * @Assert\Choice(callback={"App\Enum\Typo3VersionEnum", "getAvailableOptions"}) - */ - public int $typo3Version = Typo3VersionEnum::OPTION_11; - - /** - * @Assert\NotBlank - * @Assert\Choice(callback={"App\Enum\BasePackageEnum", "getAvailableOptions"}) - */ - public string $basePackage = BasePackageEnum::OPTION_BOOTSTRAP_PACKAGE; - - /** - * @Assert\Length( - * allowEmptyString=true, - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[a-z0-9]([_.-]?[a-z0-9]+)*\/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$/", - * message="Only lower case letters, numbers, underscores, dots and hyphens are allowed" - * ) - */ - public ?string $composerName; - - /** - * @Assert\Length( - * allowEmptyString=true, - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[A-Z][A-Za-z0-9]+\[A-Z][A-Za-z0-9]+$/", - * message="Only letters and numbers are allowed" - * ) - */ - public ?string $psr4Namespace; - - /** - * @Assert\NotBlank( - * message="Please enter a title for your Sitepackage" - * ) - * @Assert\Length( - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[A-Za-z0-9\x7f-\xff .:&-]+$/", - * message="Only letters, numbers and spaces are allowed" - * ) - */ - public ?string $title; - - /** - * @Assert\Regex( - * pattern="/^[A-Za-z0-9\x7f-\xff .,:!?&-]+$/", - * message="Only letters, numbers and spaces are allowed" - * ) - */ - public ?string $description; - - /** - * @Assert\Url - */ - public ?string $repositoryUrl; - - /** - * @Assert\Length( - * allowEmptyString=true, - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[a-z][a-z0-9_]+$/", - * message="Only lower case letters, numbers and undscores are allowed" - * ) - */ - public ?string $extensionKey; - - /** - * @Assert\NotBlank(message="Please enter the authors' name.") - * @Assert\Length( - * min=3 - * ) - */ - public ?string $name; - - /** - * @Assert\NotBlank(message="Please enter the authors' email address.") - * @Assert\Email( - * message="The email '{{ value }}' is not a valid email.", - * ) - */ - public ?string $email; - - /** - * @Assert\NotBlank(message="Please enter the authors' company.") - * @Assert\Length( - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[A-Za-z0-9\x7f-\xff .:&-]+$/", - * message="Only letters, numbers and spaces are allowed" - * ) - */ - public ?string $company; - - /** - * @Assert\NotBlank(message="Please enter the authors' homepage URL.") - * @Assert\Url - */ - public ?string $homepage; - - public static function fromEntity(Sitepackage $entity): self - { + #[Assert\NotBlank] + public string $basePackage = ''; + + #[Assert\NotBlank] + public int $typo3Version = 0; + + #[Assert\NotBlank(message: 'Please enter a title for your Sitepackage.')] + #[Assert\Length(min: 3)] + #[Assert\Regex( + pattern: '/^[A-Za-z0-9\x7f-\xff .:&-]+$/', + message: 'Only letters, numbers and spaces are allowed.' + )] + public ?string $title = null; + + #[Assert\Regex( + pattern: '/^[A-Za-z0-9\x7f-\xff .,:!?&-]+$/', + message: 'Only letters, numbers and spaces are allowed.' + )] + public ?string $description = null; + + #[Assert\Url] + public ?string $repositoryUrl = null; + + #[Assert\Length(min: 3)] + #[Assert\Regex( + pattern: '/^[a-z][a-z0-9_]+$/', + message: 'Only lower case letters, numbers and underscores are allowed.' + )] + public ?string $extensionKey = null; + + #[Assert\Regex( + pattern: '/^[a-z0-9]([_.-]?[a-z0-9]+)*\/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$/', + message: 'The name must be lowercased and consist of words separated by `-`, `.` or `_`.' + )] + public ?string $composerName = null; + + #[Assert\Regex( + pattern: '/^[A-Z][A-Za-z0-9]+\\\[A-Z][A-Za-z0-9]+$/', + message: 'Only letters and numbers are allowed.' + )] + public ?string $psr4Namespace = null; + + #[Assert\NotBlank(message: "Please enter the authors' name.")] + #[Assert\Length(min: 3)] + public ?string $name = null; + + #[Assert\NotBlank(message: "Please enter the authors' email address.")] + #[Assert\Email(message: "The email '{{ value }}' is not a valid email.")] + public ?string $email = null; + + #[Assert\NotBlank(message: "Please enter the authors' company.")] + #[Assert\Length(min: 3)] + #[Assert\Regex( + pattern: '/^[A-Za-z0-9\x7f-\xff .:&-]+$/', + message: 'Only letters, numbers and spaces are allowed.' + )] + public ?string $company = null; + + #[Assert\NotBlank(message: "Please enter the authors' homepage URL.")] + #[Assert\Url] + public ?string $homepage = null; + + public static function fromEntity( + Sitepackage $entity + ): self { $dto = new self(); - $dto->typo3Version = $entity->getTypo3Version(); $dto->basePackage = $entity->getBasePackage(); - $dto->vendorName = $entity->getVendorName(); - $dto->composerVendorName = $entity->getComposerVendorName(); + $dto->typo3Version = $entity->getTypo3Version(); $dto->title = $entity->getTitle(); $dto->description = $entity->getDescription(); - $dto->packageName = $entity->getPackageName(); - $dto->composerProjectName = $entity->getComposerProjectName(); $dto->extensionKey = $entity->getExtensionKey(); $dto->repositoryUrl = $entity->getRepositoryUrl(); + $dto->composerName = $entity->getComposerName(); + $dto->psr4Namespace = $entity->getPsr4Namespace(); $dto->name = $entity->getAuthor()->getName(); $dto->email = $entity->getAuthor()->getEmail(); $dto->company = $entity->getAuthor()->getCompany(); diff --git a/src/Form/Extension/AbstractIconExtension.php b/src/Form/Extension/AbstractIconExtension.php new file mode 100644 index 00000000..be64233e --- /dev/null +++ b/src/Form/Extension/AbstractIconExtension.php @@ -0,0 +1,59 @@ + $options + */ + public function buildView(FormView $view, FormInterface $form, array $options): void + { + if (\is_string($icon = $options['icon'])) { + $view->vars['label'] = $this->iconExtension->getIcon($icon) . $view->vars['label']; + $view->vars['label_html'] = true; + } + } + + /** + * @inheritDoc + */ + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults(['icon' => null]); + $resolver->setAllowedTypes('icon', ['null', 'string']); + } +} diff --git a/src/Utility/FileUtility.php b/src/Form/Extension/ButtonTypeIconExtension.php similarity index 50% rename from src/Utility/FileUtility.php rename to src/Form/Extension/ButtonTypeIconExtension.php index 7be60ba2..b6e170bb 100644 --- a/src/Utility/FileUtility.php +++ b/src/Form/Extension/ButtonTypeIconExtension.php @@ -21,37 +21,17 @@ * The TYPO3 project - inspiring people to share! */ -namespace App\Utility; +namespace App\Form\Extension; -/** - * FileUtility - */ -class FileUtility +use Symfony\Component\Form\Extension\Core\Type\ButtonType; + +class ButtonTypeIconExtension extends AbstractIconExtension { /** - * @return array + * @inheritDoc */ - public static function listDirectory(string $dir, bool $filesOnly = false): array + public static function getExtendedTypes(): iterable { - $result = []; - $root = is_array($root = scandir($dir)) ? $root : []; - foreach ($root as $value) { - if ($value === '.' || $value === '..') { - continue; - } - if (is_file("$dir$value")) { - $result[] = "$dir$value"; - - continue; - } - if (is_dir("$dir$value") && !($filesOnly)) { - $result[] = "$dir$value/"; - } - foreach (self::listDirectory("$dir$value/") as $subValue) { - $result[] = $subValue; - } - } - - return $result; + return [ButtonType::class]; } } diff --git a/src/Form/SitepackageType.php b/src/Form/SitepackageType.php index 6835043b..6af41f62 100644 --- a/src/Form/SitepackageType.php +++ b/src/Form/SitepackageType.php @@ -26,6 +26,9 @@ use App\Form\Dto\SitepackageDto; use App\Form\Type\BasePackageType; use App\Form\Type\Typo3VersionType; +use App\Service\BasePackageService; +use App\Utility\VersionUtility; +use RuntimeException; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; @@ -34,44 +37,71 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; -/** - * SitepackageType - */ class SitepackageType extends AbstractType { + public function __construct( + private readonly BasePackageService $basePackageService, + ) { + } + /** - * {@inheritdoc} + * @inheritDoc */ public function buildForm(FormBuilderInterface $builder, array $options): void { $advanced = (bool)($options['advanced'] ?? false); + if (!($configuration = $options['data']) instanceof SitepackageDto) { + throw new RuntimeException('Wrong data class given.', 1_658_867_793); + } + + $basePackage = $this->basePackageService->getInstalledBasePackage($configuration->basePackage); + + if ($basePackage->thirdParty) { + $notification = 'This is an unregistered third party base package, not provided by TYPO3. Please contact the author in case of problems, we do not provide support.'; + $notificationType = 'danger'; + } elseif (!$basePackage->official) { + $notification = 'This is a third party base package, not provided by TYPO3. Please contact the author in case of problems, we do not provide support.'; + $notificationType = 'info'; + } else { + $notification = null; + $notificationType = ''; + } + $builder - //->setAction(is_string($action = $options['action']) ? $action : '') - ->add('typo3Version', Typo3VersionType::class, [ - 'label' => 'TYPO3 Version', - 'label_attr' => ['class' => 'w-auto pe-2'], - 'expanded' => true, - 'row_attr' => ['class' => 'd-inline-flex flex-column w-50'], - ]) ->add('basePackage', BasePackageType::class, [ 'label' => 'Base Package', - 'label_attr' => ['class' => 'w-auto me-2'], + 'notification' => $notification, + 'notification_type' => $notificationType, + ]) + ->add('typo3Version', Typo3VersionType::class, [ + 'label' => 'TYPO3 Version', + 'choice_filter' => static function (int $version) use ($basePackage): bool { + foreach ($basePackage->typo3Versions as $typo3Version) { + if ( + $version >= VersionUtility::versionToInt($typo3Version) && + $version % 1_000_000 === VersionUtility::versionToInt($typo3Version) % 1_000_000 + ) { + return true; + } + } + + return false; + }, 'expanded' => true, - 'row_attr' => ['class' => 'd-inline-flex flex-column w-50'], ]) ->add('title', TextType::class, [ 'attr' => [ 'autocomplete' => 'off', 'placeholder' => 'My Sitepackage', - ] + ], ]) ->add('description', TextareaType::class, [ 'required' => false, 'attr' => [ 'autocomplete' => 'off', 'placeholder' => 'Optional description for the use of this sitepackage', - ] + ], ]) ->add('repositoryUrl', TextType::class, [ 'label' => 'Repository URL', @@ -79,7 +109,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'attr' => [ 'autocomplete' => 'off', 'placeholder' => 'https://github.com/username/my_sitepackage', - ] + ], ]) ; @@ -142,7 +172,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void SubmitType::class, [ 'label' => 'Create Sitepackage', - //'icon' => 'floppy-disk', + 'icon' => 'actions-save', 'attr' => ['class' => 'btn-primary'], 'row_attr' => ['class' => 'd-inline-flex'], ] @@ -155,7 +185,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void SubmitType::class, [ 'label' => 'Simple Configuration', - //'icon' => 'pencil', + 'icon' => 'actions-toggle-off', 'attr' => ['class' => 'btn-secondary'], 'row_attr' => ['class' => 'd-inline-flex ms-1'], 'validate' => false, @@ -167,7 +197,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void SubmitType::class, [ 'label' => 'Advanced Configuration', - //'icon' => 'pencil', + 'icon' => 'actions-toggle-on', 'attr' => ['class' => 'btn-secondary'], 'row_attr' => ['class' => 'd-inline-flex ms-1'], 'validate' => false, diff --git a/src/Form/Type/BasePackageType.php b/src/Form/Type/BasePackageType.php index 88bfbba9..4ebbeb81 100644 --- a/src/Form/Type/BasePackageType.php +++ b/src/Form/Type/BasePackageType.php @@ -23,27 +23,46 @@ namespace App\Form\Type; -use App\Enum\BasePackageEnum; +use App\Service\BasePackageService; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\FormView; use Symfony\Component\OptionsResolver\OptionsResolver; class BasePackageType extends AbstractType { + public function __construct( + private readonly BasePackageService $basePackageService, + ) { + } + public function configureOptions(OptionsResolver $resolver): void { $choices = []; - foreach (BasePackageEnum::getAvailableOptions() as $option) { - $choices[BasePackageEnum::getName($option)] = $option; + foreach ($this->basePackageService->getInstalledBasePackages() as $basePackage) { + $choices[\sprintf('%s (%s)', $basePackage->title, $basePackage->packageName)] = $basePackage->packageName; } $resolver->setDefaults([ 'choices' => $choices, + 'disabled' => true, + 'notification' => null, + 'notification_type' => 'danger', ]); + + $resolver->setAllowedTypes('notification', ['null', 'string']); + $resolver->setAllowedTypes('notification_type', 'string'); + } + + public function buildView(FormView $view, FormInterface $form, array $options): void + { + $view->vars['notification'] = $options['notification']; + $view->vars['notification_type'] = $options['notification_type']; } - public function getParent() + public function getParent(): string { return ChoiceType::class; } diff --git a/src/Form/Type/Typo3VersionType.php b/src/Form/Type/Typo3VersionType.php index 1024eb70..7ef48e59 100644 --- a/src/Form/Type/Typo3VersionType.php +++ b/src/Form/Type/Typo3VersionType.php @@ -23,23 +23,31 @@ namespace App\Form\Type; -use App\Enum\Typo3VersionEnum; +use App\Repository\MajorVersionRepository; +use App\Utility\VersionUtility; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\OptionsResolver\OptionsResolver; class Typo3VersionType extends AbstractType { - private const LOWEST_SUPPORTED_VERSION = Typo3VersionEnum::OPTION_8; + public function __construct( + private readonly MajorVersionRepository $majorVersions, + ) { + } public function configureOptions(OptionsResolver $resolver): void { $choices = []; - foreach (Typo3VersionEnum::getAvailableOptions(true) as $option => $name) { - if ($option >= self::LOWEST_SUPPORTED_VERSION) { - $choices['TYPO3 ' . $name] = $option; + foreach ($this->majorVersions->findAllComposerSupported() as $majorVersion) { + if ($majorVersion->getLatestRelease() === null) { + continue; } + + $choices[$majorVersion->getTitle()] = VersionUtility::versionToInt( + VersionUtility::normalize($majorVersion->getLatestRelease()->getVersion(), 2) + ); } $resolver->setDefaults([ @@ -47,7 +55,7 @@ public function configureOptions(OptionsResolver $resolver): void ]); } - public function getParent() + public function getParent(): string { return ChoiceType::class; } diff --git a/src/Kernel.php b/src/Kernel.php index e5396fb3..4e61cb33 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -24,38 +24,9 @@ namespace App; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; -use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Component\HttpKernel\Kernel as BaseKernel; -use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; - -use function dirname; class Kernel extends BaseKernel { use MicroKernelTrait; - - protected function configureContainer(ContainerConfigurator $container): void - { - $container->import('../config/{packages}/*.yaml'); - $container->import('../config/{packages}/' . $this->environment . '/*.yaml'); - - if (is_file(dirname(__DIR__) . '/config/services.yaml')) { - $container->import('../config/services.yaml'); - $container->import('../config/{services}_' . $this->environment . '.yaml'); - } elseif (is_file($path = dirname(__DIR__) . '/config/services.php')) { - (require $path)($container->withPath($path), $this); - } - } - - protected function configureRoutes(RoutingConfigurator $routes): void - { - $routes->import('../config/{routes}/' . $this->environment . '/*.yaml'); - $routes->import('../config/{routes}/*.yaml'); - - if (is_file(dirname(__DIR__) . '/config/routes.yaml')) { - $routes->import('../config/routes.yaml'); - } elseif (is_file($path = dirname(__DIR__) . '/config/routes.php')) { - (require $path)($routes->withPath($path), $this); - } - } } diff --git a/src/Menu/MenuBuilder.php b/src/Menu/MenuBuilder.php index 776fdb70..358faf4b 100644 --- a/src/Menu/MenuBuilder.php +++ b/src/Menu/MenuBuilder.php @@ -52,14 +52,14 @@ public function mainDefault(array $options): ItemInterface 'wizards', [ 'route' => 'wizards_sitepackage', - 'label' => 'Wizards' + 'label' => 'Wizards', ] ); $wizards->addChild( 'wizards-sitepackage', [ 'route' => 'wizards_sitepackage', - 'label' => 'Sitepackage Builder' + 'label' => 'Sitepackage Builder', ] ); $composer = $menu->addChild( diff --git a/src/Package/BasePackageManifest.php b/src/Package/BasePackageManifest.php new file mode 100644 index 00000000..f1223f9f --- /dev/null +++ b/src/Package/BasePackageManifest.php @@ -0,0 +1,127 @@ +package->getName(); + } + + public function getVersion(): string + { + return $this->package->getVersion(); + } + + public function getTitle(): string + { + return $this->getStringValue('title'); + } + + public function getDescription(): string + { + return $this->getStringValue('description'); + } + + /** + * @return array + */ + public function getCoreVersions(): array + { + $array = $this->getArrayValue('core-versions'); + \rsort($array, SORT_NUMERIC); + return $array; + } + + public function getPreviewImage(): string + { + $array = $this->getArrayValue('images', []); + return $array['preview'] ?? 'images/preview.png'; + } + + /** + * @return array + */ + private function getExtraConfig(): array + { + if (!\is_array($extraConfig = ($this->package->getExtra()[self::EXTRA_KEY] ?? []))) { + throw new RuntimeException( + 'Extra config is not defined or is not an array.', + 1_658_926_616 + ); + } + + return $extraConfig; + } + + private function getStringValue(string $key, ?string $default = null): string + { + if (!\is_string($value = ($this->getExtraConfig()[$key] ?? null))) { + if ($default === null) { + throw new RuntimeException( + \sprintf('Mandatory property "%s" is not defined or is not a string.', $key), + 1_658_926_617 + ); + } + + $value = $default; + } + + return $value; + } + + /** + * @param string[]|null $default + * @return string[] + */ + private function getArrayValue(string $key, ?array $default = null): array + { + if (!\is_array($value = ($this->getExtraConfig()[$key] ?? null))) { + if ($default === null) { + throw new RuntimeException( + \sprintf('Mandatory property "%s" is not defined or is not an array.', $key), + 1_658_926_618 + ); + } + + $value = $default; + } + + return $value; + } +} diff --git a/src/Entity/Package/Author.php b/src/Package/Package/Author.php similarity index 50% rename from src/Entity/Package/Author.php rename to src/Package/Package/Author.php index b7a67c8d..dbcca72e 100644 --- a/src/Entity/Package/Author.php +++ b/src/Package/Package/Author.php @@ -21,10 +21,10 @@ * The TYPO3 project - inspiring people to share! */ -namespace App\Entity\Package; +namespace App\Package\Package; use JMS\Serializer\Annotation as Serializer; -use Swagger\Annotations as SWG; +use OpenApi\Attributes as OA; use Symfony\Component\Validator\Constraints as Assert; /** @@ -32,122 +32,76 @@ */ class Author implements \JsonSerializable { - /** - * @Assert\NotBlank(message="Please enter the authors' name.") - * @Assert\Length( - * min=3 - * ) - * @SWG\Property(type="string", example="Benjamin Kott") - * @Serializer\Type("string") - * @var string - */ + #[Assert\NotBlank(message: "Please enter the authors' name.")] + #[Assert\Length(min: 3)] + #[OA\Property(example: 'John Doe')] + #[Serializer\Type('string')] private string $name = ''; - /** - * @Assert\NotBlank(message="Please enter the authors' email address.") - * @Assert\Email( - * message="The email '{{ value }}' is not a valid email.", - * ) - * @SWG\Property(type="string", example="contact@sitepackagebuilder.com") - * @Serializer\Type("string") - * @var string - */ + #[Assert\NotBlank(message: "Please enter the authors' email address.")] + #[Assert\Email(message: "The email '{{ value }}' is not a valid email.")] + #[OA\Property(example: 'john.doe@example.com')] + #[Serializer\Type('string')] private string $email = ''; - /** - * @Assert\NotBlank(message="Please enter the authors' company.") - * @Assert\Length( - * min=3 - * ) - * @Assert\Regex( - * pattern="/^[A-Za-z0-9\x7f-\xff .:&-]+$/", - * message="Only letters, numbers and spaces are allowed" - * ) - * @SWG\Property(type="string", example="BK2K") - * @Serializer\Type("string") - * @var string - */ + #[Assert\NotBlank(message: "Please enter the authors' company.")] + #[Assert\Length(min: 3)] + #[Assert\Regex( + pattern: '/^[A-Za-z0-9\x7f-\xff .:&-]+$/', + message: 'Only letters, numbers and spaces are allowed.' + )] + #[OA\Property(example: 'My Company')] + #[Serializer\Type('string')] private string $company = ''; - /** - * @Assert\NotBlank(message="Please enter the authors' homepage URL.") - * @Assert\Url - * @SWG\Property(type="string", example="https://www.sitepackagebuilder.com") - * @Serializer\Type("string") - * @var string - */ + #[Assert\NotBlank(message: "Please enter the authors' homepage URL.")] + #[Assert\Url] + #[OA\Property(example: 'https://example.com')] + #[Serializer\Type('string')] private string $homepage = ''; - /** - * @return string - */ public function getName(): string { return $this->name; } - /** - * @param string $name - * @return Author - */ - public function setName(string $name) + public function setName(string $name): static { $this->name = $name; return $this; } - /** - * @return string - */ public function getEmail(): string { return $this->email; } - /** - * @param string $email - * @return Author - */ - public function setEmail(string $email) + public function setEmail(string $email): static { $this->email = $email; return $this; } - /** - * @return string - */ public function getCompany(): string { return $this->company; } - /** - * @param string $company - * @return Author - */ - public function setCompany(string $company) + public function setCompany(string $company): static { $this->company = $company; return $this; } - /** - * @return string - */ public function getHomepage(): string { return $this->homepage; } - /** - * @param string $homepage - * @return Author - */ - public function setHomepage(string $homepage) + public function setHomepage(string $homepage): static { $this->homepage = $homepage; @@ -155,7 +109,7 @@ public function setHomepage(string $homepage) } /** - * @return array + * @return array{name: string, email: string, company: string, homepage: string} */ public function jsonSerialize(): array { diff --git a/src/Package/Sitepackage.php b/src/Package/Sitepackage.php new file mode 100644 index 00000000..57fba7b9 --- /dev/null +++ b/src/Package/Sitepackage.php @@ -0,0 +1,275 @@ +company and title if empty") + */ + #[Assert\Regex( + pattern: '/^[a-z0-9]([_.-]?[a-z0-9]+)*\/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$/', + message: 'The name must be lowercased and consist of words separated by `-`, `.` or `_`.' + )] + #[Serializer\Type('string')] + private string $composerName = ''; + + /** + * @SWG\Property(type="string", example="MyCompany\MySitepackage", default="generated from author->company and title if empty") + */ + #[Assert\Regex( + pattern: '/^[A-Z][A-Za-z0-9]+\\\[A-Z][A-Za-z0-9]+$/', + message: 'Only letters and numbers are allowed.' + )] + #[Serializer\Type('string')] + private string $psr4Namespace = ''; + + #[Assert\Valid] + #[Serializer\Type(Author::class)] + private Author $author; + + public function __construct() + { + $this->author = new Author(); + } + + public function getBasePackage(): string + { + return $this->basePackage; + } + + public function setBasePackage(string $basePackage): self + { + $this->basePackage = $basePackage; + + return $this; + } + + public function getTypo3Version(): int + { + return $this->typo3Version; + } + + public function setTypo3Version(int $typo3Version): self + { + $this->typo3Version = $typo3Version; + + return $this; + } + + public function getTitle(): string + { + return $this->title; + } + + public function setTitle(string $title): self + { + $this->title = $title; + + return $this; + } + + public function getDescription(): string + { + return $this->description; + } + + public function setDescription(string $description): self + { + $this->description = $description; + + return $this; + } + + public function getExtensionKey(): string + { + if ($this->extensionKey === '') { + return StringUtility::camelCaseToLowerCaseUnderscored($this->getTitle()); + } + + return $this->extensionKey; + } + + public function setExtensionKey(string $extensionKey): self + { + if ($this->getExtensionKey() !== $extensionKey) { + $this->extensionKey = StringUtility::camelCaseToLowerCaseUnderscored($extensionKey); + } + + return $this; + } + + public function getRepositoryUrl(): string + { + return $this->repositoryUrl; + } + + public function setRepositoryUrl(string $repositoryUrl): self + { + $this->repositoryUrl = $repositoryUrl; + + return $this; + } + + public function getComposerName(): string + { + if ($this->composerName === '') { + return StringUtility::camelCaseToLowerCaseDashed($this->getAuthor()->getCompany()) . '/' . + StringUtility::camelCaseToLowerCaseDashed($this->getTitle()); + } + + return $this->composerName; + } + + public function setComposerName(string $composerName): self + { + if ($this->getComposerName() !== $composerName) { + $this->composerName = $composerName; + } + + return $this; + } + + public function getComposerVendorName(): string + { + return \explode('/', $this->getComposerName())[0]; + } + + public function getComposerProjectName(): string + { + return \explode('/', $this->getComposerName())[1]; + } + + public function getPsr4Namespace(): string + { + if ($this->psr4Namespace === '') { + return StringUtility::stringToUpperCamelCase($this->getAuthor()->getCompany()) . '\\' . + StringUtility::stringToUpperCamelCase($this->getTitle()); + } + + return $this->psr4Namespace; + } + + public function setPsr4Namespace(string $psr4Namespace): self + { + if ($this->getPsr4Namespace() !== $psr4Namespace) { + $this->psr4Namespace = $psr4Namespace; + } + + return $this; + } + + public function getAuthor(): Author + { + return $this->author; + } + + public function setAuthor(Author $author): self + { + $this->author = $author; + + return $this; + } + + /** + * @return array{basePackage: string, typo3Version: int, title: string, description: string, extensionKey: string, repositoryUrl: string, composerName: string, psr4Namespace: string, author: Author} + */ + public function jsonSerialize(): array + { + return [ + 'basePackage' => $this->getBasePackage(), + 'typo3Version' => $this->getTypo3Version(), + 'title' => $this->getTitle(), + 'description' => $this->getDescription(), + 'extensionKey' => $this->getExtensionKey(), + 'repositoryUrl' => $this->getRepositoryUrl(), + 'composerName' => $this->getComposerName(), + 'psr4Namespace' => $this->getPsr4Namespace(), + 'author' => $this->getAuthor(), + ]; + } +} diff --git a/src/Repository/BasePackageRepository.php b/src/Repository/BasePackageRepository.php new file mode 100644 index 00000000..bed7028d --- /dev/null +++ b/src/Repository/BasePackageRepository.php @@ -0,0 +1,107 @@ + + * + * @method BasePackage|null find($id, $lockMode = null, $lockVersion = null) + * @method BasePackage|null findOneBy(array $criteria, array $orderBy = null) + * @method BasePackage[] findAll() + * @method BasePackage[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) + */ +final class BasePackageRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, BasePackage::class); + } + + public function add(BasePackage $entity, bool $flush = false): void + { + $this->getEntityManager()->persist($entity); + + if ($flush) { + $this->getEntityManager()->flush(); + } + } + + public function remove(BasePackage $entity, bool $flush = false): void + { + $this->getEntityManager()->remove($entity); + + if ($flush) { + $this->getEntityManager()->flush(); + } + } + + /** + * @return BasePackage[] + */ + public function findAllActive(): array + { + return $this->findBy( + ['active' => true], + ['name' => 'ASC'] + ); + } + + /** + * @return BasePackage[] + */ + public function findAllActiveGroupedByOfficial(): array + { + return $this->findBy( + ['active' => true], + ['official' => 'DESC', 'name' => 'ASC'] + ); + } + +// /** +// * @return BasePackage[] Returns an array of BasePackage objects +// */ +// public function findByExampleField($value): array +// { +// return $this->createQueryBuilder('b') +// ->andWhere('b.exampleField = :val') +// ->setParameter('val', $value) +// ->orderBy('b.id', 'ASC') +// ->setMaxResults(10) +// ->getQuery() +// ->getResult() +// ; +// } + +// public function findOneBySomeField($value): ?BasePackage +// { +// return $this->createQueryBuilder('b') +// ->andWhere('b.exampleField = :val') +// ->setParameter('val', $value) +// ->getQuery() +// ->getOneOrNullResult() +// ; +// } +} diff --git a/src/Service/BasePackageService.php b/src/Service/BasePackageService.php new file mode 100644 index 00000000..6b037058 --- /dev/null +++ b/src/Service/BasePackageService.php @@ -0,0 +1,608 @@ +composerApplication->setAutoExit(false); + } + + private function getProjectDir(): string + { + return \rtrim($this->kernel->getProjectDir() . '/' . $this->projectDir, '/'); + } + + private function changeToProjectDir(): void + { + $oldWorkingDir = (string)\getcwd(); + //$oldWorkingDir = Platform::getCwd(true); + + if ($oldWorkingDir !== $this->getProjectDir()) { + chdir($this->getProjectDir()); + $this->oldWorkingDir = $oldWorkingDir; + } + } + + private function restoreToWorkingDir(): void + { + if ($this->oldWorkingDir !== '') { + chdir($this->oldWorkingDir); + $this->oldWorkingDir = ''; + } + } + + private function getPublicDir(): string + { + $defaultPublicDir = 'public'; + + $composerFilePath = $this->kernel->getProjectDir() . '/composer.json'; + + if (!file_exists($composerFilePath)) { + return $defaultPublicDir; + } + + if (!\is_string($contents = file_get_contents($composerFilePath))) { + return $defaultPublicDir; + } + + if (!\is_array($composerConfig = json_decode($contents, true, 512, JSON_THROW_ON_ERROR))) { + return $defaultPublicDir; + } + + return $composerConfig['extra']['public-dir'] ?? $defaultPublicDir; + } + + private function getPublicAssetsDir(): string + { + $publicDir = $this->kernel->getProjectDir() . '/' . $this->getPublicDir(); + + if (!is_dir($publicDir)) { + throw new RuntimeException(sprintf('The target directory "%s" does not exist.', $publicDir)); + } + + return \rtrim($publicDir . '/' . $this->assetsDir, '/'); + } + + /** + * Creates symbolic link. + * + * @throws RuntimeException if link cannot be created + */ + private function symlink(string $originDir, string $targetDir, bool $relative = false): void + { + if ($relative) { + $this->filesystem->mkdir(\dirname($targetDir)); + + if (!\is_string($absoluteTargetDir = realpath(\dirname($targetDir)))) { + throw new RuntimeException( + sprintf('Could not determine absolute path for "%s".', $targetDir), + 1_658_923_646 + ); + } + + $originDir = $this->filesystem->makePathRelative($originDir, $absoluteTargetDir); + } + + $this->filesystem->symlink($originDir, $targetDir); + + if (!file_exists($targetDir)) { + throw new RuntimeException( + sprintf('Symbolic link "%s" was created but appears to be broken.', $targetDir), + 1_658_923_653 + ); + } + } + + private function installAssets(): void + { + $publicAssetsDir = $this->getPublicAssetsDir() . '/'; + $validAssetDirs = []; + + foreach ($this->getInstalledBasePackages() as $basePackage) { + if (!is_dir($originDir = $basePackage->getInstallPath() . '/public')) { + continue; + } + + $assetDir = $basePackage->getAssetsDir(); + $targetDir = $publicAssetsDir . $assetDir; + $validAssetDirs[] = $assetDir; + + $this->filesystem->remove($targetDir); + $this->symlink($originDir, $targetDir, true); + } + + // remove the assets of the bundles that no longer exist + if (is_dir($publicAssetsDir)) { + $dirsToRemove = Finder::create()->depth(0)->directories()->exclude($validAssetDirs)->in($publicAssetsDir); + $this->filesystem->remove($dirsToRemove); + } + } + + private function getComposer(): Composer + { + $composer = $this->composerApplication->getComposer(); + + if (!$composer instanceof \Composer\Composer) { + throw new RuntimeException( + \sprintf('Composer project is not setup in "%s".', $this->getProjectDir()), + 1_658_915_927 + ); + } + + return $composer; + } + + /** + * @return array + */ + private function getComposerProjectFiles(): array + { + return [ + $this->getProjectDir() . '/vendor', + $this->getProjectDir() . '/composer.json', + $this->getProjectDir() . '/composer.lock', + ]; + } + + private function initializeProject(bool $force = false): void + { + // Remove previous installation + if ($force) { + $this->filesystem->remove($this->getComposerProjectFiles()); + } + + // Early return if project already exists + if ($this->filesystem->exists($this->getComposerProjectFiles())) { + return; + } + + // Create project + $pathToRepo = $this->filesystem->makePathRelative($this->kernel->getProjectDir() . '/packages/', $this->getProjectDir()); + + $output = new BufferedOutput(); + $input = new ArrayInput([ + 'command' => 'init', + '--name' => 't3o/base-packages', + '--description' => 'Known base packages shown at the get.typo3.org wizards.', + '--type' => 'project', + '--stability' => 'dev', + '--repository' => ['{"type": "path", "url": "' . $pathToRepo . '*"}'], + '--ansi' => true, + '--no-interaction' => true, + '--working-dir' => $this->getProjectDir(), + ]); + + if (($exitCode = $this->composerApplication->run($input, $output)) !== 0) { + throw new RuntimeException(\sprintf('Composer failed:\n%s', $output->fetch()), $exitCode); + } + + $this->cache->invalidateTags(['installed-base-packages']); + } + + private function installBasePackages(): void + { + $this->initializeProject(); + + // Prepare packages to require + $requirements = []; + foreach ($this->basePackageRepository->findAllActive() as $basePackage) { + $requirements[] = \sprintf('%s:%s', $basePackage->getName(), $basePackage->getVersion()); + } + + // Require packages + $output = new BufferedOutput(); + $input = new ArrayInput([ + 'command' => 'require', + '--no-progress' => true, + //'--no-update' => true, + //'--no-install' => true, + '--update-with-all-dependencies' => true, + '--ansi' => true, + '--no-interaction' => true, + '--working-dir' => $this->getProjectDir(), + 'packages' => $requirements, + ]); + + if (($exitCode = $this->composerApplication->run($input, $output)) !== 0) { + throw new RuntimeException(\sprintf('Composer failed:\n%s', $output->fetch()), $exitCode); + } + + $this->cache->invalidateTags(['installed-base-packages']); + + $this->installAssets(); + } + + private function installBasePackage(string $packageName): void + { + $this->initializeProject(); + + // Require package + $output = new BufferedOutput(); + $input = new ArrayInput([ + 'command' => 'require', + '--no-progress' => true, + //'--no-update' => true, + //'--no-install' => true, + '--update-with-all-dependencies' => true, + '--ansi' => true, + '--no-interaction' => true, + '--working-dir' => $this->getProjectDir(), + 'packages' => [$packageName . ':*'], + ]); + + if (($exitCode = $this->composerApplication->run($input, $output)) !== 0) { + throw new RuntimeException(\sprintf('Composer failed:\n%s', $output->fetch()), $exitCode); + } + + $this->cache->invalidateTags(['installed-base-packages']); + + $this->installAssets(); + } + + public function updateBasePackages(): void + { + // Install or update packages + $output = new BufferedOutput(); + $input = new ArrayInput([ + 'command' => 'update', + '--no-progress' => true, + '--with-all-dependencies' => true, + '--ignore-platform-reqs' => true, + '--prefer-stable' => true, + '--ansi' => true, + '--no-interaction' => true, + '--working-dir' => $this->getProjectDir(), + ]); + + if (($exitCode = $this->composerApplication->run($input, $output)) !== 0) { + throw new RuntimeException(\sprintf('Composer failed:\n%s', $output->fetch()), $exitCode); + } + + $this->cache->invalidateTags(['installed-base-packages']); + + $this->installAssets(); + } + + private function removeBasePackage(string $packageName): void + { + $this->initializeProject(); + + // Require package + $output = new BufferedOutput(); + $input = new ArrayInput([ + 'command' => 'remove', + '--no-progress' => true, + //'--no-update' => true, + //'--no-install' => true, + '--update-with-all-dependencies' => true, + '--unused' => true, + '--ansi' => true, + '--no-interaction' => true, + '--working-dir' => $this->getProjectDir(), + 'packages' => [$packageName], + ]); + + if (($exitCode = $this->composerApplication->run($input, $output)) !== 0) { + throw new RuntimeException(\sprintf('Composer failed:\n%s', $output->fetch()), $exitCode); + } + + $this->cache->invalidateTags(['installed-base-packages']); + + $this->installAssets(); + } + + /** + * @return array + */ + public function getInstalledBasePackages(): array + { + return $this->cache->get('installed-base-packages-grouped-by-official', function (ItemInterface $item): array { + $item->tag(['installed-base-packages', 'base-packages']); + $installedBasePackages = []; + + $this->changeToProjectDir(); + + try { + try { + $composer = $this->getComposer(); + } catch (Throwable) { + return $installedBasePackages; + } + + foreach ($composer->getRepositoryManager()->getLocalRepository()->getPackages() as $package) { + if ($package->getType() === self::PACKAGE_TYPE) { + $basePackageDto = BasePackageDto::fromPackage( + $composer->getInstallationManager()->getInstallPath($package), + $package, + $this->basePackageRepository->findOneBy([ + 'name' => $package->getName(), + 'active' => true, + ]) + ); + $installedBasePackages[] = $basePackageDto; + } + } + + \usort($installedBasePackages, static function (BasePackageDto $a, BasePackageDto $b): int { + if ($a->official !== $b->official) { + if ($a->official) { + return -1; + } + + return 1; + } + + return $a->title <=> $b->title; + }); + + return $installedBasePackages; + } finally { + $this->restoreToWorkingDir(); + } + }); + } + + public function getInstalledBasePackage(string $packageName): BasePackageDto + { + foreach ($this->getInstalledBasePackages() as $basePackage) { + if ($basePackage->packageName === $packageName) { + return $basePackage; + } + } + + throw new PackageNotInstalledException(\sprintf('Base package "%s" not found.', $packageName), 1_658_839_466); + } + + /** + * @return array + */ + public function getBasePackages(): array + { + return $this->cache->get('active-base-packages-grouped-by-official', function (ItemInterface $item): array { + $item->tag(['active-base-packages', 'base-packages']); + + $basePackages = []; + + $this->changeToProjectDir(); + + try { + $this->installBasePackages(); + + try { + $composer = $this->getComposer(); + } catch (Throwable) { + return $basePackages; + } + + foreach ($this->basePackageRepository->findAllActiveGroupedByOfficial() as $basePackage) { + $package = $composer->getRepositoryManager()->getLocalRepository()->findPackage( + $basePackage->getName(), + new MatchAllConstraint() + ); + + if (!$package instanceof PackageInterface) { + throw new RuntimeException( + \sprintf('Package "%s" not found.', $basePackage->getName()), + 1_658_944_953 + ); + } + + $basePackageDto = BasePackageDto::fromPackage( + $composer->getInstallationManager()->getInstallPath($package), + $package, + $basePackage + ); + + $basePackages[] = $basePackageDto; + } + + return $basePackages; + } finally { + $this->restoreToWorkingDir(); + } + }); + } + + public function checkAndInstallMissingBasePackage(string $packageName): BasePackageDto + { + $this->changeToProjectDir(); + + try { + try { + $basePackage = $this->getInstalledBasePackage($packageName); + } catch (PackageNotInstalledException) { + try { + $basePackage = $this->validate($packageName); + } catch (Throwable $throwable) { + $this->removeBasePackage($packageName); + + throw $throwable; + } + } + + return $basePackage; + } finally { + $this->restoreToWorkingDir(); + } + } + + public function validate(string $packageName): BasePackageDto + { + $this->changeToProjectDir(); + + try { + try { + $basePackage = $this->getInstalledBasePackage($packageName); + } catch (PackageNotInstalledException) { + $package = $this->getComposer()->getRepositoryManager()->findPackage( + $packageName, + new MatchAllConstraint() + ); + + if (!$package instanceof PackageInterface) { + throw new RuntimeException( + \sprintf('Package "%s" not found.', $packageName), + 1_658_944_953 + ); + } + + if ($package->getType() !== self::PACKAGE_TYPE) { + throw new IncompatiblePackageException( + \sprintf('Package "%s" is not of type "%s".', $packageName, self::PACKAGE_TYPE), + 1_658_786_562 + ); + } + + $this->installBasePackage($packageName); + + $basePackage = $this->getInstalledBasePackage($packageName); + } + } finally { + $this->restoreToWorkingDir(); + } + + try { + if (\strlen($basePackage->title) < 5) { + throw new IncompatiblePackageException( + \sprintf('Title "%s" must have 5 characters or more.', $basePackage->title), + 1_658_945_128 + ); + } + + if (\strlen($basePackage->description) < 10) { + throw new IncompatiblePackageException( + \sprintf('Description "%s" must have 10 characters or more.', $basePackage->description), + 1_658_945_398 + ); + } + + if ($basePackage->typo3Versions === []) { + throw new IncompatiblePackageException( + 'A base package must define one or more supported TYPO3 core versions.', + 1_658_945_403 + ); + } + + if (!\file_exists($basePackage->getInstallPath() . '/public/' . $basePackage->previewImage)) { + throw new IncompatiblePackageException( + 'A base package must have a preview image.', + 1_658_946_257 + ); + } + + $forbiddenFiles = Finder::create() + ->ignoreDotFiles(false) + ->files() + ->notName(self::ALLOWED_FILE_TYPES) + ->in($basePackage->getInstallPath()/* . '/templates/skeletons'*/) + ; + if ($forbiddenFiles->hasResults()) { + throw new IncompatiblePackageException( + \sprintf( + 'Package contains not allowed files: %s', + \str_replace( + $basePackage->getInstallPath() . '/', + '', + \implode( + ', ', + \iterator_to_array($forbiddenFiles->getIterator()) + ) + ) + ), + 1_658_952_036 + ); + } + + return $basePackage; + } catch (Throwable $throwable) { + throw new IncompatiblePackageException( + \sprintf('Package "%s" is not a valid base package. %s', $packageName, $throwable->getMessage()), + 1_658_949_297 + ); + } + } + + public function resetCache(): void + { + $this->cache->invalidateTags(['base-packages']); + } +} diff --git a/src/Service/SitepackageGenerator.php b/src/Service/SitepackageGenerator.php index ffb1ad84..ecd2c9fb 100644 --- a/src/Service/SitepackageGenerator.php +++ b/src/Service/SitepackageGenerator.php @@ -23,44 +23,55 @@ namespace App\Service; -use App\Entity\Sitepackage; -use App\Utility\FileUtility; +use App\Form\Dto\BasePackageDto; +use App\Package\Sitepackage; +use App\Utility\VersionUtility; +use RuntimeException; +use Symfony\Component\Finder\Finder; use Twig\Environment; use Twig\Loader\ArrayLoader; +use ZipArchive; -/** - * SitepackageGenerator - */ -class SitepackageGenerator +final class SitepackageGenerator { - protected string $zipPath; - protected string $filename; + /** + * @var array + */ + private array $basePackages = []; + + private string $zipPath; + + private string $filename; + + public function __construct( + private readonly BasePackageService $basePackageService, + ) { + } public function create(Sitepackage $package): void { $extensionKey = $package->getExtensionKey(); $this->filename = $extensionKey . '.zip'; - $sourceDir = __DIR__ . '/../../resources/skeletons/BaseExtension/' . $package->getBasePackage() . '/'; + $sourceDir = $this->getSourceDir($package); $this->zipPath = is_string($zipPath = tempnam(sys_get_temp_dir(), $this->filename)) ? $zipPath : $this->filename; - $fileList = FileUtility::listDirectory($sourceDir); + $files = Finder::create()->ignoreDotFiles(false)->ignoreVCS(false)->in($sourceDir); - $zipFile = new \ZipArchive(); - $opened = $zipFile->open($this->zipPath, \ZipArchive::CREATE); + $zipFile = new ZipArchive(); + $opened = $zipFile->open($this->zipPath, ZipArchive::CREATE); if ($opened === true) { - foreach ($fileList as $file) { - if ($file !== $this->zipPath && file_exists($file)) { - $baseFileName = $this->createRelativeFilePath($file, $sourceDir); - if (is_dir($file)) { - $zipFile->addEmptyDir($baseFileName); - } elseif (!$this->isTwigFile($file)) { - $zipFile->addFile($file, $baseFileName); - } else { - $content = $this->getFileContent($file, $package); - $nameInZip = $this->removeTwigExtension($baseFileName); - $zipFile->addFromString($nameInZip, $content); - } + foreach ($files as $file) { + $baseFileName = $this->createRelativeFilePath($file->getPathname(), $sourceDir); + if ($file->isDir()) { + $zipFile->addEmptyDir($baseFileName); + } elseif (!$this->isTwigFile($file->getExtension())) { + $zipFile->addFile($file->getPathname(), $baseFileName); + } else { + $content = $this->getFileContent($file->getPathname(), $sourceDir, $package); + $nameInZip = $this->removeTwigExtension($baseFileName); + $zipFile->addFromString($nameInZip, $content); } } + $zipFile->close(); } } @@ -75,27 +86,64 @@ public function getFilename(): string return $this->filename; } - private function getFileContent(string $file, Sitepackage $package): string + private function getBasePackage(Sitepackage $package): BasePackageDto + { + if (!($this->basePackages[$package->getBasePackage()] ?? null) instanceof BasePackageDto) { + $this->basePackages[$package->getBasePackage()] = + $this->basePackageService->getInstalledBasePackage($package->getBasePackage()); + } + + return $this->basePackages[$package->getBasePackage()]; + } + + private function getSourceDir(Sitepackage $package): string + { + $basePackage = $this->getBasePackage($package); + $version = $package->getTypo3Version(); + $versionDir = ''; + + foreach ($basePackage->typo3Versions as $v) { + if ($version < VersionUtility::versionToInt($v)) { + continue; + } + + $versionDir = $v; + break; + } + + if ($versionDir === '') { + throw new RuntimeException( + \sprintf('Template for version "%s" not found.', $version), + 1_658_939_427 + ); + } + + return $basePackage->getInstallPath() . '/templates/skeletons/' . $versionDir . '/'; + } + + private function getFileContent(string $file, string $sourceDir, Sitepackage $package): string { $content = file_get_contents($file); - $fileUniqueId = uniqid('file'); - $twig = new Environment(new ArrayLoader([$fileUniqueId => $content])); - $rendered = $twig->render( + $fileUniqueId = uniqid($this->createRelativeFilePath( + $file, + \dirname($this->getBasePackage($package)->getInstallPath(), 2) . '/' + )); + $twig = new Environment(new ArrayLoader([$fileUniqueId => $content]), [ + 'strict_variables' => true, + ]); + + return $twig->render( $fileUniqueId, [ 'package' => $package, - 'timestamp' => time() + 'timestamp' => time(), ] ); - - return $rendered; } - private function isTwigFile(string $file): bool + private function isTwigFile(string $extension): bool { - $pathinfo = pathinfo($file); - - return ($pathinfo['extension'] ?? '') === 'twig'; + return $extension === 'twig'; } protected function createRelativeFilePath(string $file, string $sourceDir): string diff --git a/src/Session/WizardSessionTrait.php b/src/Session/WizardSessionTrait.php new file mode 100644 index 00000000..048af692 --- /dev/null +++ b/src/Session/WizardSessionTrait.php @@ -0,0 +1,105 @@ +container->get('request_stack')) instanceof RequestStack) { + throw new RuntimeException('Invalid request stack.', 1_659_141_555); + } + + return $requestStack->getSession(); + } + + /** + * @throws UnexpectedValueException + */ + private function getSitepackageConfig(): SitepackageDto + { + $configuration = $this->getSession()->get('sitepackage_config'); + + if (!($configuration instanceof SitepackageDto)) { + $this->addFlash( + 'error', + 'Whoops, we could not find the package configuration. Please submit the configuration again.' + ); + + throw new UnexpectedValueException('Invalid or missing configuration.', 1_638_038_672); + } + + return $configuration; + } + + private function isAdvancedSitepackageConfig(): bool + { + return $this->getSession()->get('sitepackage_config_advanced') === true; + } + + private function setSitepackageConfig(SitepackageDto $configuration, bool $advanced): void + { + $this->getSession()->set('sitepackage_config', $configuration); + $this->getSession()->set('sitepackage_config_advanced', $advanced); + } + + /** + * @throws UnexpectedValueException + */ + private function getSitepackage(): Sitepackage + { + $sitepackage = $this->getSession()->get('sitepackage'); + + if (!($sitepackage instanceof Sitepackage)) { + $this->addFlash( + 'error', + 'Whoops, we could not find the Sitepackage. Please submit the configuration again.' + ); + + throw new UnexpectedValueException('Invalid or missing Sitepackage.', 1_638_038_673); + } + + return $sitepackage; + } + + private function setSitepackage(Sitepackage $sitepackage): void + { + $this->getSession()->set('sitepackage', $sitepackage); + } + + private function getSitepackageError(): string + { + return \is_string($error = $this->getSession()->get('sitepackage_error')) ? $error : ''; + } + + private function setSitepackageError(string $error): void + { + $this->getSession()->set('sitepackage_error', $error); + } +} diff --git a/src/Twig/Extension/VersionNumberExtension.php b/src/Twig/Extension/VersionNumberExtension.php index d991a9d9..7c2b1547 100644 --- a/src/Twig/Extension/VersionNumberExtension.php +++ b/src/Twig/Extension/VersionNumberExtension.php @@ -34,10 +34,10 @@ class VersionNumberExtension extends AbstractExtension /** * @return TwigFilter[] */ - public function getFilters() + public function getFilters(): array { return [ - new TwigFilter('version', [$this, 'versionFilter']), + new TwigFilter('version', $this->versionFilter(...)), ]; } @@ -47,16 +47,13 @@ public function versionFilter(int $version, int $positions = 3): string $parts = [ substr($versionString, 0, 3), substr($versionString, 3, 3), - substr($versionString, 6, 3) + substr($versionString, 6, 3), ]; - switch ($positions) { - case 1: - return (string)(int)$parts[0]; - case 2: - return (int)$parts[0] . '.' . (int)$parts[1]; - default: - return (int)$parts[0] . '.' . (int)$parts[1] . '.' . (int)$parts[2]; - } + return match ($positions) { + 1 => (string)(int)$parts[0], + 2 => (int)$parts[0] . '.' . (int)$parts[1], + default => (int)$parts[0] . '.' . (int)$parts[1] . '.' . (int)$parts[2], + }; } } diff --git a/src/Utility/StringUtility.php b/src/Utility/StringUtility.php index 69494a18..61a0a609 100644 --- a/src/Utility/StringUtility.php +++ b/src/Utility/StringUtility.php @@ -36,9 +36,8 @@ public static function clean(string $string): string $string = str_replace('&', '', $string); $string = self::convertUmlauts($string); $string = self::toASCII($string); - $string = trim($string); - return $string; + return trim($string); } public static function convertUmlauts(string $string): string @@ -61,26 +60,25 @@ public static function toASCII(string $string): string public static function stringToUpperCamelCase(string $string): string { $string = self::clean($string); - $string = is_string($result = preg_replace('/[^a-z0-9]+/i', ' ', $string)) ? $result : $string; - $string = is_string($result = preg_replace('/[A-Z]+/', ' $0', $string)) ? $result : $string; + $string = is_string($result = preg_replace('#[^a-z0-9]+#i', ' ', $string)) ? $result : $string; + $string = is_string($result = preg_replace('#[A-Z]+#', ' $0', $string)) ? $result : $string; $string = trim($string); $string = strtolower($string); $string = ucwords($string); - $string = str_replace(' ', '', $string); - return $string; + return str_replace(' ', '', $string); } public static function camelCaseToLowerCaseUnderscored(string $string): string { preg_match_all( - '!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!', + '#([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)#', self::clean($string), $matches ); $ret = $matches[0]; foreach ($ret as &$match) { - $match = $match == strtoupper($match) ? strtolower($match) : lcfirst($match); + $match = $match == strtoupper((string)$match) ? strtolower((string)$match) : lcfirst((string)$match); } return implode('_', $ret); @@ -89,13 +87,13 @@ public static function camelCaseToLowerCaseUnderscored(string $string): string public static function camelCaseToLowerCaseDashed(string $string): string { preg_match_all( - '!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!', + '#([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)#', self::clean($string), $matches ); $ret = $matches[0]; foreach ($ret as &$match) { - $match = $match == strtoupper($match) ? strtolower($match) : lcfirst($match); + $match = $match == strtoupper((string)$match) ? strtolower((string)$match) : lcfirst((string)$match); } return implode('-', $ret); diff --git a/src/Utility/VersionUtility.php b/src/Utility/VersionUtility.php index 8cee378a..f75d6a14 100644 --- a/src/Utility/VersionUtility.php +++ b/src/Utility/VersionUtility.php @@ -89,4 +89,17 @@ public static function normalize($version, int $digits = 3): ?string return $version; } + + public static function versionToInt(?string $version): int + { + if (($version = self::normalize($version, 3)) === null) { + return 0; + } + + $versionParts = explode('.', $version); + + return ((int)$versionParts[0] % 1000) * 1_000_000 + + ((int)$versionParts[1] % 1000) * 1000 + + ((int)$versionParts[2] % 1000); + } } diff --git a/templates/admin/my-custom-page.html.twig b/templates/admin/my-custom-page.html.twig new file mode 100644 index 00000000..1ab84567 --- /dev/null +++ b/templates/admin/my-custom-page.html.twig @@ -0,0 +1,10 @@ +{# templates/admin/my-custom-page.html.twig #} +{% extends '@EasyAdmin/page/content.html.twig' %} + +{% block content_title %}The Title of the Page{% endblock %} +{% block page_actions %} + Some Action +{% endblock %} + +{% block main %} +{% endblock %} diff --git a/templates/form/custom_theme.html.twig b/templates/form/custom_theme.html.twig new file mode 100644 index 00000000..c27429b4 --- /dev/null +++ b/templates/form/custom_theme.html.twig @@ -0,0 +1,10 @@ +{% extends "custom_theme.html.twig" %} + +{%- block base_package_widget -%} + {% if notification is not empty %} + + {% endif %} + {{- block('choice_widget') -}} +{%- endblock base_package_widget -%} diff --git a/templates/default/wizards/sitepackage/edit.html.twig b/templates/wizards/sitepackage/configure.html.twig similarity index 65% rename from templates/default/wizards/sitepackage/edit.html.twig rename to templates/wizards/sitepackage/configure.html.twig index 76fb0b12..94ab52ab 100644 --- a/templates/default/wizards/sitepackage/edit.html.twig +++ b/templates/wizards/sitepackage/configure.html.twig @@ -2,7 +2,7 @@ {% block title %}Create your own TYPO3 Sitepackage{% endblock %} {% block body %} - {% frame with { color: 'dark', height: 'small', center: true, title: 'Create your own Sitepackage', titleSize: 1, backgroundImage: asset("assets/Images/keyvisual.png") } %} + {% frame with { color: 'dark', center: true, title: 'Create your own Sitepackage', titleSize: 1, backgroundImage: asset("assets/Images/keyvisual.png") } %}

Awesome you made it here! Just a few more details about your project and your own Sitepackage is ready for download. @@ -13,6 +13,6 @@ {{ form(form, {'attr': {'novalidate': 'novalidate'}}) }} {% endframe %} - {% include 'default/wizards/sitepackage/partials/privacy-footer.html.twig' %} + {% include 'wizards/sitepackage/partials/privacy-footer.html.twig' %} {% endblock %} diff --git a/templates/wizards/sitepackage/error.html.twig b/templates/wizards/sitepackage/error.html.twig new file mode 100644 index 00000000..264239e3 --- /dev/null +++ b/templates/wizards/sitepackage/error.html.twig @@ -0,0 +1,23 @@ +{% extends 'layout.html.twig' %} +{% block title %}Error{% endblock %} +{% block body %} + + {% frame with { color: 'dark', center: true, title: 'Error', titleSize: 1, backgroundImage: asset("assets/Images/keyvisual.png") } %} +

+ Your sitepackage was not created, please check the error below. +

+ {% endframe %} + + {% frame with { id: 'error', indent: true, title: 'Error information' } %} +

{{ error }}

+

+ + {{ icon('actions-arrow-left-alt', 'auto') }} + Back + +

+ {% endframe %} + + {% include 'wizards/sitepackage/partials/privacy-footer.html.twig' %} + +{% endblock %} diff --git a/templates/default/wizards/sitepackage/index.html.twig b/templates/wizards/sitepackage/index.html.twig similarity index 91% rename from templates/default/wizards/sitepackage/index.html.twig rename to templates/wizards/sitepackage/index.html.twig index 47441996..9de8957a 100644 --- a/templates/default/wizards/sitepackage/index.html.twig +++ b/templates/wizards/sitepackage/index.html.twig @@ -2,14 +2,14 @@ {% block title %}Kickstart your TYPO3 template development{% endblock %} {% block body %} - {% frame with { color: 'dark', height: 'small', center: true, title: 'Sitepackage Builder', titleSize: 1, backgroundImage: asset("assets/Images/keyvisual.png") } %} + {% frame with { color: 'dark', center: true, title: 'Sitepackage Builder', titleSize: 1, backgroundImage: asset("assets/Images/keyvisual.png") } %}

Sitepackage-Builder is your kickstarter for modern TYPO3 Theme development. Learn more about TYPO3 templating or start your own template right now.

- {{ icon('actions-extension-add', 'auto') }} + {{ icon('actions-rocket', 'auto') }} Create Sitepackage

@@ -26,7 +26,7 @@ Learn more about the best practices recommended from the TYPO3 Core Team.

- + {{ icon('actions-notebook', 'auto') }} Learn about Sitepackages @@ -35,7 +35,7 @@ {% frame with { id: 'arguments', center: true, indent: true, title: 'Pros and Cons', titleSize: 3 } %}

- +
@@ -45,7 +45,7 @@ - + @@ -100,7 +100,7 @@ {% frame with { color: 'light', center: true, id: 'start', title: 'Start your own Sitepackage' } %}

- {{ icon('actions-extension-add', 'auto') }} + {{ icon('actions-rocket', 'auto') }} Create Sitepackage

diff --git a/templates/wizards/sitepackage/new.html.twig b/templates/wizards/sitepackage/new.html.twig new file mode 100644 index 00000000..5d9b672f --- /dev/null +++ b/templates/wizards/sitepackage/new.html.twig @@ -0,0 +1,50 @@ +{% extends 'layout.html.twig' %} +{% block title %}Create your own TYPO3 Sitepackage{% endblock %} +{% block body %} + + {% frame with { color: 'dark', center: true, title: 'Create your own Sitepackage', titleSize: 1, backgroundImage: asset("assets/Images/keyvisual.png") } %} +

+ Awesome you made it here! Just a few more details about your + project and your own Sitepackage is ready for download. +

+ {% endframe %} + + {% if basePackages|length > 0 %} + {% frame with { id: 'base-packages', center: true, title: 'Choose the base package' } %} + {% endframe %} + {% frame %} +
+ {% for basePackage in basePackages %} +
+
+
+

{{ basePackage.title }}

+

{{ basePackage.description }}

+ +
+ +
+
+ {% endfor %} +
+ {% endframe %} + {% endif %} + + {% include 'wizards/sitepackage/partials/privacy-footer.html.twig' %} + +{% endblock %} diff --git a/templates/default/wizards/sitepackage/partials/privacy-footer.html.twig b/templates/wizards/sitepackage/partials/privacy-footer.html.twig similarity index 100% rename from templates/default/wizards/sitepackage/partials/privacy-footer.html.twig rename to templates/wizards/sitepackage/partials/privacy-footer.html.twig diff --git a/templates/default/wizards/sitepackage/success.html.twig b/templates/wizards/sitepackage/success.html.twig similarity index 70% rename from templates/default/wizards/sitepackage/success.html.twig rename to templates/wizards/sitepackage/success.html.twig index c0e9f43b..ca56f584 100644 --- a/templates/default/wizards/sitepackage/success.html.twig +++ b/templates/wizards/sitepackage/success.html.twig @@ -2,25 +2,21 @@ {% block title %}Success{% endblock %} {% block body %} - {% frame with { color: 'dark', height: 'small', center: true, title: 'Congratulations!', titleSize: 1, backgroundImage: asset("assets/Images/keyvisual.png") } %} + {% frame with { color: 'dark', center: true, title: 'Congratulations!', titleSize: 1, backgroundImage: asset("assets/Images/keyvisual.png") } %}

- Your Sitepackage has been successfully created. You can now check the + Your Sitepackage has been successfully prepared. You can now check the configuration or download the prepared Sitepackage.

-

- - {{ icon('actions-package', 'auto') }} - Download - -

{% endframe %} {% frame with { id: 'configuration', indent: true, title: 'Your Sitepackage Configuration' } %}
+
Base Package
+
{{ base_package.title }} ({{ base_package.packageName }})
+
Source
+
{% if base_package.official %}TYPO3 official base package{% elseif base_package.thirdParty %}Unknown third party{% else %}Verified third party{% endif %}
TYPO3 Version
{{ sitepackage.typo3Version|version(2) }}
-
Base Package
-
{{ sitepackage.basePackage }}

Sitepackage Extension

@@ -39,14 +35,10 @@

PHP

-
Composer Name
-
{{ sitepackage.composerVendorName }}/{{ sitepackage.composerProjectName }}
+
{{ sitepackage.composerName }}
PSR-4 Namespace
-
{{ sitepackage.vendorName }}\{{ sitepackage.packageName }}
+
{{ sitepackage.psr4Namespace }}

Author

@@ -61,13 +53,17 @@

- {{ icon('actions-arrow-left-alt', 'auto') }} + {{ icon('actions-undo', 'auto') }} Restart - + {{ icon('actions-open', 'auto') }} Edit Configuration + + {{ icon('actions-download', 'auto') }} + Download +

{% endframe %} @@ -77,12 +73,12 @@

- {{ icon('actions-package', 'auto') }} + {{ icon('actions-download', 'auto') }} Download

{% endframe %} - {% include 'default/wizards/sitepackage/partials/privacy-footer.html.twig' %} + {% include 'wizards/sitepackage/partials/privacy-footer.html.twig' %} {% endblock %} diff --git a/tools/rector/composer.json b/tools/rector/composer.json index 55d4aed9..52cc4bfd 100644 --- a/tools/rector/composer.json +++ b/tools/rector/composer.json @@ -1,5 +1,6 @@ { "require": { - "rector/rector": "^0.13.10" + "rector/rector": "^0.13.10", + "symfony/property-access": "*" } }
Config files not accessible by editors Config files not accessible by editors Yes No

>9c0{Kh^#=7FA_MQAOX9q&TxCYuVsvlf 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 literal 0 HcmV?d00001 diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/.editorconfig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/.editorconfig new file mode 100644 index 00000000..ff05afd1 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/.editorconfig @@ -0,0 +1,70 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +# CSS-Files +[*.css] +indent_style = space +indent_size = 4 + +# HTML-Files +[*.html] +indent_style = space +indent_size = 4 + +# TMPL-Files +[*.tmpl] +indent_style = space +indent_size = 4 + +# JS-Files +[*.js] +indent_style = space +indent_size = 4 + +# PHP-Files +[*.php] +indent_style = space +indent_size = 4 + +# MD-Files +[*.md] +indent_style = space +indent_size = 4 + +# ReST-Files +[*.rst] +indent_style = space +indent_size = 3 + +# TypoScript +[*.typoscript] +indent_style = space +indent_size = 4 + +# YML-Files +[{*.yml,*.yaml}] +indent_style = space +indent_size = 2 + +# package.json +[package.json] +indent_style = space +indent_size = 2 + +# composer.json +[composer.json] +indent_style = space +indent_size = 4 + +# phpstan +[*.neon] +indent_style = tab diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Build/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Build/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Build/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Build/Gruntfile.js.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Build/Gruntfile.js.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Build/Gruntfile.js.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Build/Gruntfile.js.twig diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Build/package.json.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Build/package.json.twig similarity index 89% rename from resources/skeletons/BaseExtension/fluid_styled_content/Build/package.json.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Build/package.json.twig index a870947b..01d38717 100644 --- a/resources/skeletons/BaseExtension/fluid_styled_content/Build/package.json.twig +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Build/package.json.twig @@ -1,5 +1,5 @@ { - "name": "{{ package.vendorNameAlternative }}-{{ package.packageNameAlternative }}", + "name": "{{ package.composerVendorName }}-{{ package.composerProjectName }}", "description": "{{ package.description }}", "repository": { "type": "git", diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/Controller/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/Controller/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/Domain/Model/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/Domain/Model/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/Domain/Repository/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/Domain/Repository/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/ViewHelpers/.gitignore b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Classes/ViewHelpers/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Configuration/RTE/Default.yaml.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/RTE/Default.yaml.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Configuration/RTE/Default.yaml.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/RTE/Default.yaml.twig diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TCA/Overrides/pages.php.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TCA/Overrides/pages.php.twig new file mode 100644 index 00000000..beb3dd60 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TCA/Overrides/pages.php.twig @@ -0,0 +1,19 @@ + + + + diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig new file mode 100644 index 00000000..8213cfae --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig.twig @@ -0,0 +1,4 @@ +# +# BACKENDLAYOUTS +# + diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig.twig diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/RTE.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/RTE.tsconfig.twig new file mode 100644 index 00000000..38353247 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/RTE.tsconfig.twig @@ -0,0 +1,8 @@ +############# +#### RTE #### +############# +RTE { + default { + preset = {{ package.extensionKey }} + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig new file mode 100644 index 00000000..55f97ce7 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/TCEFORM.tsconfig.twig @@ -0,0 +1,11 @@ +# +# TCEFORM +# +TCEFORM { + pages { + + } + tt_content { + + } +} diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig new file mode 100644 index 00000000..9d4a5e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TsConfig/Page/TCEMAIN.tsconfig.twig @@ -0,0 +1,6 @@ +# +# TCEMAIN +# +TCEMAIN { + +} diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig similarity index 100% rename from resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TypoScript/Helper/DynamicContent.typoscript.twig diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TypoScript/constants.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TypoScript/constants.typoscript.twig similarity index 93% rename from resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TypoScript/constants.typoscript.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TypoScript/constants.typoscript.twig index 5a38ef29..1a79054a 100644 --- a/resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TypoScript/constants.typoscript.twig +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TypoScript/constants.typoscript.twig @@ -1,7 +1,7 @@ ###################### #### DEPENDENCIES #### ###################### - + ############################## diff --git a/resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TypoScript/setup.typoscript.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TypoScript/setup.typoscript.twig similarity index 98% rename from resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TypoScript/setup.typoscript.twig rename to packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TypoScript/setup.typoscript.twig index 1ed237f7..1f765576 100644 --- a/resources/skeletons/BaseExtension/fluid_styled_content/Configuration/TypoScript/setup.typoscript.twig +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Configuration/TypoScript/setup.typoscript.twig @@ -1,7 +1,7 @@ ###################### #### DEPENDENCIES #### ###################### - + ################ diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/README.md.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/README.md.twig new file mode 100644 index 00000000..8b095c79 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/README.md.twig @@ -0,0 +1,4 @@ +Sitepackage for the project "{{ package.title }}" +============================================================== + +Add some explanation here. diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/.htaccess b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/.htaccess new file mode 100644 index 00000000..93169e4e --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Language/locallang.xlf.twig b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Language/locallang.xlf.twig new file mode 100644 index 00000000..5aea2770 --- /dev/null +++ b/packages/base-package-fluid-styled-content/templates/skeletons/10.4/Resources/Private/Language/locallang.xlf.twig @@ -0,0 +1,11 @@ + + + +