You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by da...@apache.org on 2023/04/23 11:46:13 UTC

[causeway] 01/02: CAUSEWAY-2485: reworks @Property#labelPosition

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch CAUSEWAY-2485
in repository https://gitbox.apache.org/repos/asf/causeway.git

commit 01af5ee419010fa813338543209a5cb6ff90134c
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Apr 23 12:34:12 2023 +0100

    CAUSEWAY-2485: reworks @Property#labelPosition
---
 .../PropertyLayoutCssClassPage-description.adoc    |   4 +-
 .../LabelPositionLeftMetaAnnotation.java           |  44 ----
 .../LabelPositionTopMetaAnnotation.java            |  44 ----
 ...ropertyLayoutLabelPositionPage-description.adoc | 233 +++++++++------------
 .../PropertyLayoutLabelPositionPage.java           | 144 ++++++-------
 .../PropertyLayoutLabelPositionPage.layout.xml     |  23 +-
 ..._mixinPropertyWithMetaAnnotationOverridden.java |  49 -----
 ...itionPage_updateBooleanLabelPositionRight.java} |  22 +-
 ...LabelPositionPage_updateLabelPositionLeft.java} |  39 ++--
 ...LabelPositionPage_updateLabelPositionNone.java} |  19 +-
 ...itionPage_updateLabelPositionNotSpecified.java} |  29 +--
 ...tLabelPositionPage_updateLabelPositionTop.java} |  36 ++--
 ...rtyLayoutLabelPositionPage_updateProperty.java} |  23 +-
 ...yLayoutLabelPositionPage_updateVariantLeft.java |  60 ------
 ...LayoutLabelPositionPage_updateVariantRight.java |  60 ------
 ...LabelPositionPage_updateWithMetaAnnotation.java |  58 -----
 ...ionPage_updateWithMetaAnnotationOverridden.java |  61 ------
 .../demo/domain/src/main/resources/application.yml |   4 +-
 18 files changed, 251 insertions(+), 701 deletions(-)

diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/cssClass/PropertyLayoutCssClassPage-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/cssClass/PropertyLayoutCssClassPage-description.adoc
index 2e1783b52d..b12f277a98 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/cssClass/PropertyLayoutCssClassPage-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/cssClass/PropertyLayoutCssClassPage-description.adoc
@@ -4,7 +4,7 @@ To highlight certain information on the page, it can sometimes be helpful to sty
 
 The `cssClass` attribute indicates that the `<div>` containing the property or parameter component within the UI should set the specified CSS class:
 
-* for properties, the attribute can be specified using either the link:https://causeway.apache.org/refguide/2.0.0-RC1/applib/index/annotation/PropertyLayout.html#cssclass[@PropertyLayout#cssClass] annotation, or using the `Xxx.layout.xml` layout file.
+* for properties, the attribute can be specified using either the link:https://causeway.apache.org/refguide/2.0.0-RC1/applib/index/annotation/PropertyLayout.html#cssclass[@PropertyLayout#cssClass] annotation, or using the link:https://causeway.apache.org/userguide/2.0.0-RC1/fun/ui.html#by-example[.layout.xml] layout file.
 
 * for parameters, the attribute can be specified using the link:https://causeway.apache.org/refguide/2.0.0-RC1/applib/index/annotation/ParameterLayout.html#cssclass[@PropertyLayout#cssClass] annotation
 
@@ -13,7 +13,7 @@ The `application.css` file can then be used to apply styling to that CSS class
 == How this demo works
 
 This page contains two properties.
-The `name` property uses `@Property#cssClass` to specify a custom CSS class of "red", while the `notes` property specifies a custom CSS class using the link:https://causeway.apache.org/userguide/2.0.0-RC1/fun/ui.html#by-example[.layout.xml].
+The `name` property uses `@Property#cssClass` to specify a custom CSS class of "red", while the `notes` property specifies a custom CSS class using the `layout.xml` file.
 
 Both properties can be edited directly, but the `name` property also has an associated action to update it.
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/LabelPositionLeftMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/LabelPositionLeftMetaAnnotation.java
deleted file mode 100644
index 91cecea322..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/LabelPositionLeftMetaAnnotation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.apache.causeway.applib.annotation.LabelPosition;
-import org.apache.causeway.applib.annotation.ParameterLayout;
-import org.apache.causeway.applib.annotation.PropertyLayout;
-
-//tag::class[]
-@PropertyLayout(labelPosition = LabelPosition.LEFT)     // <.>
-@ParameterLayout(labelPosition = LabelPosition.LEFT)    // <.>
-@Inherited
-@Target({
-        ElementType.METHOD, ElementType.FIELD,          // <.>
-        ElementType.PARAMETER,                          // <.>
-        ElementType.TYPE                                // <.>
-})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface LabelPositionLeftMetaAnnotation {
-
-}
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/LabelPositionTopMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/LabelPositionTopMetaAnnotation.java
deleted file mode 100644
index d24a7f7fe4..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/LabelPositionTopMetaAnnotation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.apache.causeway.applib.annotation.LabelPosition;
-import org.apache.causeway.applib.annotation.ParameterLayout;
-import org.apache.causeway.applib.annotation.PropertyLayout;
-
-//tag::class[]
-@PropertyLayout(labelPosition = LabelPosition.TOP)      // <.>
-@ParameterLayout(labelPosition = LabelPosition.TOP)     // <.>
-@Inherited
-@Target({
-        ElementType.METHOD, ElementType.FIELD,          // <.>
-        ElementType.PARAMETER,                          // <.>
-        ElementType.TYPE                                // <.>
-})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface LabelPositionTopMetaAnnotation {
-
-}
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage-description.adoc
index 7a69b3d254..ddb42b4ae0 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage-description.adoc
@@ -1,8 +1,8 @@
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 
-The `labelPosition` attribute indicates where the label for a property to be rendered: typically to the left or the top, or sometimes none:
+The `labelPosition` attribute indicates where the label for a property or an action parameter should be rendered: typically to the left or the top, or sometimes none:
 
-* for properties, the attribute can be specified using either the `@PropertyLayout` annotation, or using the `Xxx.layout.xml` layout file.
+* for properties, the attribute can be specified using either the link:https://causeway.apache.org/refguide/2.0.0-RC1/applib/index/annotation/PropertyLayout.html#labelposition[@PropertyLayout#labelPosition] `@PropertyLayout` annotation, or using the link:https://causeway.apache.org/userguide/2.0.0-RC1/fun/ui.html#by-example[.layout.xml] layout file.
 
 * for parameters, the attribute can be specified using the `@ParameterLayout` annotation
 
@@ -10,229 +10,202 @@ Some data types also support the label being rendered to the right (support for
 
 
 
-== Annotated
+== How this demo works
 
-The `labelPosition` attribute can be specified explicitly using an annotation:
+This page has various sets of properties that together illustrate the use of either `@PropertyLayout#labelPosition()` or the `.layout.xml` file to specify the label position.
 
-* for properties, using `@PropertyLayout#labelPosition()`:
+=== Annotated
+
+The first set of properties are annotated with `@PropertyLayout#labelPosition()`.
+They each also have an action whose parameter is annotated with `@ParameterLayout#labelPosition()`.
+
+* no label positioning at all:
+
+** for the property:
 +
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage.java[tags=annotation]
+include::PropertyLayoutLabelPositionPage.java[tags=annotated-not-provided]
 ----
-<.> explicitly specifies the label position for the property
 
-* for parameters, using `@ParameterLayout#labelPosition()`:
+** its corresponding action:
 +
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage_updateWithParameterLayout.java[tags=annotation]
+include::PropertyLayoutLabelPositionPage_updateProperty.java[tags=annotation]
 ----
-<.> explicitly specifies the label position for the parameter
-
-== Layout File
++
+These will use the default label position as per configuration property (see section below)
 
-For properties (not parameters), the CSS class can be specified using the `Xxx.layout.xml` file:
+* label positioned explicitly to the left:
 
-* property definition:
+** for the property:
 +
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage.java[tags=layout-file]
+include::PropertyLayoutLabelPositionPage.java[tags=annotated-left]
 ----
-<.> `labelPosition` hint is _not_ present.
 
-* layout file snippet:
+** its corresponding action:
 +
-[source,xml,indent=0,tabsize=4]
-----
-<cpt:property id="propertyUsingLayout" labelPosition="TOP"/>
-----
-
-One advantage of the layout file over the annotation is that the layout file is dynamic: it can be modified and the changes reloaded in a running application.
-
-TIP: It is sometimes necessary to invoke the `Rebuild Metamodel` action to see this take effect.
-
-== Contributed
-
-The `@PropertyLayout` can also be applied at the class-level to mixin properties:.
-
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage_mixinProperty.java[tags=class]
+include::PropertyLayoutLabelPositionPage_updateLabelPositionLeft.java[tags=annotation]
 ----
-<.> explicitly specifies the label position for the contributed property
-
-== Meta-annotated
 
-The label position element can also be specified using a custom meta-annotation:
+* label positioned above:
 
-* the meta-annotation is defined as:
+** for the property:
 +
-[source,java]
+[source,java,indent=0]
 ----
-include::LabelPositionTopMetaAnnotation.java[tags=class]
+include::PropertyLayoutLabelPositionPage.java[tags=annotated-top]
 ----
-<.> annotated for a property ...
-<.> \... and for a parameter.
-<.> annotation can be applied to a property (either its getter or the field directly)
-<.> annotation can be applied to a parameter
-<.> annotation can be applied to a type (ie, meta-meta annotations recursively)
 
-* and can be applied to a property:
+** its corresponding action:
 +
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage.java[tags=meta-annotated]
+include::PropertyLayoutLabelPositionPage_updateLabelPositionTop.java[tags=annotation]
 ----
-<.> hint is inherited from the meta-annotation
 
-* or can be applied to a parameter:
+* label suppressed:
+
+** for the property:
 +
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage_updateWithMetaAnnotation.java[tags=meta-annotation]
+include::PropertyLayoutLabelPositionPage.java[tags=annotated-none]
 ----
-<.> hint is inherited from the meta-annotation
 
-* or can be applied to mixin:
+** its corresponding action:
 +
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage_mixinPropertyWithMetaAnnotation.java[tags=class]
+include::PropertyLayoutLabelPositionPage_updateLabelPositionTop.java[tags=annotation]
 ----
-<.> hint is inherited from the meta-annotation
++
+This pattern is common for properties such as notes, or XML or markup text.
+Usually the property is the only one in its containing fieldset, and so the fieldset is given a suitable name.
 
-=== Meta-annotated Overridden
 
-The meta-annotation can itself be overridden:
+* label explicitly not specified:
 
-* in a property:
+** for the property:
 +
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage.java[tags=meta-annotated-overridden]
+include::PropertyLayoutLabelPositionPage.java[tags=annotated-not-specified]
 ----
-<.> hint from meta-annotation ...
-<.> \... is overridden by the `@PropertyLayout` annotation
 
-* or a parameter:
+** its corresponding action:
 +
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage_updateWithMetaAnnotationOverridden.java[tags=meta-annotation-overridden]
+include::PropertyLayoutLabelPositionPage_updateLabelPositionNotSpecified.java[tags=annotation]
 ----
-<.> hint from meta-annotation ...
-<.> \... is overridden by the `@ParameterLayout` annotation
-
-
-* or a mixin:
 +
-[source,java,indent=0]
-----
-include::PropertyLayoutLabelPositionPage_mixinPropertyWithMetaAnnotationOverridden.java[tags=meta-annotation-overridden]
-----
-<.> hint from meta-annotation ...
-<.> \... is overridden by the `@PropertyLayout` annotation
+This option allows the position label to be specified elsewhere, for example in a meta-annotation.
+The fallback will be the configuration property (see section below).
 
 
-== Variants
 
-As mentioned earlier, the label can be positioned to the left, top, none, right or left unspecified.
+=== Boolean properties
 
-=== Left
+Positioning the label to the right is _only_ supported for boolean properties:
 
-For a property:
-
-[source,java,indent=0]
-----
-include::PropertyLayoutLabelPositionPage.java[tags=variants-left]
-----
-
-And for a parameter:
+* boolean property with label positioned to the right:
++
+WARNING: currently the label is positioned above; see link:https://issues.apache.org/jira/browse/CAUSEWAY-3441[CAUSEWAY-3441]
 
+** for the property:
++
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage_updateVariantLeft.java[tags=annotation]
+include::PropertyLayoutLabelPositionPage.java[tags=annotated-right-boolean]
 ----
 
-=== Top
-
-For a property:
-
+** its corresponding action:
++
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage.java[tags=variants-top]
+include::PropertyLayoutLabelPositionPage_updateBooleanLabelPositionRight.java[tags=annotation]
 ----
 
-And for a parameter:
-
+* attempting to use for a non-boolean results instead in the label positioned to the top:
++
 [source,java,indent=0]
 ----
-include::PropertyLayoutLabelPositionPage_updateVariantTop.java[tags=annotation]
+include::PropertyLayoutLabelPositionPage.java[tags=annotated-right]
 ----
 
-=== Right
 
-Most data types do not support the right label position, and instead render to the top.
+=== Using .layout.xml
 
-For a string property:
+It's also possible to specify the label position using the `.layout.xml` file.
 
-[source,java,indent=0]
+* the `propertyLayoutLabelPositionLeft` property has its label positioned to the left:
++
+[source,xml,indent=0,tabsize=4]
 ----
-include::PropertyLayoutLabelPositionPage.java[tags=variants-right]
+<cpt:property id="propertyUsingLayout" labelPosition="LEFT"/>
 ----
 
-However, the boolean type _does_ support labels position to the right:
-
-[source,java,indent=0]
+* the `propertyLayoutLabelPositionTop` property has its label positioned above:
++
+[source,xml,indent=0,tabsize=4]
 ----
-include::PropertyLayoutLabelPositionPage.java[tags=variants-right-boolean]
+<cpt:property id="propertyUsingLayout" labelPosition="TOP"/>
 ----
 
-
-=== None
-
-All data types allow the label position to be omitted, although this can create a confusing user interface.
-
-For a string property:
-
-[source,java,indent=0]
+* the `propertyLayoutLabelPositionNone` property has its label suppressed:
++
+[source,xml,indent=0,tabsize=4]
 ----
-include::PropertyLayoutLabelPositionPage.java[tags=variants-none]
+<cpt:property id="propertyLayoutLabelPositionNone"
+        labelPosition="NONE" multiLine="3"/>
 ----
 
-One place where "NONE" is used however is with multiline descriptions:
-
-[source,java,indent=0]
+* the `propertyLayoutBooleanLabelPositionRight` _boolean_ property has its label positioned to the right:
++
+[source,xml,indent=0,tabsize=4]
 ----
-include::PropertyLayoutLabelPositionPage.java[tags=variants-none-multiline]
+<cpt:property id="propertyLayoutBooleanLabelPositionRight" labelPosition="RIGHT"/>
 ----
++
+WARNING: currently the label is positioned above; see link:https://issues.apache.org/jira/browse/CAUSEWAY-3441[CAUSEWAY-3441]
 
-TIP: the description text you are reading right now is in fact a contributed `AsciiDoc` property with no label.
+One advantage of the layout file over the annotation is that the layout file is dynamic: it can be modified and the changes reloaded in a running application.
 
-=== Not Specified
 
-It's also possible to omit specifying the label position, either implicitly or explicitly.
-In this case a default position will be used:
+== Related Configuration Properties
 
-For a property:
+If a `labelPosition` has not been explicitly specified by an annotation (or meta-annotation) or in the `.layout.xml`, then a configuration property is used to define a default position.
 
-[source,java,indent=0]
+* for properties:
++
+[source,yaml]
+.application.yml
 ----
-include::PropertyLayoutLabelPositionPage.java[tags=variants-not-specified]
+causeway:
+  applib:
+    annotation:
+      property-layout:
+        label-position: left  # <.>
 ----
+<.>  `left` | `top` | `none` | `right`
 
-And for a parameter:
-
-[source,java,indent=0]
+* for parameters:
++
+[source,yaml]
+.application.yml
 ----
-include::PropertyLayoutLabelPositionPage_updateVariantNotSpecified.java[tags=annotation]
+causeway:
+  applib:
+    annotation:
+      parameter-layout:
+        label-position: left  # <.>
 ----
+<.>  `left` | `top` | `none` | `right`
 
-The default position itself can be configured globally, in the `application.yml` or `application.properties` configuration file.
-This is done using:
-
-* `causeway.applib.annotation.property-layout.label-position` configuration property for properties, and
-* `causeway.applib.annotation.parameter-layout.label-position` configuration property for parameters.
-
+If there is no such configuration property, then the framework defaults to `left`.
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage.java
index 194c438b64..701d57ca85 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage.java
@@ -53,138 +53,116 @@ public class PropertyLayoutLabelPositionPage implements HasAsciiDocDescription {
         return "@PropertyLayout#labelPosition";
     }
 
-//tag::annotation[]
+//tag::annotated-not-provided[]
     @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayout(
-        labelPosition = LabelPosition.TOP                   // <.>
-        , describedAs =
-            "@PropertyLayout(labelPosition = TOP)",
-        fieldSetId = "annotation", sequence = "1")
+    @PropertyLayout()
     @XmlElement(required = false)
     @Getter @Setter
-    private String propertyUsingAnnotation;
-//end::annotation[]
+    private String property;
+//end::annotated-not-provided[]
 
-//tag::layout-file[]
+//tag::annotated-left[]
     @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayout(                                        // <.>
-        describedAs =
-            "<cpt:property id=\"...\" labelPosition=\"TOP\"/>",
-        fieldSetId = "layout-file", sequence = "1")
+    @PropertyLayout(
+            labelPosition = LabelPosition.LEFT
+    )
     @XmlElement(required = false)
     @Getter @Setter
-    private String propertyUsingLayout;
-//end::layout-file[]
+    private String propertyLabelPositionLeft;
+//end::annotated-left[]
 
-//tag::meta-annotated[]
+//tag::annotated-top[]
     @Property(optionality = Optionality.OPTIONAL)
-    @LabelPositionTopMetaAnnotation                         // <.>
     @PropertyLayout(
-        describedAs = "@LabelPositionTopMetaAnnotation",
-        fieldSetId = "meta-annotated", sequence = "1")
+            labelPosition = LabelPosition.TOP
+    )
     @XmlElement(required = false)
     @Getter @Setter
-    private String propertyUsingMetaAnnotation;
-//end::meta-annotated[]
+    private String propertyLabelPositionTop;
+//end::annotated-top[]
 
-//tag::meta-annotated-overridden[]
-    @LabelPositionTopMetaAnnotation                         // <.>
+//tag::annotated-none[]
     @Property(optionality = Optionality.OPTIONAL)
     @PropertyLayout(
-        labelPosition = LabelPosition.LEFT                  // <.>
-        , describedAs =
-            "@LabelPositionTopMetaAnnotation @PropertyLayout(...)",
-        fieldSetId = "meta-annotated-overridden", sequence = "1")
+            labelPosition = LabelPosition.NONE,
+            multiLine = 3
+    )
     @XmlElement(required = false)
     @Getter @Setter
-    private String propertyUsingMetaAnnotationButOverridden;
-//end::meta-annotated-overridden[]
+    private String propertyLabelPositionNone;
+//end::annotated-none[]
 
-//tag::variants-top[]
+//tag::annotated-not-specified[]
     @Property(optionality = Optionality.OPTIONAL)
     @PropertyLayout(
-        labelPosition = LabelPosition.TOP                   // <.>
-        , describedAs =
-        "@PropertyLayout(labelPosition = TOP)",
-        fieldSetId = "variants", sequence = "1")
+            labelPosition = LabelPosition.NOT_SPECIFIED
+    )
     @XmlElement(required = false)
     @Getter @Setter
-    private String propertyLabelPositionTop;
-//end::variants-top[]
+    private String propertyLabelPositionNotSpecified;
+//end::annotated-not-specified[]
 
-//tag::variants-left[]
+//tag::annotated-right-boolean[]
     @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayout(
-        labelPosition = LabelPosition.LEFT                  // <.>
-        , describedAs =
-        "@PropertyLayout(labelPosition = LEFT)",
-        fieldSetId = "variants", sequence = "2")
+    @PropertyLayout()
     @XmlElement(required = false)
     @Getter @Setter
-    private String propertyLabelPositionLeft;
-//end::variants-left[]
+    private Boolean propertyBoolean;
+//end::annotated-right-boolean[]
 
-//tag::variants-right[]
+//tag::annotated-right-boolean[]
     @Property(optionality = Optionality.OPTIONAL)
     @PropertyLayout(
-        labelPosition = LabelPosition.RIGHT                 // <.>
-        , describedAs =
-        "@PropertyLayout(labelPosition = RIGHT)",
-        fieldSetId = "variants", sequence = "3")
+            labelPosition = LabelPosition.RIGHT
+    )
     @XmlElement(required = false)
     @Getter @Setter
-    private String propertyLabelPositionRight;
-//end::variants-right[]
+    private Boolean propertyBooleanLabelPositionRight;
+//end::annotated-right-boolean[]
 
-//tag::variants-right-boolean[]
+//tag::annotated-right[]
     @Property(optionality = Optionality.OPTIONAL)
     @PropertyLayout(
-        labelPosition = LabelPosition.RIGHT                 // <.>
-        , describedAs =
-        "@PropertyLayout(labelPosition = RIGHT)",
-        fieldSetId = "variants", sequence = "3.1")
+            labelPosition = LabelPosition.RIGHT
+    )
     @XmlElement(required = false)
     @Getter @Setter
-    private Boolean propertyBooleanLabelPositionRight;
-//end::variants-right-boolean[]
+    private String propertyLabelPositionRight;
+//end::annotated-right[]
+
+
 
-//tag::variants-none[]
+//tag::layout-left[]
     @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayout(
-        labelPosition = LabelPosition.NONE                  // <.>
-        , describedAs =
-        "@PropertyLayout(labelPosition = NONE)",
-        fieldSetId = "variants", sequence = "4")
+    @PropertyLayout()
     @XmlElement(required = false)
     @Getter @Setter
-    private String propertyLabelPositionNone;
-//end::variants-none[]
+    private String propertyLayoutLabelPositionLeft;
+//end::layout-left[]
 
-//tag::variants-none-multiline[]
+//tag::layout-top[]
     @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayout(
-            labelPosition = LabelPosition.NONE              // <.>
-            , multiLine = 10
-            , describedAs =
-            "@PropertyLayout(labelPosition = NONE, multiLine = 10)",
-            fieldSetId = "variants", sequence = "4.1")
+    @PropertyLayout()
     @XmlElement(required = false)
     @Getter @Setter
-    private String propertyLabelPositionNoneMultiline;
-//end::variants-none-multiline[]
+    private String propertyLayoutLabelPositionTop;
+//end::layout-top[]
 
-//tag::variants-not-specified[]
+//tag::layout-none[]
     @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayout(
-        labelPosition = LabelPosition.NOT_SPECIFIED         // <.>
-        , describedAs =
-        "@PropertyLayout(labelPosition = NONE)",
-        fieldSetId = "variants", sequence = "5")
+    @PropertyLayout()
     @XmlElement(required = false)
     @Getter @Setter
-    private String propertyLabelPositionNotSpecified;
-//end::variants-not-specified[]
+    private String propertyLayoutLabelPositionNone;
+//end::layout-none[]
 
+//tag::layout-right-boolean[]
+    @Property(optionality = Optionality.OPTIONAL)
+    @PropertyLayout()
+    @XmlElement(required = false)
+    @Getter @Setter
+    private Boolean propertyLayoutBooleanLabelPositionRight;
+//end::layout-right-boolean[]
 
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage.layout.xml
index 66a9f5a7f1..0bc49d2b99 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage.layout.xml
@@ -26,16 +26,27 @@
 
 	<bs3:row>
 		<bs3:col span="6">
-			<cpt:fieldSet name="Annotated" id="annotation"/>
+			<cpt:fieldSet name="Annotated" id="annotation">
+				<cpt:property id="property"/>
+				<cpt:property id="propertyLabelPositionLeft"/>
+				<cpt:property id="propertyLabelPositionTop"/>
+				<cpt:property id="propertyLabelPositionNone"/>
+				<cpt:property id="propertyLabelPositionNotSpecified"/>
+            </cpt:fieldSet>
+			<cpt:fieldSet name="Position Right" id="position-right">
+				<cpt:property id="propertyBoolean"/>
+				<cpt:property id="propertyBooleanLabelPositionRight"/>
+				<cpt:property id="propertyLabelPositionRight"/>
+            </cpt:fieldSet>
 			<cpt:fieldSet name="Layout File" id="layout-file">
 <!-- tag::layout-file[] -->
-				<cpt:property id="propertyUsingLayout" labelPosition="TOP"/>
+                <cpt:property id="propertyLayoutLabelPositionLeft" labelPosition="LEFT"/>
+                <cpt:property id="propertyLayoutLabelPositionTop" labelPosition="TOP"/>
+                <cpt:property id="propertyLayoutLabelPositionNone" labelPosition="NONE" multiLine="3"/>
+                <cpt:property id="propertyLayoutBooleanLabelPositionRight" labelPosition="RIGHT"/>
 <!-- end::layout-file[] -->
 			</cpt:fieldSet>
-			<cpt:fieldSet name="Contributed" id="contributed"/>
-			<cpt:fieldSet name="Meta-annotated" id="meta-annotated"/>
-			<cpt:fieldSet name="Meta-annotated Overridden" id="meta-annotated-overridden"/>
-			<cpt:fieldSet name="Variants" id="variants"/>
+
 			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
 		</bs3:col>
 		<bs3:col span="6">
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_mixinPropertyWithMetaAnnotationOverridden.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_mixinPropertyWithMetaAnnotationOverridden.java
deleted file mode 100644
index 3962643449..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_mixinPropertyWithMetaAnnotationOverridden.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
-
-import org.apache.causeway.applib.annotation.LabelPosition;
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.PropertyLayout;
-
-import lombok.RequiredArgsConstructor;
-
-//tag::meta-annotation-overridden[]
-@LabelPositionTopMetaAnnotation                                 // <.>
-@Property()
-@PropertyLayout(
-    labelPosition = LabelPosition.LEFT                          // <.>
-    , describedAs =
-        "@LabelPositionTopMetaAnnotation @ParameterLayout(...)",
-    fieldSetId = "meta-annotated-overridden", sequence = "2"
-)
-@RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_mixinPropertyWithMetaAnnotationOverridden {
-    // ...
-//end::meta-annotation-overridden[]
-
-    private final PropertyLayoutLabelPositionPage page;
-
-    public String prop() {
-        return page.getPropertyUsingAnnotation();
-    }
-
-//tag::meta-annotation-overridden[]
-}
-//end::meta-annotation-overridden[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantTop.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateBooleanLabelPositionRight.java
similarity index 74%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantTop.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateBooleanLabelPositionRight.java
index b6b0c7fbe7..925ca5c9d3 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantTop.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateBooleanLabelPositionRight.java
@@ -29,14 +29,10 @@ import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    associateWith = "propertyLabelPositionTop"
-    , sequence = "1")
+@Action(semantics = SemanticsOf.IDEMPOTENT)
+@ActionLayout(associateWith = "propertyBooleanLabelPositionRight", sequence = "1")
 @RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_updateVariantTop {
+public class PropertyLayoutLabelPositionPage_updateBooleanLabelPositionRight {
 
     private final PropertyLayoutLabelPositionPage page;
 
@@ -44,17 +40,15 @@ public class PropertyLayoutLabelPositionPage_updateVariantTop {
     @MemberSupport public PropertyLayoutLabelPositionPage act(
             @Parameter(optionality = Optionality.OPTIONAL)
             @ParameterLayout(
-                labelPosition = LabelPosition.TOP               // <.>
-                , describedAs =
-                    "@ParameterLayout(labelPosition = TOP)"
+                    labelPosition = LabelPosition.RIGHT
             )
-            final String parameterLabelPositionTop) {
-        page.setPropertyLabelPositionTop(parameterLabelPositionTop);
+            final Boolean newValue) {
+        page.setPropertyBooleanLabelPositionRight(newValue);
         return page;
     }
 //end::annotation[]
-    @MemberSupport public String default0Act() {
-        return page.getPropertyLabelPositionTop();
+    @MemberSupport public Boolean default0Act() {
+        return page.getPropertyLayoutBooleanLabelPositionRight();
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_mixinProperty.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionLeft.java
similarity index 58%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_mixinProperty.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionLeft.java
index 2c59753a0a..0597a4d536 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_mixinProperty.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionLeft.java
@@ -18,33 +18,30 @@
  */
 package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
 
-import org.apache.causeway.applib.annotation.LabelPosition;
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.PropertyLayout;
-import org.apache.causeway.applib.annotation.Where;
-
 import lombok.RequiredArgsConstructor;
 
-//tag::class[]
-@Property()
-@PropertyLayout(
-    labelPosition = LabelPosition.TOP           // <.>
-    , describedAs =
-        "@PropertyLayout(labelPosition = TOP)"
-    , hidden = Where.ALL_TABLES,
-    fieldSetId = "contributed", sequence = "1"
-)
+import org.apache.causeway.applib.annotation.*;
+
+@Action(semantics = SemanticsOf.IDEMPOTENT)
+@ActionLayout(associateWith = "propertyLabelPositionLeft", sequence = "1")
 @RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_mixinProperty {
-    // ...
-//end::class[]
+public class PropertyLayoutLabelPositionPage_updateLabelPositionLeft {
 
     private final PropertyLayoutLabelPositionPage page;
 
-    public String prop() {
-        return page.getPropertyUsingAnnotation();
+//tag::annotation[]
+    @MemberSupport public PropertyLayoutLabelPositionPage act(
+            @Parameter(optionality = Optionality.OPTIONAL)
+            @ParameterLayout(
+                    labelPosition = LabelPosition.LEFT
+            )
+            final String newValue) {
+        page.setPropertyLabelPositionLeft(newValue);
+        return page;
+    }
+//end::annotation[]
+    @MemberSupport public String default0Act() {
+        return page.getPropertyLabelPositionLeft();
     }
 
-//tag::class[]
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantNone.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionNone.java
similarity index 78%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantNone.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionNone.java
index f5c7924571..0c7bd80d8a 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantNone.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionNone.java
@@ -29,14 +29,10 @@ import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    associateWith = "propertyLabelPositionNone"
-    , sequence = "1")
+@Action(semantics = SemanticsOf.IDEMPOTENT)
+@ActionLayout(associateWith = "propertyLabelPositionNone", sequence = "1")
 @RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_updateVariantNone {
+public class PropertyLayoutLabelPositionPage_updateLabelPositionNone {
 
     private final PropertyLayoutLabelPositionPage page;
 
@@ -44,12 +40,11 @@ public class PropertyLayoutLabelPositionPage_updateVariantNone {
     @MemberSupport public PropertyLayoutLabelPositionPage act(
             @Parameter(optionality = Optionality.OPTIONAL)
             @ParameterLayout(
-                labelPosition = LabelPosition.NONE              // <.>
-                , describedAs =
-                    "@ParameterLayout(labelPosition = NONE)"
+                    labelPosition = LabelPosition.NONE,
+                    multiLine = 3
             )
-            final String parameterLabelPositionNone) {
-        page.setPropertyLabelPositionNone(parameterLabelPositionNone);
+            final String newValue) {
+        page.setPropertyLabelPositionTop(newValue);
         return page;
     }
 //end::annotation[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantNotSpecified.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionNotSpecified.java
similarity index 57%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantNotSpecified.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionNotSpecified.java
index 28fb75c452..90c221dd5e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantNotSpecified.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionNotSpecified.java
@@ -18,25 +18,14 @@
  */
 package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
 
-import org.apache.causeway.applib.annotation.Action;
-import org.apache.causeway.applib.annotation.ActionLayout;
-import org.apache.causeway.applib.annotation.LabelPosition;
-import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.Optionality;
-import org.apache.causeway.applib.annotation.Parameter;
-import org.apache.causeway.applib.annotation.ParameterLayout;
-import org.apache.causeway.applib.annotation.SemanticsOf;
-
 import lombok.RequiredArgsConstructor;
 
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    associateWith = "propertyLabelPositionNotSpecified"
-    , sequence = "1")
+import org.apache.causeway.applib.annotation.*;
+
+@Action(semantics = SemanticsOf.IDEMPOTENT)
+@ActionLayout(associateWith = "propertyLabelPositionNotSpecified", sequence = "1")
 @RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_updateVariantNotSpecified {
+public class PropertyLayoutLabelPositionPage_updateLabelPositionNotSpecified {
 
     private final PropertyLayoutLabelPositionPage page;
 
@@ -44,12 +33,10 @@ public class PropertyLayoutLabelPositionPage_updateVariantNotSpecified {
     @MemberSupport public PropertyLayoutLabelPositionPage act(
             @Parameter(optionality = Optionality.OPTIONAL)
             @ParameterLayout(
-                labelPosition = LabelPosition.NOT_SPECIFIED         // <.>
-                , describedAs =
-                    "@ParameterLayout(labelPosition = NotSpecified)"
+                    labelPosition = LabelPosition.NOT_SPECIFIED
             )
-            final String parameterLabelPositionNotSpecified) {
-        page.setPropertyLabelPositionNotSpecified(parameterLabelPositionNotSpecified);
+            final String newValue) {
+        page.setPropertyLabelPositionNotSpecified(newValue);
         return page;
     }
 //end::annotation[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_mixinPropertyWithMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionTop.java
similarity index 59%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_mixinPropertyWithMetaAnnotation.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionTop.java
index d69d9539bb..bce89bb761 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_mixinPropertyWithMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateLabelPositionTop.java
@@ -18,30 +18,30 @@
  */
 package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
 
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.PropertyLayout;
-
 import lombok.RequiredArgsConstructor;
 
-//tag::class[]
-@Property()
-@LabelPositionTopMetaAnnotation             // <.>
-@PropertyLayout(
-    describedAs =
-        "@LabelPositionTopMetaAnnotation",
-    fieldSetId = "meta-annotated", sequence = "2"
-)
+import org.apache.causeway.applib.annotation.*;
+
+@Action(semantics = SemanticsOf.IDEMPOTENT)
+@ActionLayout(associateWith = "propertyLabelPositionTop", sequence = "1")
 @RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_mixinPropertyWithMetaAnnotation {
-    // ...
-//end::class[]
+public class PropertyLayoutLabelPositionPage_updateLabelPositionTop {
 
     private final PropertyLayoutLabelPositionPage page;
 
-    public String prop() {
-        return page.getPropertyUsingAnnotation();
+//tag::annotation[]
+    @MemberSupport public PropertyLayoutLabelPositionPage act(
+            @Parameter(optionality = Optionality.OPTIONAL)
+            @ParameterLayout(
+                    labelPosition = LabelPosition.TOP
+            )
+            final String newValue) {
+        page.setPropertyLabelPositionTop(newValue);
+        return page;
+    }
+//end::annotation[]
+    @MemberSupport public String default0Act() {
+        return page.getPropertyLabelPositionTop();
     }
 
-//tag::class[]
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateWithParameterLayout.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateProperty.java
similarity index 72%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateWithParameterLayout.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateProperty.java
index 15e4b1c12d..d0d4d62553 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateWithParameterLayout.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateProperty.java
@@ -20,7 +20,6 @@ package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
-import org.apache.causeway.applib.annotation.LabelPosition;
 import org.apache.causeway.applib.annotation.MemberSupport;
 import org.apache.causeway.applib.annotation.Optionality;
 import org.apache.causeway.applib.annotation.Parameter;
@@ -29,32 +28,24 @@ import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    associateWith = "propertyUsingAnnotation"
-    , sequence = "1")
+@Action(semantics = SemanticsOf.IDEMPOTENT)
+@ActionLayout(associateWith = "property", sequence = "1")
 @RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_updateWithParameterLayout {
+public class PropertyLayoutLabelPositionPage_updateProperty {
 
     private final PropertyLayoutLabelPositionPage page;
 
 //tag::annotation[]
     @MemberSupport public PropertyLayoutLabelPositionPage act(
             @Parameter(optionality = Optionality.OPTIONAL)
-            @ParameterLayout(
-                labelPosition = LabelPosition.TOP           // <.>
-                , describedAs =
-                    "@ParameterLayout(labelPosition = TOP)"
-            )
-            final String parameterUsingAnnotation) {
-        page.setPropertyUsingAnnotation(parameterUsingAnnotation);
+            @ParameterLayout()
+            final String newValue) {
+        page.setProperty(newValue);
         return page;
     }
 //end::annotation[]
     @MemberSupport public String default0Act() {
-        return page.getPropertyUsingAnnotation();
+        return page.getProperty();
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantLeft.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantLeft.java
deleted file mode 100644
index 2d11cc81ee..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantLeft.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
-
-import org.apache.causeway.applib.annotation.Action;
-import org.apache.causeway.applib.annotation.ActionLayout;
-import org.apache.causeway.applib.annotation.LabelPosition;
-import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.Optionality;
-import org.apache.causeway.applib.annotation.Parameter;
-import org.apache.causeway.applib.annotation.ParameterLayout;
-import org.apache.causeway.applib.annotation.SemanticsOf;
-
-import lombok.RequiredArgsConstructor;
-
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    associateWith = "propertyLabelPositionLeft"
-    , sequence = "1")
-@RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_updateVariantLeft {
-
-    private final PropertyLayoutLabelPositionPage page;
-
-//tag::annotation[]
-    @MemberSupport public PropertyLayoutLabelPositionPage act(
-            @Parameter(optionality = Optionality.OPTIONAL)
-            @ParameterLayout(
-                labelPosition = LabelPosition.LEFT              // <.>
-                , describedAs =
-                    "@ParameterLayout(labelPosition = LEFT)"
-            )
-            final String parameterLabelPositionLeft) {
-        page.setPropertyLabelPositionLeft(parameterLabelPositionLeft);
-        return page;
-    }
-//end::annotation[]
-    @MemberSupport public String default0Act() {
-        return page.getPropertyLabelPositionLeft();
-    }
-
-}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantRight.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantRight.java
deleted file mode 100644
index 8eb5b58b96..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateVariantRight.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
-
-import org.apache.causeway.applib.annotation.Action;
-import org.apache.causeway.applib.annotation.ActionLayout;
-import org.apache.causeway.applib.annotation.LabelPosition;
-import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.Optionality;
-import org.apache.causeway.applib.annotation.Parameter;
-import org.apache.causeway.applib.annotation.ParameterLayout;
-import org.apache.causeway.applib.annotation.SemanticsOf;
-
-import lombok.RequiredArgsConstructor;
-
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    associateWith = "propertyLabelPositionRight"
-    , sequence = "1")
-@RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_updateVariantRight {
-
-    private final PropertyLayoutLabelPositionPage page;
-
-//tag::annotation[]
-    @MemberSupport public PropertyLayoutLabelPositionPage act(
-            @Parameter(optionality = Optionality.OPTIONAL)
-            @ParameterLayout(
-                labelPosition = LabelPosition.RIGHT              // <.>
-                , describedAs =
-                    "@ParameterLayout(labelPosition = RIGHT)"
-            )
-            final String parameterLabelPositionRight) {
-        page.setPropertyLabelPositionRight(parameterLabelPositionRight);
-        return page;
-    }
-//end::annotation[]
-    @MemberSupport public String default0Act() {
-        return page.getPropertyLabelPositionRight();
-    }
-
-}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateWithMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateWithMetaAnnotation.java
deleted file mode 100644
index ad907d6ff5..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateWithMetaAnnotation.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
-
-import org.apache.causeway.applib.annotation.Action;
-import org.apache.causeway.applib.annotation.ActionLayout;
-import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.Optionality;
-import org.apache.causeway.applib.annotation.Parameter;
-import org.apache.causeway.applib.annotation.ParameterLayout;
-import org.apache.causeway.applib.annotation.SemanticsOf;
-
-import lombok.RequiredArgsConstructor;
-
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    associateWith = "propertyUsingMetaAnnotation"
-    , sequence = "1")
-@RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_updateWithMetaAnnotation {
-
-    private final PropertyLayoutLabelPositionPage page;
-
-//tag::meta-annotation[]
-    @MemberSupport public PropertyLayoutLabelPositionPage act(
-            @Parameter(optionality = Optionality.OPTIONAL)
-            @LabelPositionTopMetaAnnotation                            // <.>
-            @ParameterLayout(
-                describedAs = "@LabelPositionTopMetaAnnotation"
-            )
-            final String parameterUsingMetaAnnotation) {
-        page.setPropertyUsingMetaAnnotation(parameterUsingMetaAnnotation);
-        return page;
-    }
-//end::meta-annotation[]
-    @MemberSupport public String default0Act() {
-        return page.getPropertyUsingMetaAnnotation();
-    }
-
-}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateWithMetaAnnotationOverridden.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateWithMetaAnnotationOverridden.java
deleted file mode 100644
index 7103b01eec..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionPage_updateWithMetaAnnotationOverridden.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.PropertyLayout.labelPosition;
-
-import org.apache.causeway.applib.annotation.Action;
-import org.apache.causeway.applib.annotation.ActionLayout;
-import org.apache.causeway.applib.annotation.LabelPosition;
-import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.Optionality;
-import org.apache.causeway.applib.annotation.Parameter;
-import org.apache.causeway.applib.annotation.ParameterLayout;
-import org.apache.causeway.applib.annotation.SemanticsOf;
-
-import lombok.RequiredArgsConstructor;
-
-@Action(
-    semantics = SemanticsOf.IDEMPOTENT
-)
-@ActionLayout(
-    associateWith = "propertyUsingMetaAnnotationButOverridden"
-    , sequence = "1")
-@RequiredArgsConstructor
-public class PropertyLayoutLabelPositionPage_updateWithMetaAnnotationOverridden {
-
-    private final PropertyLayoutLabelPositionPage page;
-
-//tag::meta-annotation-overridden[]
-    @MemberSupport public PropertyLayoutLabelPositionPage act(
-            @LabelPositionTopMetaAnnotation                             // <.>
-            @Parameter(optionality = Optionality.OPTIONAL)
-            @ParameterLayout(
-                labelPosition = LabelPosition.LEFT                      // <.>
-                , describedAs =
-                    "@LabelPositionTopMetaAnnotation @ParameterLayout(...)"
-            )
-            final String parameterUsingMetaAnnotationButOverridden) {
-        page.setPropertyUsingMetaAnnotationButOverridden(parameterUsingMetaAnnotationButOverridden);
-        return page;
-    }
-//end::meta-annotation-overridden[]
-    @MemberSupport public String default0Act() {
-        return page.getPropertyUsingMetaAnnotationButOverridden();
-    }
-
-}
diff --git a/examples/demo/domain/src/main/resources/application.yml b/examples/demo/domain/src/main/resources/application.yml
index 87d55189aa..8878910ae7 100644
--- a/examples/demo/domain/src/main/resources/application.yml
+++ b/examples/demo/domain/src/main/resources/application.yml
@@ -48,9 +48,9 @@ causeway:
         command-publishing: none
         execution-publishing: none
       property-layout:
-        label-position: LEFT
+        label-position: left
       parameter-layout:
-        label-position: LEFT
+        label-position: left
 
   core:
     meta-model: