diff --git a/.editorconfig b/.editorconfig
index 697b059e..71d881f8 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -8,12 +8,12 @@ root = true
charset = utf-8
end_of_line = lf
insert_final_newline = true
-trim_trailing-whitespace = true
+trim_trailing_whitespace = true
indent_style = space
indent_size = 4
# Exceptions
-[{*.{yaml,yml,sh,jscsrc,scss},package.json,.*rc}]
+[{*.{yaml,yml,sh,jscsrc,scss,pcss},package.json,.*rc}]
indent_size = 2
[*.{json,scss}]
@@ -23,7 +23,7 @@ max_line_length = 1000
indent_size = 1
[*.{note,md,edit,read}]
-trim_trailing-whitespace = false
+trim_trailing_whitespace = false
[Makefile]
indent_style = tab
diff --git a/.eslintrc b/.eslintrc
index aab92bc0..b16c3905 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,20 +1,12 @@
{
- "extends": [
- "prettier"
- ],
- "plugins": [
- "prettier"
- ],
+ "extends": ["eslint:recommended", "plugin:prettier/recommended"],
"parserOptions": {
- "sourceType": "module",
- "ecmaFeatures": {
- "jsx": true
- }
+ "ecmaVersion": 2020,
+ "sourceType": "module"
},
"env": {
- "es6": true
- },
- "rules": {
- "prettier/prettier": "error"
+ "es6": true,
+ "browser": true,
+ "node": true
}
}
diff --git a/.jshintrc b/.jshintrc
deleted file mode 100644
index b155a358..00000000
--- a/.jshintrc
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "passfail": false,
- "undef": true,
- "unused": true,
- "asi": true,
- "browser": true,
- "predef": ["$", "Carbon", "console", "jQuery", "require"],
- "esversion": 6,
- "eqeqeq": false,
- "eqnull": false,
- "loopfunc": false,
- "smarttabs": false,
- "-W041": false
-}
diff --git a/.nvmrc b/.nvmrc
index 8351c193..b6a7d89c 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-14
+16
diff --git a/.postcssrc.js b/.postcssrc.js
new file mode 100644
index 00000000..353f0b9a
--- /dev/null
+++ b/.postcssrc.js
@@ -0,0 +1,18 @@
+module.exports = (ctx) => ({
+ map: ctx.options.map,
+ plugins: {
+ 'postcss-easy-import': {
+ extensions: ['.pcss', '.css'],
+ },
+ 'tailwindcss/nesting': true,
+ tailwindcss: true,
+ 'postcss-sort-media-queries': true,
+ autoprefixer: true,
+ cssnano: {
+ preset: ['default', { discardComments: { removeAll: true } }],
+ },
+ 'postcss-reporter': {
+ clearReportedMessages: true,
+ },
+ },
+});
diff --git a/.prettierignore b/.prettierignore
index f24e79f1..860586ea 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,2 +1,3 @@
composer.json
*.noLinter.*
+**/Public/**/*
diff --git a/.stylelintrc b/.stylelintrc
index 9a14f916..f634db26 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -1,5 +1,5 @@
{
- "extends": "stylelint-config-recommended-scss",
+ "extends": "stylelint-config-standard",
"ignoreFiles": [
"**/Public/**",
"**/Private/Templates/**",
@@ -7,33 +7,30 @@
"**/*.noLinter.*"
],
"rules": {
- "property-no-unknown": [
- true,
+ "selector-class-pattern": "[a-z-]+",
+ "value-keyword-case": [
+ "lower",
{
- "ignoreProperties": [
- "font-range",
- "min-font-size",
- "max-font-size",
- "lower-font-range",
- "upper-font-range",
- "font-awesome",
- "tap-highlight-color",
- "touch-callout"
- ]
+ "camelCaseSvgKeywords": true
}
],
- "selector-pseudo-class-no-unknown": [
+ "function-no-unknown": [
true,
{
- "ignorePseudoClasses": ["at-least", "at-most", "between", "exactly"]
+ "ignoreFunctions": [
+ "theme"
+ ]
}
],
- "selector-pseudo-element-no-unknown": [
+ "at-rule-no-unknown": [
true,
{
- "ignorePseudoElements": ["track", "thumb"]
+ "ignoreAtRules": [
+ "tailwind",
+ "apply",
+ "layer"
+ ]
}
- ],
- "selector-type-no-unknown": null
+ ]
}
}
diff --git a/.yarnclean b/.yarnclean
index 9da727b3..283ffb89 100644
--- a/.yarnclean
+++ b/.yarnclean
@@ -11,7 +11,6 @@ powered-test
# asset directories
docs
-doc
website
*/**/assets
diff --git a/Classes/Form/Runtime/Action/CreateUserAction.php b/Classes/Form/Runtime/Action/CreateUserAction.php
index 02152471..bd5f6d67 100644
--- a/Classes/Form/Runtime/Action/CreateUserAction.php
+++ b/Classes/Form/Runtime/Action/CreateUserAction.php
@@ -16,6 +16,7 @@
use Neos\Flow\Annotations as Flow;
use Neos\Flow\Mvc\ActionResponse;
use Neos\Flow\Persistence\Doctrine\PersistenceManager;
+use Neos\Flow\Persistence\Exception\IllegalObjectTypeException;
use Neos\Fusion\Form\Runtime\Domain\Exception\ActionException;
use Neos\Flow\Security\AccountFactory;
use Neos\Flow\Security\AccountRepository;
@@ -28,56 +29,36 @@
class CreateUserAction extends AbstractAction
{
- /**
- * @Flow\Inject
- * @var AccountRepository
- */
- protected $accountRepository;
+ #[Flow\Inject]
+ protected ?AccountRepository $accountRepository;
- /**
- * @Flow\Inject
- * @var PartyRepository
- */
- protected $partyRepository;
+ #[Flow\Inject]
+ protected ?PartyRepository $partyRepository;
- /**
- * @Flow\Inject
- * @var PartyService
- */
- protected $partyService;
+ #[Flow\Inject]
+ protected ?PartyService $partyService;
- /**
- * @Flow\Inject
- * @var AccountFactory
- */
- protected $accountFactory;
+ #[Flow\Inject]
+ protected ?AccountFactory $accountFactory;
- /**
- * @Flow\Inject
- * @var PersistenceManager
- */
- protected $persistenceManager;
+ #[Flow\Inject]
+ protected ?PersistenceManager $persistenceManager;
/**
- * @return ActionResponse|null
- * @throws ActionException
+ * @throws ActionException|IllegalObjectTypeException
*/
public function perform(): ?ActionResponse
{
$accountIdentifier = $this->options['username'];
$password = $this->options['password'];
- $firstName = $this->options['firstName'];
- $lastName = $this->options['lastName'];
$existingAccount = $this->accountRepository->findActiveByAccountIdentifierAndAuthenticationProviderName($accountIdentifier, 'Neos.Neos:Backend');
if ($existingAccount !== null) {
throw new ActionException('Account already exists');
}
- if ($firstName === '' && $lastName === '') {
- $firstName = 'Santa';
- $lastName = 'Claus';
- }
+ $firstName = ucfirst($accountIdentifier);
+ $lastName = 'Demo';
$user = new User();
$user->setName(new PersonName('', $firstName, '', $lastName));
diff --git a/Classes/Form/Runtime/Validation/Validator/UsernameInUseValidator.php b/Classes/Form/Runtime/Validation/Validator/UsernameInUseValidator.php
new file mode 100644
index 00000000..34d63ad6
--- /dev/null
+++ b/Classes/Form/Runtime/Validation/Validator/UsernameInUseValidator.php
@@ -0,0 +1,37 @@
+accountRepository->findActiveByAccountIdentifierAndAuthenticationProviderName($value, 'Neos.Neos:Backend');
+
+ if ($existingAccount) {
+ $this->addError('The given username is already in use', 1659612430);
+ }
+ }
+}
diff --git a/Configuration/Development/Settings.yaml b/Configuration/Development/Settings.yaml
new file mode 100644
index 00000000..4aec3ae5
--- /dev/null
+++ b/Configuration/Development/Settings.yaml
@@ -0,0 +1,3 @@
+Neos:
+ Demo:
+ debugMode: true
diff --git a/Configuration/Settings.CR.yaml b/Configuration/Settings.CR.yaml
new file mode 100644
index 00000000..8a7fd836
--- /dev/null
+++ b/Configuration/Settings.CR.yaml
@@ -0,0 +1,27 @@
+Neos:
+ ContentRepository:
+ contentDimensions:
+ language:
+ label: 'Neos.Demo:Main:contentDimensions.language'
+ icon: language
+ default: en_US
+ defaultPreset: en_US
+ presets:
+ en_US:
+ label: 'English (US)'
+ values:
+ - en_US
+ # The default preset can also have an empty uriSegment value.
+ # https://docs.neos.io/cms/manual/content-repository/content-dimensions#behind-the-scenes-routing
+ uriSegment: en
+ en_UK:
+ label: 'English (UK)'
+ values:
+ - en_UK
+ - en_US
+ uriSegment: uk
+ de:
+ label: Deutsch
+ values:
+ - de
+ uriSegment: de
diff --git a/Configuration/Settings.EditPreviewModes.yaml b/Configuration/Settings.EditPreviewModes.yaml
new file mode 100644
index 00000000..7da37e43
--- /dev/null
+++ b/Configuration/Settings.EditPreviewModes.yaml
@@ -0,0 +1,31 @@
+Neos:
+ Neos:
+ userInterface:
+ editPreviewModes:
+ tabletLandscape:
+ isEditingMode: false
+ isPreviewMode: true
+ fusionRenderingPath: ''
+ title: 'Neos.Demo:Main:editPreviewModes.tabletLandscape'
+ width: 1024
+ height: 768
+ backgroundColor: '#222'
+ position: 200
+ tabletPortrait:
+ isEditingMode: false
+ isPreviewMode: true
+ fusionRenderingPath: ''
+ title: 'Neos.Demo:Main:editPreviewModes.tabletPortrait'
+ width: 768
+ height: 1024
+ backgroundColor: '#222'
+ position: 210
+ mobile:
+ isEditingMode: false
+ isPreviewMode: true
+ fusionRenderingPath: ''
+ title: 'Neos.Demo:Main:editPreviewModes.mobile'
+ width: 375
+ height: 667
+ backgroundColor: '#222'
+ position: 220
diff --git a/Configuration/Settings.Flow.yaml b/Configuration/Settings.Flow.yaml
new file mode 100644
index 00000000..748b27a3
--- /dev/null
+++ b/Configuration/Settings.Flow.yaml
@@ -0,0 +1,7 @@
+Neos:
+ Flow:
+ mvc:
+ routes:
+ 'Neos.Neos':
+ variables:
+ defaultUriSuffix: ''
diff --git a/Configuration/Settings.Monocle.yaml b/Configuration/Settings.Monocle.yaml
new file mode 100644
index 00000000..7cec6d78
--- /dev/null
+++ b/Configuration/Settings.Monocle.yaml
@@ -0,0 +1,47 @@
+# This is used for the living styleguide (Monocle)
+# Read more about this in the README.md
+Sitegeist:
+ Monocle:
+ ui:
+ structure:
+ presentation:
+ position: 20
+ match: Presentation\.
+ label: Presentation
+ icon: certificate
+ color: '#D1E751'
+ layout:
+ position: 10
+ match: Layout\.
+ label: Layout
+ icon: file
+ color: '#FFFFFF'
+ viewportPresets:
+ xs:
+ label: xs
+ width: 400
+ height: 600
+ sm:
+ label: sm
+ width: 640
+ height: 800
+ md:
+ label: md
+ width: 768
+ height: 400
+ lg:
+ label: lg
+ width: 1024
+ height: 800
+ xl:
+ label: xl
+ width: 1280
+ height: 1024
+ xxl:
+ label: xxl
+ width: 1520
+ height: 1280
+ xxxl:
+ label: xxxl
+ width: 1740
+ height: 1520
diff --git a/Configuration/Settings.Neos.yaml b/Configuration/Settings.Neos.yaml
new file mode 100644
index 00000000..f608bc65
--- /dev/null
+++ b/Configuration/Settings.Neos.yaml
@@ -0,0 +1,33 @@
+Neos:
+ Demo:
+ debugMode: false
+ Neos:
+ userInterface:
+ translation:
+ autoInclude:
+ Neos.Demo:
+ - Main
+ - 'NodeTypes/*'
+
+ navigateComponent:
+ nodeTree:
+ loadingDepth: 2
+ structureTree:
+ loadingDepth: 3
+
+ nodeTypes:
+ groups:
+ special:
+ position: end 100
+ label: 'Neos.Demo:Main:nodeTypes.groups.special'
+ collapsed: false
+ forms:
+ position: end 200
+ label: 'Neos.Demo:Main:nodeTypes.groups.forms'
+ collapsed: false
+
+ Ui:
+ resources:
+ javascript:
+ 'Neos.Demo:CodeTag':
+ resource: resource://Neos.Demo/Public/Scripts/CodeTagPlugin/Plugin.js
diff --git a/Configuration/Settings.NodePresets.yaml b/Configuration/Settings.NodePresets.yaml
new file mode 100644
index 00000000..ef986c58
--- /dev/null
+++ b/Configuration/Settings.NodePresets.yaml
@@ -0,0 +1,244 @@
+Neos:
+ Neos:
+ nodeTypes:
+ presets:
+ properties:
+ neosdemo:
+ text:
+ inlineEditable:
+ type: string
+ ui:
+ inlineEditable: true
+ headline:
+ type: string
+ search:
+ fulltextExtractor: "${Indexing.extractInto('h2', value)}"
+ ui:
+ inlineEditable: true
+ inline:
+ editorOptions:
+ placeholder: 'Neos.Demo:NodeTypes.Placeholder:headline'
+ autoparagraph: false
+ hyphens: true
+ formatting:
+ strong: false
+ em: false
+ underline: false
+ sub: true
+ sup: true
+ p: false
+ h1: false
+ h2: false
+ h3: false
+ h4: false
+ h5: false
+ table: false
+ a: true
+ ul: false
+ ol: false
+ left: false
+ right: false
+ center: false
+ justify: false
+ removeFormat: true
+ code: true
+ subheadline:
+ type: string
+ search:
+ fulltextExtractor: "${Indexing.extractInto('h3', value)}"
+ ui:
+ inlineEditable: true
+ inline:
+ editorOptions:
+ placeholder: 'Neos.Demo:NodeTypes.Placeholder:subheadline'
+ autoparagraph: false
+ hyphens: true
+ formatting:
+ strong: false
+ em: false
+ underline: false
+ sub: true
+ sup: true
+ p: false
+ h1: false
+ h2: false
+ h3: false
+ h4: false
+ h5: false
+ table: false
+ a: true
+ ul: false
+ ol: false
+ left: false
+ right: false
+ center: false
+ justify: false
+ removeFormat: true
+ code: true
+ lead:
+ type: string
+ search:
+ fulltextExtractor: '${Indexing.extractHtmlTags(value)}'
+ ui:
+ inlineEditable: true
+ inline:
+ editorOptions:
+ placeholder: 'Neos.Demo:NodeTypes.Placeholder:lead'
+ autoparagraph: false
+ hyphens: true
+ formatting:
+ strong: true
+ em: true
+ underline: false
+ sub: true
+ sup: true
+ p: false
+ h1: false
+ h2: false
+ h3: false
+ h4: false
+ h5: false
+ table: false
+ a: true
+ ul: false
+ ol: false
+ left: false
+ right: false
+ center: false
+ justify: false
+ removeFormat: true
+ code: true
+ pure:
+ type: string
+ search:
+ fulltextExtractor: '${Indexing.extractHtmlTags(value)}'
+ ui:
+ inlineEditable: true
+ inline:
+ editorOptions:
+ placeholder: 'Neos.Demo:NodeTypes.Placeholder:pure'
+ autoparagraph: false
+ hyphens: true
+ formatting:
+ strong: true
+ em: true
+ underline: false
+ sub: true
+ sup: true
+ p: false
+ h1: false
+ h2: false
+ h3: false
+ h4: false
+ h5: false
+ table: false
+ a: true
+ ul: false
+ ol: false
+ left: false
+ right: false
+ center: false
+ justify: false
+ removeFormat: true
+ code: true
+ label:
+ type: string
+ search:
+ fulltextExtractor: '${Indexing.extractHtmlTags(value)}'
+ ui:
+ inlineEditable: true
+ inline:
+ editorOptions:
+ placeholder: 'Neos.Demo:NodeTypes.Placeholder:label'
+ autoparagraph: false
+ hyphens: true
+ formatting:
+ strong: false
+ em: false
+ underline: false
+ sub: false
+ sup: false
+ p: false
+ h1: false
+ h2: false
+ h3: false
+ h4: false
+ h5: false
+ table: false
+ a: false
+ ul: false
+ ol: false
+ left: false
+ right: false
+ center: false
+ justify: false
+ removeFormat: true
+ code: true
+ link:
+ type: string
+ search:
+ fulltextExtractor: '${Indexing.extractHtmlTags(value)}'
+ ui:
+ inlineEditable: true
+ inline:
+ editorOptions:
+ placeholder: 'Neos.Demo:NodeTypes.Placeholder:link'
+ autoparagraph: false
+ hyphens: true
+ formatting:
+ strong: true
+ em: true
+ underline: false
+ sub: true
+ sup: true
+ p: false
+ h1: false
+ h2: false
+ h3: false
+ h4: false
+ h5: false
+ table: false
+ a: false
+ ul: false
+ ol: false
+ left: false
+ right: false
+ center: false
+ justify: false
+ removeFormat: true
+ code: true
+ autoparagraph:
+ type: string
+ search:
+ fulltextExtractor: '${Indexing.extractHtmlTags(value)}'
+ ui:
+ inlineEditable: true
+ inline:
+ editorOptions:
+ placeholder: 'Neos.Demo:NodeTypes.Placeholder:text'
+ autoparagraph: true
+ hyphens: true
+ formatting:
+ splitAdd: true
+ strong: true
+ em: true
+ underline: false
+ sub: true
+ sup: true
+ p: true
+ h1: false
+ h2: true
+ h3: true
+ h4: true
+ h5: false
+ pre: false
+ table: true
+ a: true
+ ul: true
+ ol: true
+ left: false
+ right: false
+ center: false
+ justify: false
+ removeFormat: true
+ code: true
diff --git a/Configuration/Settings.yaml b/Configuration/Settings.yaml
deleted file mode 100644
index 4229afe1..00000000
--- a/Configuration/Settings.yaml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-Neos:
- Neos:
- userInterface:
- editPreviewModes:
- print:
- isEditingMode: false
- isPreviewMode: true
- fusionRenderingPath: print
- title: 'Neos.Demo:Main:editPreviewModes.print'
- position: 200
- translation:
- autoInclude:
- Neos.Demo:
- - Main
- - 'NodeTypes/*'
- ContentRepository:
- contentDimensions:
- language:
- label: 'Neos.Demo:Main:contentDimensions.language'
- icon: icon-language
- default: en_US
- defaultPreset: en_US
- presets:
- en_US:
- label: 'English (US)'
- values:
- - en_US
- uriSegment: en
- en_UK:
- label: 'English (UK)'
- values:
- - en_UK
- - en_US
- uriSegment: uk
- de:
- label: German
- values:
- - de
- uriSegment: de
- fr:
- label: French
- values:
- - fr
- uriSegment: fr
- nl:
- label: Dutch
- values:
- - nl
- - de
- uriSegment: nl
- da:
- label: Danish
- values:
- - da
- uriSegment: da
- lv:
- label: Latvian
- values:
- - lv
- uriSegment: lv
diff --git a/NodeTypes/Collection/Content/Carousel.yaml b/NodeTypes/Collection/Content/Carousel.yaml
deleted file mode 100644
index 44ddb9b9..00000000
--- a/NodeTypes/Collection/Content/Carousel.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-##
-# A collection of contents that can be placed in a carousel
-#
-'Neos.Demo:Collection.Content.Carousel':
- superTypes:
- Neos.Neos:ContentCollection: true
- constraints:
- nodeTypes:
- '*': false
- 'Neos.Demo:Constraint.Content.Carousel': true
diff --git a/NodeTypes/Collection/Content/Footer.yaml b/NodeTypes/Collection/Content/Footer.yaml
index 937a0eaa..d12b6b2e 100644
--- a/NodeTypes/Collection/Content/Footer.yaml
+++ b/NodeTypes/Collection/Content/Footer.yaml
@@ -7,6 +7,4 @@
constraints:
nodeTypes:
'*': false
- 'Neos.Demo:Content.Headline': true
- 'Neos.Demo:Content.Text': true
- 'Neos.Demo:Content.Image': true
+ 'Neos.Demo:Constraint.Content.Footer': true
diff --git a/NodeTypes/Collection/Content/Main.yaml b/NodeTypes/Collection/Content/Main.yaml
index 46185d15..cf356f86 100644
--- a/NodeTypes/Collection/Content/Main.yaml
+++ b/NodeTypes/Collection/Content/Main.yaml
@@ -4,16 +4,9 @@
'Neos.Demo:Collection.Content.Main':
superTypes:
Neos.Neos:ContentCollection: true
+ # TODO Add translation for label
+ label: "${'Main content area'}"
constraints:
nodeTypes:
- # Nodetypes of Neos.NodeTypes package are deprecated
- # if the package is installed we prevent adding those contents
- 'Neos.NodeTypes:Headline': false
- 'Neos.NodeTypes:Text': false
- 'Neos.NodeTypes:Image': false
- 'Neos.NodeTypes:TextWithImage': false
- # Nodetypes of Neos.NodeTypes.Columnlayouts are not used in
- # Neos.Demo and thus are disabled if they are present
- 'Neos.NodeTypes.ColumnLayouts:TwoColumn': false
- 'Neos.NodeTypes.ColumnLayouts:ThreeColumn': false
- 'Neos.NodeTypes.ColumnLayouts:FourColumn': false
+ '*': false
+ 'Neos.Demo:Constraint.Content.Main': true
diff --git a/NodeTypes/Collection/Content/Teaser.yaml b/NodeTypes/Collection/Content/Teaser.yaml
index 42442d72..c63f677e 100644
--- a/NodeTypes/Collection/Content/Teaser.yaml
+++ b/NodeTypes/Collection/Content/Teaser.yaml
@@ -4,9 +4,8 @@
'Neos.Demo:Collection.Content.Teaser':
superTypes:
Neos.Neos:ContentCollection: true
+ label: "${'Teaser area'}"
constraints:
nodeTypes:
'*': false
- 'Neos.Demo:Content.Headline': true
- 'Neos.Demo:Content.Text': true
- 'Neos.Demo:Content.Image': true
+ 'Neos.Demo:Constraint.Content.Teaser': true
diff --git a/NodeTypes/Constraint/Content/Carousel.yaml b/NodeTypes/Constraint/Content/Carousel.yaml
index ffd3399a..b94a69b4 100644
--- a/NodeTypes/Constraint/Content/Carousel.yaml
+++ b/NodeTypes/Constraint/Content/Carousel.yaml
@@ -1,8 +1,5 @@
##
# Constraint-supertype that makes contents available in carousels
#
-# this allows to define the usage on the content nodetypes and
-# is recommended if a collection contains many different types
-#
'Neos.Demo:Constraint.Content.Carousel':
abstract: true
diff --git a/NodeTypes/Constraint/Content/Column.yaml b/NodeTypes/Constraint/Content/Column.yaml
index 2698a74d..a084318c 100644
--- a/NodeTypes/Constraint/Content/Column.yaml
+++ b/NodeTypes/Constraint/Content/Column.yaml
@@ -1,8 +1,5 @@
##
# Constraint-supertype that makes contents available in columns
#
-# this allows to define the usage on the content nodetypes and
-# is recommended if a collection contains many different types
-#
'Neos.Demo:Constraint.Content.Column':
abstract: true
diff --git a/NodeTypes/Constraint/Content/Footer.yaml b/NodeTypes/Constraint/Content/Footer.yaml
new file mode 100644
index 00000000..87b4ea5e
--- /dev/null
+++ b/NodeTypes/Constraint/Content/Footer.yaml
@@ -0,0 +1,5 @@
+##
+# Constraint-supertype that makes contents available in the footer area
+#
+'Neos.Demo:Constraint.Content.Footer':
+ abstract: true
diff --git a/NodeTypes/Constraint/Content/Main.yaml b/NodeTypes/Constraint/Content/Main.yaml
new file mode 100644
index 00000000..3526121f
--- /dev/null
+++ b/NodeTypes/Constraint/Content/Main.yaml
@@ -0,0 +1,5 @@
+##
+# Constraint-supertype that makes contents available in the main content area of the page
+#
+'Neos.Demo:Constraint.Content.Main':
+ abstract: true
diff --git a/NodeTypes/Constraint/Content/Teaser.yaml b/NodeTypes/Constraint/Content/Teaser.yaml
new file mode 100644
index 00000000..23d40cd5
--- /dev/null
+++ b/NodeTypes/Constraint/Content/Teaser.yaml
@@ -0,0 +1,5 @@
+##
+# Constraint-supertype that makes contents available in the teaser element
+#
+'Neos.Demo:Constraint.Content.Teaser':
+ abstract: true
diff --git a/NodeTypes/Constraint/Document/SubPage.yaml b/NodeTypes/Constraint/Document/SubPage.yaml
new file mode 100644
index 00000000..bf4b70ba
--- /dev/null
+++ b/NodeTypes/Constraint/Document/SubPage.yaml
@@ -0,0 +1,6 @@
+##
+# Every document node type that should be allowed to be added to the site tree should inherit from this nodetype.
+##
+
+'Neos.Demo:Constraint.Document.SubPage':
+ abstract: true
diff --git a/NodeTypes/Content/BlogPostingList/BlogPostingList.fusion b/NodeTypes/Content/BlogPostingList/BlogPostingList.fusion
new file mode 100644
index 00000000..59b2c08f
--- /dev/null
+++ b/NodeTypes/Content/BlogPostingList/BlogPostingList.fusion
@@ -0,0 +1,44 @@
+##
+# "BlogPostingList" element
+#
+prototype(Neos.Demo:Content.BlogPostingList) < prototype(Neos.Neos:ContentComponent) {
+
+ blogArticles.@if.has = ${q(node).property('blogs')}
+ blogArticles = ${q(q(node).property('blogs')).children('[instanceof Neos.Demo:Document.BlogPosting]')}
+ blogArticles.@process.sortBy = ${value.sort("datePublished", "DESC")}
+ blogArticles.@process.limit = ${value.slice(0, q(node).property('limit'))}
+
+ renderer = Neos.Demo:Presentation.Cards.Container {
+ content = Neos.Fusion:Loop {
+ items = ${props.blogArticles}
+ itemName = "blogPosting"
+ itemRenderer = Neos.Demo:Presentation.Cards.Card {
+ imageUri = Neos.Neos:ImageUri {
+ asset = ${q(blogPosting).property('image')}
+ maximumWidth = 400
+ maximumHeight = 225
+ }
+ title = ${q(blogPosting).property('title')}
+ content = ${q(blogPosting).property('abstract')}
+ uri = Neos.Neos:NodeUri {
+ node = ${blogPosting}
+ }
+ }
+ }
+ }
+
+ @cache {
+ mode = "cached"
+ entryIdentifier {
+ node = ${node}
+ }
+ entryTags {
+ # invalidate cache when the node rendered changes
+ 1 = ${Neos.Caching.nodeTag(node)}
+ # invalidate cache when one of the selected blogs changes (might become hidden)
+ 2 = ${Neos.Caching.nodeTag(q(node).property('blogs'))}
+ # invalidate cache when a descendent of the selected blogs changes
+ 3 = ${Neos.Caching.descendantOfTag(q(node).property('blogs'))}
+ }
+ }
+}
diff --git a/NodeTypes/Content/BlogPostingList/BlogPostingList.yaml b/NodeTypes/Content/BlogPostingList/BlogPostingList.yaml
new file mode 100644
index 00000000..d79dba6f
--- /dev/null
+++ b/NodeTypes/Content/BlogPostingList/BlogPostingList.yaml
@@ -0,0 +1,45 @@
+##
+# A "BlogPostingList" content element that renders "Image" child nodes into a JavaScript based slideshow
+#
+'Neos.Demo:Content.BlogPostingList':
+ superTypes:
+ 'Neos.Neos:Content': true
+ 'Neos.Demo:Constraint.Content.Main': true
+ label: "${Neos.Node.labelForNode(node).override(' ' + I18n.translate('contentcollection.label', '', [q(node).children().count()], 'NodeTypes/Content/Carousel', 'Neos.Demo', q(node).children().count()))}"
+ ui:
+ label: i18n
+ icon: 'newspaper'
+ position: 100
+ inlineEditable: false
+ group: special
+ help:
+ message: |
+ List of BlogPosting that allows to specify the blogs and the number of
+ articles to display.
+ inspector:
+ groups:
+ 'blog':
+ label: i18n
+ icon: 'newspaper'
+ position: 50
+ properties:
+ blogs:
+ type: references
+ defaultValue: ''
+ ui:
+ label: i18n
+ showInCreationDialog: true
+ reloadIfChanged: true
+ inspector:
+ group: 'blog'
+ editorOptions:
+ nodeTypes: ['Neos.Demo:Document.Blog']
+ limit:
+ type: integer
+ defaultValue: 5
+ ui:
+ label: i18n
+ showInCreationDialog: true
+ reloadIfChanged: true
+ inspector:
+ group: 'blog'
diff --git a/NodeTypes/Content/Carousel.yaml b/NodeTypes/Content/Carousel.yaml
deleted file mode 100644
index 3db01c94..00000000
--- a/NodeTypes/Content/Carousel.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-##
-# A "Carousel" content element that renders "Image" child nodes into a JavaScript based slideshow
-#
-'Neos.Demo:Content.Carousel':
- superTypes:
- 'Neos.Neos:Content': true
- childNodes:
- carouselitems:
- type: 'Neos.Demo:Collection.Content.Carousel'
- ui:
- label: i18n
- group: 'plugins'
- icon: 'icon-picture'
- inlineEditable: true
- help:
- message: |
- Bootstrap carousel which can display the following types of content:
- * Headline
- * Text
- * TextWithImage
- * Image
- * HTML
- * YouTube
- * References
diff --git a/NodeTypes/Content/Carousel/Carousel.fusion b/NodeTypes/Content/Carousel/Carousel.fusion
new file mode 100644
index 00000000..bb0298ee
--- /dev/null
+++ b/NodeTypes/Content/Carousel/Carousel.fusion
@@ -0,0 +1,21 @@
+##
+# "Carousel" element
+#
+prototype(Neos.Demo:Content.Carousel) < prototype(Neos.Neos:ContentComponent) {
+ content = Neos.Neos:ContentCollection {
+ nodePath = ''
+ tagName = 'ul'
+ attributes.class = 'splide__list'
+
+ prototype(Neos.Neos:ContentComponent) {
+ renderer.@process.wrap = Neos.Demo:Presentation.Slider.Fragment.Item {
+ videoUri = ${props.videoUri}
+ youtubeId = ${props.youtubeId}
+ vimdeoId = ${props.vimdeoId}
+ content = ${value}
+ }
+ }
+ }
+
+ renderer = afx``
+}
diff --git a/NodeTypes/Content/Carousel/Carousel.yaml b/NodeTypes/Content/Carousel/Carousel.yaml
new file mode 100644
index 00000000..64d40141
--- /dev/null
+++ b/NodeTypes/Content/Carousel/Carousel.yaml
@@ -0,0 +1,28 @@
+##
+# A "Carousel" content element that renders "Image" child nodes into a JavaScript based slideshow
+#
+'Neos.Demo:Content.Carousel':
+ superTypes:
+ 'Neos.Neos:Content': true
+ 'Neos.Neos:ContentCollection': true
+ 'Neos.Demo:Constraint.Content.Main': true
+ label: "${Neos.Node.labelForNode(node).override(' ' + I18n.translate('contentcollection.label', '', [q(node).children().count()], 'NodeTypes/Content/Carousel', 'Neos.Demo', q(node).children().count()))}"
+ constraints:
+ nodeTypes:
+ '*': false
+ 'Neos.Demo:Constraint.Content.Carousel': true
+ ui:
+ label: i18n
+ icon: 'exchange-alt'
+ position: 100
+ inlineEditable: true
+ help:
+ message: |
+ Carousel which can display the following types of content:
+ * Headline
+ * Text
+ * TextWithImage
+ * Image
+ * HTML
+ * YouTube
+ * References
diff --git a/NodeTypes/Content/Carousel/Items/YouTube.fusion b/NodeTypes/Content/Carousel/Items/YouTube.fusion
new file mode 100644
index 00000000..3810e16a
--- /dev/null
+++ b/NodeTypes/Content/Carousel/Items/YouTube.fusion
@@ -0,0 +1,12 @@
+prototype(Neos.Demo:Content.CarouselYouTube) < prototype(Neos.Neos:ContentComponent) {
+ src = Neos.Neos:ImageUri {
+ @if.hasAsset = ${this.asset}
+ asset = ${q(node).property('image')}
+ }
+ alt = ${q(node).property('alternativeText')}
+ youtubeId = ${q(node).property('video')}
+
+ renderDummyImage = ${node.context.inBackend}
+
+ renderer = afx``
+}
diff --git a/NodeTypes/Content/Carousel/Items/YouTube.yaml b/NodeTypes/Content/Carousel/Items/YouTube.yaml
new file mode 100644
index 00000000..eb156bde
--- /dev/null
+++ b/NodeTypes/Content/Carousel/Items/YouTube.yaml
@@ -0,0 +1,25 @@
+##
+# A "Youtube" carousel element
+#
+'Neos.Demo:Content.CarouselYouTube':
+ superTypes:
+ 'Neos.Demo:Content.YouTube': true
+ 'Neos.Demo:Constraint.Content.Carousel': true
+ 'Neos.NodeTypes.BaseMixins:ImageMixin': true
+ ui:
+ label: YouTube
+ icon: youtube
+ position: 50
+ inspector:
+ groups:
+ 'video':
+ label: i18n
+ icon: film
+ position: 50
+ help:
+ message: 'Embeds a YouTube video as content defined by a video ID.'
+ properties:
+ title: {}
+ video:
+ validation:
+ Neos.Neos/Validation/NotEmptyValidator: {}
diff --git a/NodeTypes/Content/ChapterMenu.yaml b/NodeTypes/Content/ChapterMenu.yaml
deleted file mode 100644
index 1f36fe02..00000000
--- a/NodeTypes/Content/ChapterMenu.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-##
-# A custom "Menu" NodeType for chapters
-#
-'Neos.Demo:Content.ChapterMenu':
- superTypes:
- 'Neos.Neos:Content': true
- ui:
- label: i18n
- help:
- message: |
- The ChapterMenu renders an overview of all chapters below the current document.
- It displays:
- * title
- * chapter description
- * chapter image
diff --git a/Resources/Private/Fusion/Content/Columns/Four.fusion b/NodeTypes/Content/Columns/Four/Four.fusion
similarity index 80%
rename from Resources/Private/Fusion/Content/Columns/Four.fusion
rename to NodeTypes/Content/Columns/Four/Four.fusion
index 3396756d..986ac10a 100644
--- a/Resources/Private/Fusion/Content/Columns/Four.fusion
+++ b/NodeTypes/Content/Columns/Four/Four.fusion
@@ -19,12 +19,12 @@ prototype(Neos.Demo:Content.Columns.Four) < prototype(Neos.Neos:ContentComponent
}
renderer = afx`
-
-
{props.column0}
-
{props.column1}
-
{props.column2}
-
{props.column3}
-
+
+ {props.column0}
+ {props.column1}
+ {props.column2}
+ {props.column3}
+
`
}
diff --git a/NodeTypes/Content/Columns/Four.yaml b/NodeTypes/Content/Columns/Four/Four.yaml
similarity index 82%
rename from NodeTypes/Content/Columns/Four.yaml
rename to NodeTypes/Content/Columns/Four/Four.yaml
index b90db43a..4fbc52e8 100644
--- a/NodeTypes/Content/Columns/Four.yaml
+++ b/NodeTypes/Content/Columns/Four/Four.yaml
@@ -1,11 +1,12 @@
'Neos.Demo:Content.Columns.Four':
superTypes:
'Neos.Neos:Content': true
+ 'Neos.Demo:Constraint.Content.Main': true
ui:
label: i18n
- icon: 'icon-columns'
+ icon: 'columns'
group: 'structure'
- position: 400
+ position: 30
childNodes:
column0:
type: 'Neos.Demo:Collection.Content.Column'
diff --git a/Resources/Private/Fusion/Content/Columns/Three.fusion b/NodeTypes/Content/Columns/Three/Three.fusion
similarity index 81%
rename from Resources/Private/Fusion/Content/Columns/Three.fusion
rename to NodeTypes/Content/Columns/Three/Three.fusion
index aaa2be2b..fe1ece28 100644
--- a/Resources/Private/Fusion/Content/Columns/Three.fusion
+++ b/NodeTypes/Content/Columns/Three/Three.fusion
@@ -15,11 +15,11 @@ prototype(Neos.Demo:Content.Columns.Three) < prototype(Neos.Neos:ContentComponen
}
renderer = afx`
-
-
{props.column0}
-
{props.column1}
-
{props.column2}
-
+
+ {props.column0}
+ {props.column1}
+ {props.column2}
+
`
}
diff --git a/NodeTypes/Content/Columns/Three.yaml b/NodeTypes/Content/Columns/Three/Three.yaml
similarity index 79%
rename from NodeTypes/Content/Columns/Three.yaml
rename to NodeTypes/Content/Columns/Three/Three.yaml
index fa69cd41..81b9a16c 100644
--- a/NodeTypes/Content/Columns/Three.yaml
+++ b/NodeTypes/Content/Columns/Three/Three.yaml
@@ -1,11 +1,12 @@
'Neos.Demo:Content.Columns.Three':
superTypes:
'Neos.Neos:Content': true
+ 'Neos.Demo:Constraint.Content.Main': true
ui:
label: i18n
- icon: 'icon-columns'
+ icon: 'columns'
group: 'structure'
- position: 400
+ position: 20
childNodes:
column0:
type: 'Neos.Demo:Collection.Content.Column'
diff --git a/Resources/Private/Fusion/Content/Columns/Two.fusion b/NodeTypes/Content/Columns/Two/Two.fusion
similarity index 82%
rename from Resources/Private/Fusion/Content/Columns/Two.fusion
rename to NodeTypes/Content/Columns/Two/Two.fusion
index 31fb9988..86cddeb6 100644
--- a/Resources/Private/Fusion/Content/Columns/Two.fusion
+++ b/NodeTypes/Content/Columns/Two/Two.fusion
@@ -11,10 +11,10 @@ prototype(Neos.Demo:Content.Columns.Two) < prototype(Neos.Neos:ContentComponent)
}
renderer = afx`
-
-
{props.column0}
-
{props.column1}
-
+
+ {props.column0}
+ {props.column1}
+
`
}
diff --git a/NodeTypes/Content/Columns/Two.yaml b/NodeTypes/Content/Columns/Two/Two.yaml
similarity index 75%
rename from NodeTypes/Content/Columns/Two.yaml
rename to NodeTypes/Content/Columns/Two/Two.yaml
index b82401ca..8ca4f120 100644
--- a/NodeTypes/Content/Columns/Two.yaml
+++ b/NodeTypes/Content/Columns/Two/Two.yaml
@@ -1,11 +1,12 @@
'Neos.Demo:Content.Columns.Two':
superTypes:
'Neos.Neos:Content': true
+ 'Neos.Demo:Constraint.Content.Main': true
ui:
label: i18n
- icon: 'icon-columns'
+ icon: 'columns'
group: 'structure'
- position: 400
+ position: 10
childNodes:
column0:
type: 'Neos.Demo:Collection.Content.Column'
diff --git a/Resources/Private/Fusion/Content/ContactForm.fusion b/NodeTypes/Content/ContactForm/ContactForm.fusion
similarity index 73%
rename from Resources/Private/Fusion/Content/ContactForm.fusion
rename to NodeTypes/Content/ContactForm/ContactForm.fusion
index 7ba73f54..2231efa0 100644
--- a/Resources/Private/Fusion/Content/ContactForm.fusion
+++ b/NodeTypes/Content/ContactForm/ContactForm.fusion
@@ -2,33 +2,31 @@
# "ContactForm" element
#
prototype(Neos.Demo:Content.ContactForm) < prototype(Neos.Neos:ContentComponent) {
+ attributes {
+ id = ${'form-' + node.identifier}
+ action = ${'#' + this.id}
+ }
renderer = Neos.Fusion.Form:Runtime.RuntimeForm {
namespace = 'contact'
process {
content = afx`
-