You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2020/06/30 12:56:27 UTC

[isis] branch ISIS-2222 updated (bbe4454 -> 9578e35)

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

danhaywood pushed a change to branch ISIS-2222
in repository https://gitbox.apache.org/repos/asf/isis.git.


 discard bbe4454  ISIS-2222: wip
 discard 39dcfbf  ISIS-2222: wip
     add d85f81d  ISIS-2383: add CanVector<T> a mutable, but fixed size vector of Can<T>
     new d3afa9e  ISIS-2222: wip
     new 9578e35  ISIS-2222: wip

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (bbe4454)
            \
             N -- N -- N   refs/heads/ISIS-2222 (9578e35)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../isis/core/commons/collections/CanVector.java   | 88 ++++++++++++++++++++++
 .../core/commons/internal/primitives/_Ints.java    |  4 +
 2 files changed, 92 insertions(+)
 create mode 100644 core/commons/src/main/java/org/apache/isis/core/commons/collections/CanVector.java


[isis] 02/02: ISIS-2222: wip

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2222
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 9578e3507095be64d829c7fe0b4d92d9c257dc61
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Jun 30 13:55:54 2020 +0100

    ISIS-2222: wip
---
 .../demoapp/dom/ActionLayout/ActionLayoutMenu.java |  16 +-
 .../ActionLayoutPositionVm-description.adoc        |  10 +-
 .../position/ActionLayoutPositionVm.java           |  18 +-
 .../position/ActionLayoutPositionVm.layout.xml     |  20 +--
 .../ActionLayoutPositionVm_annotatedBelow.java     |   2 +-
 .../ActionLayoutPositionVm_annotatedPanel.java     |   2 +-
 ...ionLayoutPositionVm_annotatedPanelDropDown.java |   2 +-
 .../ActionLayoutPositionVm_annotatedRight.java     |   2 +-
 .../ActionLayoutPositionVm_layoutBelow.java        |   2 +-
 .../ActionLayoutPositionVm_layoutPanel.java        |   2 +-
 ...ActionLayoutPositionVm_layoutPanelDropDown.java |   2 +-
 .../ActionLayoutPositionVm_layoutRight.java        |   2 +-
 .../ActionLayoutPromptStyleVm-description.adoc     |  32 ++++
 .../ActionLayoutPromptStyleVm.java}                |  30 +++-
 .../ActionLayoutPromptStyleVm.layout.xml}          |  19 +-
 ...ActionLayoutPromptStyleVm_annotatedInline.java} |  11 +-
 ...ayoutPromptStyleVm_annotatedInlineAsIfEdit.java |   6 +-
 .../ActionLayoutPromptStyleVm_annotatedModal.java} |  11 +-
 ...ctionLayoutPromptStyleVm_annotatedSidebar.java} |  11 +-
 .../ActionLayoutPromptStyleVm_layoutDialog.java    |   7 +-
 .../ActionLayoutPromptStyleVm_layoutInline.java    |   7 +-
 ...onLayoutPromptStyleVm_layoutInlineAsIfEdit.java |   7 +-
 .../dom/PropertyLayout/PropertyLayoutMenu.java     | 199 +--------------------
 .../PropertyLayoutCssClassMetaAnnotation.java      |   9 +-
 .../PropertyLayoutCssClassVm-description.adoc      |  14 +-
 .../cssClass/PropertyLayoutCssClassVm.java         |   6 +-
 .../PropertyLayoutCssClassVm_annotatedMixin.java   |   6 +-
 .../named/PropertyLayoutNamedMetaAnnotation.java   |   4 +-
 .../named/PropertyLayoutNamedVm-description.adoc   |  12 ++
 .../PropertyLayoutNamedVm.java}                    |  24 +--
 .../named/PropertyLayoutNamedVm.layout.xml}        |  24 +--
 .../PropertyLayoutNamedVm_annotatedEscaped.java    |   6 +-
 .../src/main/java/demoapp/dom/menubars.layout.xml  |  16 ++
 .../booleans/vm/PrimitiveBooleanViewModel.java     |   2 +-
 .../primitive/bytes/vm/PrimitiveByteViewModel.java |   2 +-
 .../doubles/vm/PrimitiveDoubleViewModel.java       |   2 +-
 .../floats/vm/PrimitiveFloatViewModel.java         |   2 +-
 .../primitive/ints/vm/PrimitiveIntViewModel.java   |   2 +-
 .../primitive/longs/vm/PrimitiveLongViewModel.java |   2 +-
 .../shorts/vm/PrimitiveShortViewModel.java         |   2 +-
 .../characters/WrapperCharacters-description.adoc  |  14 +-
 ...rCharacterHolder_actionReturningCollection.java |   7 +-
 ...acterHolder_updateReadOnlyOptionalProperty.java |   1 -
 .../characters/vm/WrapperCharacterViewModel.java   |   3 +-
 .../StatefulViewModelJaxbRefsEntity.java           |   2 +-
 .../usingjaxb/StatefulViewModelUsingJaxb.java      |   4 +-
 46 files changed, 226 insertions(+), 360 deletions(-)

diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/ActionLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/ActionLayoutMenu.java
index a9afe95..cdcfd63 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/ActionLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/ActionLayoutMenu.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.PropertyLayout;
+package demoapp.dom.ActionLayout;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
@@ -26,19 +26,19 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
 
-@DomainService(nature=NatureOfService.VIEW, objectType = "demo.PropertyLayoutMenu")
-@DomainObjectLayout(named="PropertyLayout")
+@DomainService(nature=NatureOfService.VIEW, objectType = "demo.ActionLayoutMenu")
+@DomainObjectLayout(named="ActionLayout")
 @Log4j2
-public class PropertyLayoutMenu {
+public class ActionLayoutMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
-    public demoapp.dom.PropertyLayout.named.StringViewModel named(){
-        return new demoapp.dom.PropertyLayout.named.StringViewModel();
+    public demoapp.dom.ActionLayout.position.ActionLayoutPositionVm position(){
+        return new demoapp.dom.ActionLayout.position.ActionLayoutPositionVm();
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public demoapp.dom.PropertyLayout.cssClass.StringViewModel cssClass(){
-        return new demoapp.dom.PropertyLayout.cssClass.StringViewModel();
+    public demoapp.dom.ActionLayout.promptStyle.ActionLayoutPromptStyleVm promptStyle(){
+        return new demoapp.dom.ActionLayout.promptStyle.ActionLayoutPromptStyleVm();
     }
 
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm-description.adoc
index dcd19d1..aaba63d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm-description.adoc
@@ -2,33 +2,33 @@ TODO
 
 [source,java]
 ----
-include::StringViewModel.java[tags=class]
+include::ActionLayoutPositionVm.java[tags=class]
 ----
 
 * positioned _below_:
 +
 [source,java]
 ----
-include::StringViewModel_updatePositionBelow.java[tags=class]
+include::ActionLayoutPositionVm_annotatedBelow.java[tags=class]
 ----
 
 * positioned _right_:
 +
 [source,java]
 ----
-include::StringViewModel_updatePositionRight.java[tags=class]
+include::ActionLayoutPositionVm_annotatedRight.java[tags=class]
 ----
 
 * positioned on _panel_:
 +
 [source,java]
 ----
-include::StringViewModel_updatePositionPanel.java[tags=class]
+include::ActionLayoutPositionVm_annotatedPanel.java[tags=class]
 ----
 
 * positioned on _panel in drop-down_:
 +
 [source,java]
 ----
-include::StringViewModel_updatePositionPanelDropDown.java[tags=class]
+include::ActionLayoutPositionVm_annotatedPanelDropDown.java[tags=class]
 ----
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java
index d3d1229..271d788 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java
@@ -38,27 +38,19 @@ import lombok.Setter;
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 
 //tag::class[]
-@XmlRootElement(name = "rootx")
+@XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
         nature=Nature.VIEW_MODEL,
-        objectType = "demo.ActionLayout.position.StringViewModel"
+        objectType = "demo.ActionLayoutPositionVm"
 )
-public class StringViewModel implements HasAsciiDocDescription {
+public class ActionLayoutPositionVm implements HasAsciiDocDescription {
 
-//end::class[]
-    public StringViewModel() {
-        this.title = "ActionLayout#position";
+    public String title() {
+        return "Demonstrates: ActionLayout#position";
     }
 
-//tag::class[]
-    @Title(prepend = "Demonstrates: ")
-    @Property(editing = Editing.DISABLED)
-    @XmlElement(required = true)
-    @Getter @Setter
-    private String title;
-
     @Property(optionality = Optionality.OPTIONAL)
     @MemberOrder(name = "annotated", sequence = "1")
     @XmlElement(required = false)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml
index b1cf2ab..8580ed6 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml
@@ -20,18 +20,18 @@
 			<cpt:fieldSet name="General" id="general"/>
 			<cpt:fieldSet name="Annotated" id="annotated"/>
 			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:action id="layoutPanel" position="PANEL">
+					<cpt:named>Positioned on panel</cpt:named>
+				</cpt:action>
+				<cpt:action id="layoutPanelDropDown" position="PANEL_DROPDOWN">
+					<cpt:named>Positioned on panel in drop down</cpt:named>
+				</cpt:action>
 				<cpt:property id="readOnlyProperty2">
-					<cpt:action id="update2PositionBelow" position="BELOW">
-						<cpt:named>Below</cpt:named>
+					<cpt:action id="layoutBelow" position="BELOW">
+						<cpt:named>Positioned below</cpt:named>
 					</cpt:action>
-					<cpt:action id="update2PositionPanel" position="PANEL">
-						<cpt:named>Panel</cpt:named>
-					</cpt:action>
-					<cpt:action id="update2PositionPanelDropDown" position="PANEL_DROPDOWN">
-						<cpt:named>Panel Drop Down</cpt:named>
-					</cpt:action>
-					<cpt:action id="update2PositionPanelDropDown" position="RIGHT">
-						<cpt:named>Right</cpt:named>
+					<cpt:action id="layoutRight" position="RIGHT">
+						<cpt:named>Positioned right</cpt:named>
 					</cpt:action>
 				</cpt:property>
 			</cpt:fieldSet>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java
index 6839b4e..4bcfe26 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java
@@ -33,7 +33,7 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(position = ActionLayout.Position.BELOW, named = "Positioned below", describedAs = "position = BELOW")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update1PositionBelow {
+public class ActionLayoutPositionVm_annotatedBelow {
 
     private final ActionLayoutPositionVm stringViewModel;
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java
index 0d601a6..0ce7e77 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java
@@ -33,7 +33,7 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(position = ActionLayout.Position.PANEL, named = "Positioned on panel", describedAs = "position = PANEL")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update1PositionPanel {
+public class ActionLayoutPositionVm_annotatedPanel {
 
     private final ActionLayoutPositionVm stringViewModel;
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java
index 966384f..256f986 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java
@@ -33,7 +33,7 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(position = ActionLayout.Position.PANEL_DROPDOWN, named = "Positioned on panel in dropdown", describedAs = "position = PANEL_DROPDOWN")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update1PositionPanelDropDown {
+public class ActionLayoutPositionVm_annotatedPanelDropDown {
 
     private final ActionLayoutPositionVm stringViewModel;
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedRight.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedRight.java
index 7bf853a..ba2854c 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedRight.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedRight.java
@@ -33,7 +33,7 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(position = ActionLayout.Position.RIGHT, named = "Positioned right", describedAs = "position = RIGHT")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update1PositionRight {
+public class ActionLayoutPositionVm_annotatedRight {
 
     private final ActionLayoutPositionVm stringViewModel;
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutBelow.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutBelow.java
index 7236418..f020383 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutBelow.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutBelow.java
@@ -33,7 +33,7 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(named = "Positioned below", describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" position=BELOW/></cpt:property>")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update2PositionBelow {
+public class ActionLayoutPositionVm_layoutBelow {
 
     private final ActionLayoutPositionVm stringViewModel;
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanel.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanel.java
index 8ef3902..b2c0ae0 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanel.java
@@ -33,7 +33,7 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(named = "Positioned on panel", describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" position=PANEL/></cpt:property>")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update2PositionPanel {
+public class ActionLayoutPositionVm_layoutPanel {
 
     private final ActionLayoutPositionVm stringViewModel;
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanelDropDown.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanelDropDown.java
index 1166302..120fe41 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanelDropDown.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanelDropDown.java
@@ -33,7 +33,7 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(named = "Positioned on panel dropdown", describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" position=PANEL_DROPDOWN/></cpt:property>")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update2PositionPanelDropDown {
+public class ActionLayoutPositionVm_layoutPanelDropDown {
 
     private final ActionLayoutPositionVm stringViewModel;
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutRight.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutRight.java
index 1907e19..71c2d2b 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutRight.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutRight.java
@@ -33,7 +33,7 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(named = "Positioned right", describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" position=RIGHT/></cpt:property>")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update2PositionRight {
+public class ActionLayoutPositionVm_layoutRight {
 
     private final ActionLayoutPositionVm stringViewModel;
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm-description.adoc
new file mode 100644
index 0000000..4f56ddf
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm-description.adoc
@@ -0,0 +1,32 @@
+TODO
+
+[source,java]
+----
+include::ActionLayoutPromptStyleVm.java[tags=class]
+----
+
+* `promptStyle` of _inline_:
++
+[source,java]
+----
+include::ActionLayoutPromptStyleVm_annotatedInline.java[tags=class]
+----
+
+* `promptStyle` of _sidebar_:
++
+[source,java]
+----
+include::ActionLayoutPromptStyleVm_annotatedSidebar.java[tags=class]
+----
+
+* `promptStyle` of _modal_:
++
+[source,java]
+----
+include::ActionLayoutPromptStyleVm_annotatedModal.java[tags=class]
+----
+
+[source,java]
+----
+include::ActionLayoutPromptStyleVm_annotatedInlineAsIfEdit.java[tags=class]
+----
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm.java
similarity index 69%
copy from examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm.java
index d3d1229..5d9ece0 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.ActionLayout.position;
+package demoapp.dom.ActionLayout.promptStyle;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -30,6 +30,7 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Title;
 
 import lombok.Getter;
@@ -38,23 +39,24 @@ import lombok.Setter;
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 
 //tag::class[]
-@XmlRootElement(name = "rootx")
+@XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
         nature=Nature.VIEW_MODEL,
-        objectType = "demo.ActionLayout.position.StringViewModel"
+        objectType = "demo.ActionLayoutPromptStyleVm"
 )
-public class StringViewModel implements HasAsciiDocDescription {
+public class ActionLayoutPromptStyleVm implements HasAsciiDocDescription {
 
 //end::class[]
-    public StringViewModel() {
-        this.title = "ActionLayout#position";
+    public ActionLayoutPromptStyleVm() {
+        this.title = "ActionLayout#promptStyle";
     }
 
 //tag::class[]
     @Title(prepend = "Demonstrates: ")
     @Property(editing = Editing.DISABLED)
+    @MemberOrder(name = "general", sequence = "1")
     @XmlElement(required = true)
     @Getter @Setter
     private String title;
@@ -66,10 +68,24 @@ public class StringViewModel implements HasAsciiDocDescription {
     private String readOnlyProperty1;
 
     @Property(optionality = Optionality.OPTIONAL)
-    @MemberOrder(name = "layout", sequence = "1")
+    @PropertyLayout(describedAs = "has associated action with promptStyle=INLINE_AS_IF_EDIT")
+    @MemberOrder(name = "annotated", sequence = "2")
     @XmlElement(required = false)
     @Getter @Setter
     private String readOnlyProperty2;
 
+    @Property(optionality = Optionality.OPTIONAL)
+    @MemberOrder(name = "layout", sequence = "1")
+    @XmlElement(required = false)
+    @Getter @Setter
+    private String readOnlyProperty3;
+
+    @Property(optionality = Optionality.OPTIONAL)
+    @PropertyLayout(describedAs = "has associated action with promptStyle=INLINE_AS_IF_EDIT")
+    @MemberOrder(name = "layout", sequence = "2")
+    @XmlElement(required = false)
+    @Getter @Setter
+    private String readOnlyProperty4;
+
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm.layout.xml
similarity index 78%
copy from examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm.layout.xml
index b1cf2ab..c9cadf5 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm.layout.xml
@@ -20,20 +20,17 @@
 			<cpt:fieldSet name="General" id="general"/>
 			<cpt:fieldSet name="Annotated" id="annotated"/>
 			<cpt:fieldSet name="Layout" id="layout">
-				<cpt:property id="readOnlyProperty2">
-					<cpt:action id="update2PositionBelow" position="BELOW">
-						<cpt:named>Below</cpt:named>
+				<cpt:property id="readOnlyProperty3">
+					<cpt:action id="layoutInline" promptStyle="INLINE">
+						<cpt:named>Inline</cpt:named>
 					</cpt:action>
-					<cpt:action id="update2PositionPanel" position="PANEL">
-						<cpt:named>Panel</cpt:named>
-					</cpt:action>
-					<cpt:action id="update2PositionPanelDropDown" position="PANEL_DROPDOWN">
-						<cpt:named>Panel Drop Down</cpt:named>
-					</cpt:action>
-					<cpt:action id="update2PositionPanelDropDown" position="RIGHT">
-						<cpt:named>Right</cpt:named>
+					<cpt:action id="layoutDialog" promptStyle="DIALOG">
+						<cpt:named>Dialog</cpt:named>
 					</cpt:action>
 				</cpt:property>
+				<cpt:property id="readOnlyProperty4">
+					<cpt:action id="layoutInlineAsIfEdit" promptStyle="INLINE_AS_IF_EDIT"/>
+				</cpt:property>
 			</cpt:fieldSet>
 			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
 		</bs3:col>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInline.java
similarity index 78%
copy from examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInline.java
index 6839b4e..ac2c3f1 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInline.java
@@ -16,10 +16,11 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.ActionLayout.position;
+package demoapp.dom.ActionLayout.promptStyle;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
@@ -31,13 +32,13 @@ import lombok.RequiredArgsConstructor;
         associateWith = "readOnlyProperty1",
         associateWithSequence = "1"
 )
-@ActionLayout(position = ActionLayout.Position.BELOW, named = "Positioned below", describedAs = "position = BELOW")
+@ActionLayout(promptStyle = PromptStyle.INLINE, named = "Inline", describedAs = "promptStyle = INLINE")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update1PositionBelow {
+public class ActionLayoutPromptStyleVm_annotatedInline {
 
-    private final ActionLayoutPositionVm stringViewModel;
+    private final ActionLayoutPromptStyleVm stringViewModel;
 
-    public ActionLayoutPositionVm act(String newValue) {
+    public ActionLayoutPromptStyleVm act(String newValue) {
         stringViewModel.setReadOnlyProperty1(newValue);
         return stringViewModel;
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInlineAsIfEdit.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInlineAsIfEdit.java
index 48ae1a7..b696cbe 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInlineAsIfEdit.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInlineAsIfEdit.java
@@ -34,11 +34,11 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(promptStyle = PromptStyle.INLINE_AS_IF_EDIT, named = "Inline as if edit", describedAs = "promptStyle = INLINE_AS_IF_EDIT")
 @RequiredArgsConstructor
-public class StringViewModel_update2PromptStyleInlineAsIfEdit {
+public class ActionLayoutPromptStyleVm_annotatedInlineAsIfEdit {
 
-    private final StringViewModel stringViewModel;
+    private final ActionLayoutPromptStyleVm stringViewModel;
 
-    public StringViewModel act(String newValue) {
+    public ActionLayoutPromptStyleVm act(String newValue) {
         stringViewModel.setReadOnlyProperty2(newValue);
         return stringViewModel;
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedModal.java
similarity index 78%
copy from examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedModal.java
index 0d601a6..76f2b3d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedModal.java
@@ -16,10 +16,11 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.ActionLayout.position;
+package demoapp.dom.ActionLayout.promptStyle;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
@@ -31,13 +32,13 @@ import lombok.RequiredArgsConstructor;
         associateWith = "readOnlyProperty1",
         associateWithSequence = "2"
 )
-@ActionLayout(position = ActionLayout.Position.PANEL, named = "Positioned on panel", describedAs = "position = PANEL")
+@ActionLayout(promptStyle = PromptStyle.DIALOG_MODAL, named = "Modal", describedAs = "promptStyle = MODAL")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update1PositionPanel {
+public class ActionLayoutPromptStyleVm_annotatedModal {
 
-    private final ActionLayoutPositionVm stringViewModel;
+    private final ActionLayoutPromptStyleVm stringViewModel;
 
-    public ActionLayoutPositionVm act(String newValue) {
+    public ActionLayoutPromptStyleVm act(String newValue) {
         stringViewModel.setReadOnlyProperty1(newValue);
         return stringViewModel;
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedSidebar.java
similarity index 77%
copy from examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedSidebar.java
index 966384f..9c60d9e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedSidebar.java
@@ -16,10 +16,11 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.ActionLayout.position;
+package demoapp.dom.ActionLayout.promptStyle;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
@@ -31,13 +32,13 @@ import lombok.RequiredArgsConstructor;
         associateWith = "readOnlyProperty1",
         associateWithSequence = "3"
 )
-@ActionLayout(position = ActionLayout.Position.PANEL_DROPDOWN, named = "Positioned on panel in dropdown", describedAs = "position = PANEL_DROPDOWN")
+@ActionLayout(promptStyle = PromptStyle.DIALOG_SIDEBAR, named = "sidebar", describedAs = "promptStyle = DIALOG_SIDEBAR")
 @RequiredArgsConstructor
-public class ActionLayoutPromptVm_update1PositionPanelDropDown {
+public class ActionLayoutPromptStyleVm_annotatedSidebar {
 
-    private final ActionLayoutPositionVm stringViewModel;
+    private final ActionLayoutPromptStyleVm stringViewModel;
 
-    public ActionLayoutPositionVm act(String newValue) {
+    public ActionLayoutPromptStyleVm act(String newValue) {
         stringViewModel.setReadOnlyProperty1(newValue);
         return stringViewModel;
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutDialog.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutDialog.java
index 4580059..c6eb259 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutDialog.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutDialog.java
@@ -20,7 +20,6 @@ package demoapp.dom.ActionLayout.promptStyle;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
@@ -34,11 +33,11 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" promptStyle = DIALOG/></cpt:property>")
 @RequiredArgsConstructor
-public class StringViewModel_update3PromptStyleDialog {
+public class ActionLayoutPromptStyleVm_layoutDialog {
 
-    private final StringViewModel stringViewModel;
+    private final ActionLayoutPromptStyleVm stringViewModel;
 
-    public StringViewModel act(String newValue) {
+    public ActionLayoutPromptStyleVm act(String newValue) {
         stringViewModel.setReadOnlyProperty3(newValue);
         return stringViewModel;
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInline.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInline.java
index 8199cdd..c440aea 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInline.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInline.java
@@ -20,7 +20,6 @@ package demoapp.dom.ActionLayout.promptStyle;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
@@ -34,11 +33,11 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" promptStyle = INLINE/></cpt:property>")
 @RequiredArgsConstructor
-public class StringViewModel_update3PromptStyleInline {
+public class ActionLayoutPromptStyleVm_layoutInline {
 
-    private final StringViewModel stringViewModel;
+    private final ActionLayoutPromptStyleVm stringViewModel;
 
-    public StringViewModel act(String newValue) {
+    public ActionLayoutPromptStyleVm act(String newValue) {
         stringViewModel.setReadOnlyProperty3(newValue);
         return stringViewModel;
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInlineAsIfEdit.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInlineAsIfEdit.java
index 1cc012c..69a4def 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInlineAsIfEdit.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInlineAsIfEdit.java
@@ -20,7 +20,6 @@ package demoapp.dom.ActionLayout.promptStyle;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
@@ -34,11 +33,11 @@ import lombok.RequiredArgsConstructor;
 )
 @ActionLayout(describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" promptStyle = INLINE_AS_IF_EDIT/></cpt:property>")
 @RequiredArgsConstructor
-public class StringViewModel_update4PromptStyleInlineAsIfEdit {
+public class ActionLayoutPromptStyleVm_layoutInlineAsIfEdit {
 
-    private final StringViewModel stringViewModel;
+    private final ActionLayoutPromptStyleVm stringViewModel;
 
-    public StringViewModel act(String newValue) {
+    public ActionLayoutPromptStyleVm act(String newValue) {
         stringViewModel.setReadOnlyProperty4(newValue);
         return stringViewModel;
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/PropertyLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/PropertyLayoutMenu.java
index 28ec7ad..87e52b1 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/PropertyLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/PropertyLayoutMenu.java
@@ -16,212 +16,29 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types;
-
-import java.nio.charset.StandardCharsets;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.OffsetDateTime;
-import java.util.Date;
-import java.util.UUID;
-
-import javax.inject.Inject;
+package demoapp.dom.PropertyLayout;
 
 import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.factory.FactoryService;
-import org.apache.isis.applib.value.Blob;
-import org.apache.isis.applib.value.Clob;
-import org.apache.isis.applib.value.Markup;
-import org.apache.isis.applib.value.NamedWithMimeType;
-import org.apache.isis.core.commons.internal.base._Bytes;
-import org.apache.isis.core.commons.internal.base._Strings;
-import org.apache.isis.core.commons.internal.resources._Resources;
-
-import lombok.val;
 
 import lombok.extern.log4j.Log4j2;
 
-import demoapp.dom.types.blob.BlobDemo;
-import demoapp.dom.types.clob.ClobDemo;
-import demoapp.dom.types.markup.MarkupDemo;
-import demoapp.dom.types.wrapper.WrapperDemo;
-import demoapp.dom.types.primitive.booleans.PrimitiveBooleans;
-import demoapp.dom.types.primitive.bytes.PrimitiveBytes;
-import demoapp.dom.types.primitive.chars.PrimitiveChars;
-import demoapp.dom.types.primitive.doubles.PrimitiveDoubles;
-import demoapp.dom.types.primitive.floats.PrimitiveFloats;
-import demoapp.dom.types.primitive.ints.PrimitiveInts;
-import demoapp.dom.types.primitive.longs.PrimitiveLongs;
-import demoapp.dom.types.primitive.shorts.PrimitiveShorts;
-import demoapp.dom.types.text.TextDemo;
-import demoapp.dom.types.time.TemporalDemo;
-import demoapp.dom.types.uuid.UuidDemo;
-import demoapp.dom.types.wrapper.characters.WrapperCharacters;
-
-@DomainService(nature=NatureOfService.VIEW, objectType = "demo.DataTypesMenu")
-@DomainObjectLayout(named="DataTypes")
+@DomainService(nature=NatureOfService.VIEW, objectType = "demo.PropertyLayoutMenu")
+@DomainObjectLayout(named="PropertyLayout")
 @Log4j2
-public class DataTypesMenu {
-
-    @Inject private FactoryService factoryService;
-
-    @Action
-    @ActionLayout(cssClassFa="fa-font")
-    public TextDemo text(){
-        val demo = factoryService.viewModel(TextDemo.class);
-
-        demo.setString("a string (click me)");
-        demo.setStringMultiline("A multiline string\nspanning\n3 lines. (click me)");
-
-        demo.setStringReadonly("a readonly string (but allows text select)");
-        demo.setStringMultilineReadonly("A readonly string\nspanning\n3 lines. (but allows text select)");
-
-        return demo;
-    }
-    
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-hashtag")
-    public WrapperDemo wrappers(){
-        val demo = factoryService.viewModel(WrapperDemo.class);
-
-        demo.setJavaLangByte(Byte.MAX_VALUE);
-        demo.setJavaLangShort(Short.MAX_VALUE);
-        demo.setJavaLangInteger(Integer.MAX_VALUE);
-        demo.setJavaLangLong(Long.MAX_VALUE);
-
-        demo.setJavaLangFloat(Float.MAX_VALUE);
-        demo.setJavaLangDouble(Double.MAX_VALUE);
-
-        return demo;
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-clock")
-    public TemporalDemo temporals(){
-        val demo = factoryService.viewModel(TemporalDemo.class);
-
-        demo.setJavaUtilDate(new Date());
-        demo.setJavaSqlDate( new java.sql.Date(System.currentTimeMillis()));
-        demo.setJavaSqlTimestamp(new java.sql.Timestamp(System.currentTimeMillis()));
-
-        demo.setJavaLocalDate(LocalDate.now());
-        demo.setJavaLocalDateTime(LocalDateTime.now());
-        demo.setJavaOffsetDateTime(OffsetDateTime.now());
-
-        return demo;
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-at")
-    public UuidDemo uuid(){
-        val demo = factoryService.viewModel(UuidDemo.class);
-        demo.setUuid(UUID.randomUUID());
-        return demo;
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-cloud")
-    public BlobDemo blobs(){
-        val demo = factoryService.viewModel(BlobDemo.class);
-
-        try {
-            val bytes = _Bytes.of(_Resources.load(BlobDemo.class, "isis-logo-568x286.png"));
-            demo.setLogo(Blob.of("isis-logo-568x286", NamedWithMimeType.CommonMimeType.PNG, bytes));
-        } catch (Exception e) {
-            log.error("failed to create Blob from image resource", e);
-        }
-
-        return demo;
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-cloud")
-    public ClobDemo clobs(){
-        val demo = factoryService.viewModel(ClobDemo.class);
-
-        try {
-            val text = _Strings.read(_Resources.load(ClobDemo.class, "document.txt"), StandardCharsets.UTF_8);
-            demo.setDocument(Clob.of("document", NamedWithMimeType.CommonMimeType.TXT, text));
-        } catch (Exception e) {
-            log.error("failed to create Clob from text resource", e);
-        }
-
-        return demo;
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-code")
-    public MarkupDemo markup(){
-        val demo = factoryService.viewModel(MarkupDemo.class);
-
-        try {
-            val htmlSource = _Strings.read(_Resources.load(MarkupDemo.class, "markup-embedded.html"), StandardCharsets.UTF_8);
-            demo.setMarkup(new Markup(htmlSource));
-        } catch (Exception e) {
-            log.error("failed to create Markup from file resource", e);
-        }
-
-        return demo;
-    }
-
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-hashtag")
-    public PrimitiveBytes primitiveBytes(){
-        return new PrimitiveBytes();
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-hashtag")
-    public PrimitiveShorts primitiveShorts(){
-        return new PrimitiveShorts();
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-hashtag")
-    public PrimitiveInts primitiveInts(){
-        return new PrimitiveInts();
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-hashtag")
-    public PrimitiveLongs primitiveLongs(){
-        return new PrimitiveLongs();
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-hashtag")
-    public PrimitiveFloats primitiveFloats(){
-        return new PrimitiveFloats();
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-hashtag")
-    public PrimitiveDoubles primitiveDoubles(){
-        return new PrimitiveDoubles();
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-hashtag")
-    public PrimitiveChars primitiveChars(){
-        return new PrimitiveChars();
-    }
+public class PropertyLayoutMenu {
 
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-hashtag")
-    public PrimitiveBooleans primitiveBooleans(){
-        return new PrimitiveBooleans();
+    public demoapp.dom.PropertyLayout.named.PropertyLayoutNamedVm named(){
+        return new demoapp.dom.PropertyLayout.named.PropertyLayoutNamedVm();
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-hashtag")
-    public WrapperCharacters wrapperCharacters(){
-        return new WrapperCharacters();
+    public demoapp.dom.PropertyLayout.cssClass.PropertyLayoutCssClassVm cssClass(){
+        return new demoapp.dom.PropertyLayout.cssClass.PropertyLayoutCssClassVm();
     }
 
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassMetaAnnotation.java
index faba439..e9f996c 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassMetaAnnotation.java
@@ -1,4 +1,4 @@
-package demoapp.dom.PropertyLayout.named;
+package demoapp.dom.PropertyLayout.cssClass;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Inherited;
@@ -6,13 +6,14 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 
-@PropertyLayout(named = "Named <i>from</i> custom type", namedEscaped = false)
+//tag::class[]
+@PropertyLayout(cssClass = "red")
 @Inherited
 @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
-public @interface PropertyLayoutNamedMetaAnnotation {
+public @interface PropertyLayoutCssClassMetaAnnotation {
 
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm-description.adoc
index 9169f74..d40bbd9 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm-description.adoc
@@ -1,13 +1,11 @@
-JAXB supports `Character` out-of-the-box, so no special annotations are required.
+TODO
 
 [source,java]
 ----
-include::WrapperCharacterViewModel.java[tags=class]
+include::PropertyLayoutCssClassVm.java[tags=class]
 ----
-<.> a no-arg constructor is required by JAXB
-<.> required property as defined to JAXB
-<.> directly editable property as defined to Apache Isis
-<.> optional property as defined to Apache Isis.
-+
-This is the default for JAXB so no additional annotation required.
 
+[source,java]
+----
+include::PropertyLayoutCssClassMetaAnnotation.java[tags=class]
+----
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java
index 58ee3cb..6258484 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java
@@ -46,12 +46,12 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
         nature=Nature.VIEW_MODEL,
-        objectType = "demo.PropertyLayout.cssClass.ActionLayoutPromptStyleVm"
+        objectType = "demo.PropertyLayoutCssClassVm"
 )
-public class StringViewModel implements HasAsciiDocDescription {
+public class PropertyLayoutCssClassVm implements HasAsciiDocDescription {
 
 //end::class[]
-    public StringViewModel() {
+    public PropertyLayoutCssClassVm() {
         this.title = "PropertyLayout#cssClass";
     }
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm_annotatedMixin.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm_annotatedMixin.java
index ccfa09f..3066378 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm_annotatedMixin.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm_annotatedMixin.java
@@ -29,13 +29,13 @@ import lombok.RequiredArgsConstructor;
 @Property()
 @PropertyLayout(cssClass = "red", describedAs = "cssClass = \"red\" ", hidden = Where.ALL_TABLES)
 @RequiredArgsConstructor
-public class StringViewModel_mixinPropertyWithCssClass {
+public class PropertyLayoutCssClassVm_annotatedMixin {
 
-    private final StringViewModel stringViewModel;
+    private final PropertyLayoutCssClassVm propertyLayoutCssClassVm;
 
     @MemberOrder(name = "contributed", sequence = "1")
     public String prop() {
-        return stringViewModel.getPropertyUsingAnnotation();
+        return propertyLayoutCssClassVm.getPropertyUsingAnnotation();
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedMetaAnnotation.java
index 6c3a315..97d0fb1 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedMetaAnnotation.java
@@ -9,10 +9,12 @@ import java.lang.annotation.Target;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 
+//tag::class[]
 @PropertyLayout(named = "Named <i>from</i> custom type", namedEscaped = false)
 @Inherited
 @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
-public @interface PropertyLayoutNamedCustomType {
+public @interface PropertyLayoutNamedMetaAnnotation {
 
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm-description.adoc
new file mode 100644
index 0000000..6ebf612
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm-description.adoc
@@ -0,0 +1,12 @@
+TODO
+
+[source,java]
+----
+include::PropertyLayoutNamedVm.java[tags=class]
+----
+
+[source,java]
+----
+include::PropertyLayoutNamedMetaAnnotation.java[tags=class]
+----
+
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm.java
similarity index 76%
copy from examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java
copy to examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm.java
index 58ee3cb..9450e6e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.PropertyLayout.cssClass;
+package demoapp.dom.PropertyLayout.named;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -37,7 +37,6 @@ import org.apache.isis.applib.annotation.Where;
 import lombok.Getter;
 import lombok.Setter;
 
-import demoapp.dom.PropertyLayout.named.PropertyLayoutNamedMetaAnnotation;
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 
 //tag::class[]
@@ -46,13 +45,14 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
         nature=Nature.VIEW_MODEL,
-        objectType = "demo.PropertyLayout.cssClass.ActionLayoutPromptStyleVm"
+        objectType = "demo.PropertyLayoutNamedVm"
 )
-public class StringViewModel implements HasAsciiDocDescription {
+public class PropertyLayoutNamedVm
+        implements HasAsciiDocDescription {
 
 //end::class[]
-    public StringViewModel() {
-        this.title = "PropertyLayout#cssClass";
+    public PropertyLayoutNamedVm() {
+        this.title = "PropertyLayout#named";
     }
 
 //tag::class[]
@@ -63,30 +63,30 @@ public class StringViewModel implements HasAsciiDocDescription {
     private String title;
 
     @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayout(cssClass = "red", describedAs = "@PropertyLayout(cssClass=\"red\")", hidden = Where.ALL_TABLES)
+    @PropertyLayout(named = "Named using annotation", describedAs = "@PropertyLayout(named= \"Named using annotation\")", hidden = Where.ALL_TABLES)
     @MemberOrder(name = "properties", sequence = "1")
     @XmlElement(required = false)
     @Getter @Setter
     private String propertyUsingAnnotation;
 
     @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayout(describedAs = "<cpt:property id=\"...\" cssClass=\"red\")/>", hidden = Where.ALL_TABLES)
+    @PropertyLayout(describedAs = "<cpt:property id=\"...\"><cpt:named>...</cpt:named></cpt:property>", hidden = Where.ALL_TABLES)
     @MemberOrder(name = "properties", sequence = "2")
     @XmlElement(required = false)
     @Getter @Setter
     private String propertyUsingLayout;
 
     @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayoutCssClassMetaAnnotation
-    @PropertyLayout(describedAs = "@PropertyLayoutCssClassMetaAnnotation", hidden = Where.ALL_TABLES)
+    @PropertyLayoutNamedMetaAnnotation
+    @PropertyLayout(describedAs = "@PropertyLayoutNamedMetaAnnotation", hidden = Where.ALL_TABLES)
     @MemberOrder(name = "meta-annotated", sequence = "1")
     @XmlElement(required = false)
     @Getter @Setter
     private String propertyUsingMetaAnnotation;
 
     @Property(optionality = Optionality.OPTIONAL)
-    @PropertyLayoutCssClassMetaAnnotation
-    @PropertyLayout(cssClass = "blue", describedAs = "meta-annotation overridden using @PropertyLayout(...)", hidden = Where.ALL_TABLES)
+    @PropertyLayoutNamedMetaAnnotation
+    @PropertyLayout(named = "Name overrides meta-annotation", describedAs = "meta-annotation overridden using @PropertyLayout(...)", hidden = Where.ALL_TABLES)
     @MemberOrder(name = "meta-annotated", sequence = "2")
     @XmlElement(required = false)
     @Getter @Setter
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm.layout.xml
similarity index 70%
copy from examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml
copy to examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm.layout.xml
index b1cf2ab..bc67d4f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm.layout.xml
@@ -17,24 +17,16 @@
 
 	<bs3:row>
 		<bs3:col span="6">
-			<cpt:fieldSet name="General" id="general"/>
-			<cpt:fieldSet name="Annotated" id="annotated"/>
-			<cpt:fieldSet name="Layout" id="layout">
-				<cpt:property id="readOnlyProperty2">
-					<cpt:action id="update2PositionBelow" position="BELOW">
-						<cpt:named>Below</cpt:named>
-					</cpt:action>
-					<cpt:action id="update2PositionPanel" position="PANEL">
-						<cpt:named>Panel</cpt:named>
-					</cpt:action>
-					<cpt:action id="update2PositionPanelDropDown" position="PANEL_DROPDOWN">
-						<cpt:named>Panel Drop Down</cpt:named>
-					</cpt:action>
-					<cpt:action id="update2PositionPanelDropDown" position="RIGHT">
-						<cpt:named>Right</cpt:named>
-					</cpt:action>
+			<cpt:fieldSet name="General" id="general">
+				<cpt:property id="title" />
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Properties" id="properties">
+				<cpt:property id="namedUsingLayoutProperty">
+					<cpt:named>Named using layout.xml</cpt:named>
 				</cpt:property>
 			</cpt:fieldSet>
+			<cpt:fieldSet name="Contributed" id="contributed"/>
+			<cpt:fieldSet name="Meta-annotated" id="meta-annotated"/>
 			<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/PropertyLayout/named/PropertyLayoutNamedVm_annotatedEscaped.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm_annotatedEscaped.java
index d1ee3ee..43a78eb 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm_annotatedEscaped.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm_annotatedEscaped.java
@@ -28,13 +28,13 @@ import lombok.RequiredArgsConstructor;
 @Property()
 @PropertyLayout(named = "<i>Named<i/> escaped mixin property", namedEscaped = true, describedAs = "named = \"(some markup)\", namedEscaped = true")
 @RequiredArgsConstructor
-public class StringViewModel_mixinAnnotatedNamedEscaped {
+public class PropertyLayoutNamedVm_annotatedEscaped {
 
-    private final StringViewModel stringViewModel;
+    private final PropertyLayoutNamedVm propertyLayoutNamedVm;
 
     @MemberOrder(name = "contributed", sequence = "4")
     public String prop() {
-        return stringViewModel.getPropertyUsingAnnotation();
+        return propertyLayoutNamedVm.getPropertyUsingAnnotation();
     }
 
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
index b6699b8..18f6a9a 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
@@ -50,6 +50,22 @@
         </mb3:menu>
 
         <mb3:menu>
+            <mb3:named>ActionLayout</mb3:named>
+            <mb3:section>
+                <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="position"/>
+                <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="promptStyle"/>
+            </mb3:section>
+        </mb3:menu>
+
+        <mb3:menu>
+            <mb3:named>PropertyLayout</mb3:named>
+            <mb3:section>
+                <mb3:serviceAction objectType="demo.PropertyLayoutMenu" id="named"/>
+                <mb3:serviceAction objectType="demo.PropertyLayoutMenu" id="cssClass"/>
+            </mb3:section>
+        </mb3:menu>
+
+        <mb3:menu>
             <mb3:named>Tooltips</mb3:named>
             <mb3:section>
                 <mb3:serviceAction objectType="demo.TooltipMenu" id="tooltipDemo"/>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/vm/PrimitiveBooleanViewModel.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/vm/PrimitiveBooleanViewModel.java
index c619d23..c6d1ecb 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/vm/PrimitiveBooleanViewModel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/vm/PrimitiveBooleanViewModel.java
@@ -38,7 +38,7 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom.types.primitive.booleans.holder.PrimitiveBooleanHolder;
 
 //tag::class[]
-@XmlRootElement(name = "demo.PrimitiveBooleanViewModel")
+@XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/vm/PrimitiveByteViewModel.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/vm/PrimitiveByteViewModel.java
index 7110711..50b198e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/vm/PrimitiveByteViewModel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/vm/PrimitiveByteViewModel.java
@@ -38,7 +38,7 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom.types.primitive.bytes.holder.PrimitiveByteHolder;
 
 //tag::class[]
-@XmlRootElement(name = "demo.PrimitiveByteViewModel")
+@XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/vm/PrimitiveDoubleViewModel.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/vm/PrimitiveDoubleViewModel.java
index 2870c45..bd75f50 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/vm/PrimitiveDoubleViewModel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/vm/PrimitiveDoubleViewModel.java
@@ -38,7 +38,7 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom.types.primitive.doubles.holder.PrimitiveDoubleHolder;
 
 //tag::class[]
-@XmlRootElement(name = "demo.PrimitiveDoubleViewModel")
+@XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/vm/PrimitiveFloatViewModel.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/vm/PrimitiveFloatViewModel.java
index 733a15f..d5eee13 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/vm/PrimitiveFloatViewModel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/vm/PrimitiveFloatViewModel.java
@@ -38,7 +38,7 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom.types.primitive.floats.holder.PrimitiveFloatHolder;
 
 //tag::class[]
-@XmlRootElement(name = "demo.PrimitiveFloatViewModel")
+@XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/vm/PrimitiveIntViewModel.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/vm/PrimitiveIntViewModel.java
index bb8473a..b92d27e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/vm/PrimitiveIntViewModel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/vm/PrimitiveIntViewModel.java
@@ -38,7 +38,7 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom.types.primitive.ints.holder.PrimitiveIntHolder;
 
 //tag::class[]
-@XmlRootElement(name = "demo.PrimitiveIntViewModel")
+@XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/vm/PrimitiveLongViewModel.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/vm/PrimitiveLongViewModel.java
index 081e222..71b6aab 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/vm/PrimitiveLongViewModel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/vm/PrimitiveLongViewModel.java
@@ -38,7 +38,7 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom.types.primitive.longs.holder.PrimitiveLongHolder;
 
 //tag::class[]
-@XmlRootElement(name = "demo.PrimitiveLongViewModel")
+@XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/vm/PrimitiveShortViewModel.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/vm/PrimitiveShortViewModel.java
index 48abd92..b9f7568 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/vm/PrimitiveShortViewModel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/vm/PrimitiveShortViewModel.java
@@ -38,7 +38,7 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom.types.primitive.shorts.holder.PrimitiveShortHolder;
 
 //tag::class[]
-@XmlRootElement(name = "demo.PrimitiveShortViewModel")
+@XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/WrapperCharacters-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/WrapperCharacters-description.adoc
index aae8446..b500880 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/WrapperCharacters-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/WrapperCharacters-description.adoc
@@ -9,7 +9,7 @@ Some properties on these domain objects are mandatory, some optional.
 
 == Common interface
 
-These objects both implement a common interface, `WrapperCharacterHolder`:
+These objects both implement a common interface, `StringHolder`:
 
 [source,java]
 ----
@@ -29,7 +29,7 @@ For example:
 +
 [source,java]
 ----
-include::holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleInline.java[tags=class]
+include::holder/WrapperCharacterHolder_updateReadOnlyOptionalProperty.java[tags=class]
 ----
 +
 There are a number of variants of this action, to demonstrate different prompt layouts.
@@ -41,17 +41,11 @@ There are a number of variants of this action, to demonstrate different prompt l
 include::holder/WrapperCharacterHolder_actionReturning.java[tags=class]
 ----
 
-== Mixin properties
 
-We also use the interface to contribute a number of mixin properties:
-
-* the `mixinPropertyWithCssClass` property:
+* the `actionReturningCollection` action is:
 +
 [source,java]
 ----
-include::holder/WrapperCharacterHolder_mixinPropertyWithCssClass.java[tags=class]
+include::holder/WrapperCharacterHolder_actionReturningCollection.java[tags=class]
 ----
-+
-TIP: the styling is provided from the `application.css` static resource.
-
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_actionReturningCollection.java b/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_actionReturningCollection.java
index 118cd00..ba3d565 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_actionReturningCollection.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_actionReturningCollection.java
@@ -29,9 +29,8 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 
-@Action(
-        semantics = SemanticsOf.SAFE
-)
+//tag::class[]
+@Action(semantics = SemanticsOf.SAFE)
 @RequiredArgsConstructor
 public class WrapperCharacterHolder_actionReturningCollection {
 
@@ -45,5 +44,5 @@ public class WrapperCharacterHolder_actionReturningCollection {
         );
         return characters;
     }
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyOptionalProperty.java b/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyOptionalProperty.java
index 94566df..61be49c 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyOptionalProperty.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyOptionalProperty.java
@@ -22,7 +22,6 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/vm/WrapperCharacterViewModel.java b/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/vm/WrapperCharacterViewModel.java
index 528b989..a17ac92 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/vm/WrapperCharacterViewModel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/vm/WrapperCharacterViewModel.java
@@ -18,7 +18,6 @@
  */
 package demoapp.dom.types.wrapper.characters.vm;
 
-import javax.jdo.annotations.Column;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
@@ -41,7 +40,7 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom.types.wrapper.characters.holder.WrapperCharacterHolder;
 
 //tag::class[]
-@XmlRootElement(name = "demo.WrapperCharacterViewModel")
+@XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/viewmodels/jaxbrefentity/StatefulViewModelJaxbRefsEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/viewmodels/jaxbrefentity/StatefulViewModelJaxbRefsEntity.java
index f030c0b..472ac48 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/viewmodels/jaxbrefentity/StatefulViewModelJaxbRefsEntity.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/viewmodels/jaxbrefentity/StatefulViewModelJaxbRefsEntity.java
@@ -43,7 +43,7 @@ import lombok.Setter;
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 
 //tag::class[]
-@XmlRootElement(name = "demo.StatefulViewModelJaxbRefsEntity")
+@XmlRootElement(name = "root")
 @XmlType(
         propOrder = {"message", "favoriteChild", "children"}
 )
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/viewmodels/usingjaxb/StatefulViewModelUsingJaxb.java b/examples/demo/domain/src/main/java/demoapp/dom/viewmodels/usingjaxb/StatefulViewModelUsingJaxb.java
index fe8871f..f137901 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/viewmodels/usingjaxb/StatefulViewModelUsingJaxb.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/viewmodels/usingjaxb/StatefulViewModelUsingJaxb.java
@@ -45,7 +45,7 @@ import lombok.val;
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 
 //tag::class[]
-@XmlRootElement(name = "demo.StatefulViewModelUsingJaxb")   // <.>
+@XmlRootElement(name = "root")                              // <.>
 @XmlType                                                    // <.>
 @XmlAccessorType(XmlAccessType.FIELD)                       // <.>
 @DomainObject(
@@ -65,7 +65,7 @@ public class StatefulViewModelUsingJaxb implements HasAsciiDocDescription {
 
 //end::class[]
 //tag::child[]
-    @XmlRootElement(name = "demo.StatefulViewModelUsingJaxb.Child")
+    @XmlRootElement(name = "root")
     @XmlType
     @XmlAccessorType(XmlAccessType.FIELD)
     @Data


[isis] 01/02: ISIS-2222: wip

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2222
in repository https://gitbox.apache.org/repos/asf/isis.git

commit d3afa9ebfe9fcdca21a8aa62d440f56a77870ad3
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Jun 30 13:55:30 2020 +0100

    ISIS-2222: wip
---
 .../ActionLayoutMenu.java}                         |  35 ++--
 .../ActionLayoutPositionVm-description.adoc        |  34 +++
 .../position/ActionLayoutPositionVm.java           |  75 +++++++
 .../position/ActionLayoutPositionVm.layout.xml     |  57 ++++++
 .../ActionLayoutPositionVm_annotatedBelow.java}    |  24 +--
 .../ActionLayoutPositionVm_annotatedPanel.java}    |  23 ++-
 ...onLayoutPositionVm_annotatedPanelDropDown.java} |  23 ++-
 .../ActionLayoutPositionVm_annotatedRight.java}    |  25 +--
 .../ActionLayoutPositionVm_layoutBelow.java}       |  22 +-
 .../ActionLayoutPositionVm_layoutPanel.java}       |  24 +--
 ...ctionLayoutPositionVm_layoutPanelDropDown.java} |  24 +--
 .../ActionLayoutPositionVm_layoutRight.java}       |  24 +--
 ...youtPromptStyleVm_annotatedInlineAsIfEdit.java} |  21 +-
 .../ActionLayoutPromptStyleVm_layoutDialog.java}   |  23 ++-
 .../ActionLayoutPromptStyleVm_layoutInline.java}   |  20 +-
 ...nLayoutPromptStyleVm_layoutInlineAsIfEdit.java} |  25 +--
 .../dom/PropertyLayout/PropertyLayoutMenu.java     | 228 +++++++++++++++++++++
 .../PropertyLayoutCssClassMetaAnnotation.java      |  18 ++
 .../PropertyLayoutCssClassVm-description.adoc      |  13 ++
 .../cssClass/PropertyLayoutCssClassVm.java         |  96 +++++++++
 .../cssClass/PropertyLayoutCssClassVm.layout.xml   |  46 +++++
 .../PropertyLayoutCssClassVm_annotatedMixin.java}  |  10 +-
 .../named/PropertyLayoutNamedMetaAnnotation.java   |  18 ++
 .../PropertyLayoutNamedVm_annotatedEscaped.java}   |  18 +-
 24 files changed, 758 insertions(+), 168 deletions(-)

diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/ActionLayoutMenu.java
similarity index 53%
copy from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/ActionLayoutMenu.java
index decfe46..a9afe95 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/ActionLayoutMenu.java
@@ -16,32 +16,29 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.PropertyLayout;
 
 import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
-import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
 
+@DomainService(nature=NatureOfService.VIEW, objectType = "demo.PropertyLayoutMenu")
+@DomainObjectLayout(named="PropertyLayout")
+@Log4j2
+public class PropertyLayoutMenu {
 
-@Action(
-        semantics = SemanticsOf.IDEMPOTENT,
-        associateWith = "readOnlyProperty",
-        associateWithSequence = "2"
-)
-@ActionLayout(position = ActionLayout.Position.PANEL, named = "Position in panel", describedAs = "position = PANEL")
-@RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel {
-
-    private final WrapperCharacterHolder wrapperCharacterHolder;
-
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty(newValue);
-        return wrapperCharacterHolder;
+    @Action(semantics = SemanticsOf.SAFE)
+    public demoapp.dom.PropertyLayout.named.StringViewModel named(){
+        return new demoapp.dom.PropertyLayout.named.StringViewModel();
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty();
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public demoapp.dom.PropertyLayout.cssClass.StringViewModel cssClass(){
+        return new demoapp.dom.PropertyLayout.cssClass.StringViewModel();
     }
 
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm-description.adoc
new file mode 100644
index 0000000..dcd19d1
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm-description.adoc
@@ -0,0 +1,34 @@
+TODO
+
+[source,java]
+----
+include::StringViewModel.java[tags=class]
+----
+
+* positioned _below_:
++
+[source,java]
+----
+include::StringViewModel_updatePositionBelow.java[tags=class]
+----
+
+* positioned _right_:
++
+[source,java]
+----
+include::StringViewModel_updatePositionRight.java[tags=class]
+----
+
+* positioned on _panel_:
++
+[source,java]
+----
+include::StringViewModel_updatePositionPanel.java[tags=class]
+----
+
+* positioned on _panel in drop-down_:
++
+[source,java]
+----
+include::StringViewModel_updatePositionPanelDropDown.java[tags=class]
+----
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java
new file mode 100644
index 0000000..d3d1229
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java
@@ -0,0 +1,75 @@
+/*
+ *  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.ActionLayout.position;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Title;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@XmlRootElement(name = "rootx")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+@DomainObject(
+        nature=Nature.VIEW_MODEL,
+        objectType = "demo.ActionLayout.position.StringViewModel"
+)
+public class StringViewModel implements HasAsciiDocDescription {
+
+//end::class[]
+    public StringViewModel() {
+        this.title = "ActionLayout#position";
+    }
+
+//tag::class[]
+    @Title(prepend = "Demonstrates: ")
+    @Property(editing = Editing.DISABLED)
+    @XmlElement(required = true)
+    @Getter @Setter
+    private String title;
+
+    @Property(optionality = Optionality.OPTIONAL)
+    @MemberOrder(name = "annotated", sequence = "1")
+    @XmlElement(required = false)
+    @Getter @Setter
+    private String readOnlyProperty1;
+
+    @Property(optionality = Optionality.OPTIONAL)
+    @MemberOrder(name = "layout", sequence = "1")
+    @XmlElement(required = false)
+    @Getter @Setter
+    private String readOnlyProperty2;
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml
new file mode 100644
index 0000000..b1cf2ab
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<bs3:grid
+        xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd   http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="http://isis.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+			<cpt:action id="rebuildMetamodel"/>
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general"/>
+			<cpt:fieldSet name="Annotated" id="annotated"/>
+			<cpt:fieldSet name="Layout" id="layout">
+				<cpt:property id="readOnlyProperty2">
+					<cpt:action id="update2PositionBelow" position="BELOW">
+						<cpt:named>Below</cpt:named>
+					</cpt:action>
+					<cpt:action id="update2PositionPanel" position="PANEL">
+						<cpt:named>Panel</cpt:named>
+					</cpt:action>
+					<cpt:action id="update2PositionPanelDropDown" position="PANEL_DROPDOWN">
+						<cpt:named>Panel Drop Down</cpt:named>
+					</cpt:action>
+					<cpt:action id="update2PositionPanelDropDown" position="RIGHT">
+						<cpt:named>Right</cpt:named>
+					</cpt:action>
+				</cpt:property>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java
similarity index 65%
copy from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java
index bcb4cb5..6839b4e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java
@@ -16,34 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.position;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
-        associateWith = "readOnlyProperty2",
+        associateWith = "readOnlyProperty1",
         associateWithSequence = "1"
 )
-@ActionLayout(promptStyle = PromptStyle.INLINE_AS_IF_EDIT)
+@ActionLayout(position = ActionLayout.Position.BELOW, named = "Positioned below", describedAs = "position = BELOW")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit {
+public class ActionLayoutPromptVm_update1PositionBelow {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final ActionLayoutPositionVm stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty2(newValue);
-        return wrapperCharacterHolder;
+    public ActionLayoutPositionVm act(String newValue) {
+        stringViewModel.setReadOnlyProperty1(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty2();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty1();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java
similarity index 69%
copy from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java
index decfe46..0d601a6 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.position;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -25,24 +25,25 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
-        associateWith = "readOnlyProperty",
+        associateWith = "readOnlyProperty1",
         associateWithSequence = "2"
 )
-@ActionLayout(position = ActionLayout.Position.PANEL, named = "Position in panel", describedAs = "position = PANEL")
+@ActionLayout(position = ActionLayout.Position.PANEL, named = "Positioned on panel", describedAs = "position = PANEL")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel {
+public class ActionLayoutPromptVm_update1PositionPanel {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final ActionLayoutPositionVm stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty(newValue);
-        return wrapperCharacterHolder;
+    public ActionLayoutPositionVm act(String newValue) {
+        stringViewModel.setReadOnlyProperty1(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty1();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStylePanelDropDown.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java
similarity index 68%
rename from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStylePanelDropDown.java
rename to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java
index 5b50df1..966384f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStylePanelDropDown.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.position;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -25,24 +25,25 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
-        associateWith = "readOnlyProperty",
+        associateWith = "readOnlyProperty1",
         associateWithSequence = "3"
 )
-@ActionLayout(position = ActionLayout.Position.PANEL_DROPDOWN, named = "Panel Dropdown", describedAs = "position = PANEL_DROPDOWN")
+@ActionLayout(position = ActionLayout.Position.PANEL_DROPDOWN, named = "Positioned on panel in dropdown", describedAs = "position = PANEL_DROPDOWN")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyPropertyPromptStylePanelDropDown {
+public class ActionLayoutPromptVm_update1PositionPanelDropDown {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final ActionLayoutPositionVm stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty(newValue);
-        return wrapperCharacterHolder;
+    public ActionLayoutPositionVm act(String newValue) {
+        stringViewModel.setReadOnlyProperty1(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty1();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedRight.java
similarity index 63%
rename from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java
rename to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedRight.java
index decfe46..7bf853a 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_annotatedRight.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.position;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -25,24 +25,25 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
-        associateWith = "readOnlyProperty",
-        associateWithSequence = "2"
+        associateWith = "readOnlyProperty1",
+        associateWithSequence = "4"
 )
-@ActionLayout(position = ActionLayout.Position.PANEL, named = "Position in panel", describedAs = "position = PANEL")
+@ActionLayout(position = ActionLayout.Position.RIGHT, named = "Positioned right", describedAs = "position = RIGHT")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel {
+public class ActionLayoutPromptVm_update1PositionRight {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final ActionLayoutPositionVm stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty(newValue);
-        return wrapperCharacterHolder;
+    public ActionLayoutPositionVm act(String newValue) {
+        stringViewModel.setReadOnlyProperty1(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty1();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutBelow.java
similarity index 67%
copy from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutBelow.java
index bcb4cb5..7236418 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutBelow.java
@@ -16,34 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.position;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
         associateWith = "readOnlyProperty2",
         associateWithSequence = "1"
 )
-@ActionLayout(promptStyle = PromptStyle.INLINE_AS_IF_EDIT)
+@ActionLayout(named = "Positioned below", describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" position=BELOW/></cpt:property>")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit {
+public class ActionLayoutPromptVm_update2PositionBelow {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final ActionLayoutPositionVm stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty2(newValue);
-        return wrapperCharacterHolder;
+    public ActionLayoutPositionVm act(String newValue) {
+        stringViewModel.setReadOnlyProperty2(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty2();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty2();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanel.java
similarity index 65%
copy from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanel.java
index bcb4cb5..8ef3902 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanel.java
@@ -16,34 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.position;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
         associateWith = "readOnlyProperty2",
-        associateWithSequence = "1"
+        associateWithSequence = "2"
 )
-@ActionLayout(promptStyle = PromptStyle.INLINE_AS_IF_EDIT)
+@ActionLayout(named = "Positioned on panel", describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" position=PANEL/></cpt:property>")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit {
+public class ActionLayoutPromptVm_update2PositionPanel {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final ActionLayoutPositionVm stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty2(newValue);
-        return wrapperCharacterHolder;
+    public ActionLayoutPositionVm act(String newValue) {
+        stringViewModel.setReadOnlyProperty2(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty2();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty2();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanelDropDown.java
similarity index 65%
copy from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanelDropDown.java
index bcb4cb5..1166302 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutPanelDropDown.java
@@ -16,34 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.position;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
         associateWith = "readOnlyProperty2",
-        associateWithSequence = "1"
+        associateWithSequence = "3"
 )
-@ActionLayout(promptStyle = PromptStyle.INLINE_AS_IF_EDIT)
+@ActionLayout(named = "Positioned on panel dropdown", describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" position=PANEL_DROPDOWN/></cpt:property>")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit {
+public class ActionLayoutPromptVm_update2PositionPanelDropDown {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final ActionLayoutPositionVm stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty2(newValue);
-        return wrapperCharacterHolder;
+    public ActionLayoutPositionVm act(String newValue) {
+        stringViewModel.setReadOnlyProperty2(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty2();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty2();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutRight.java
similarity index 65%
copy from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
copy to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutRight.java
index bcb4cb5..1907e19 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm_layoutRight.java
@@ -16,34 +16,34 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.position;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
         associateWith = "readOnlyProperty2",
-        associateWithSequence = "1"
+        associateWithSequence = "4"
 )
-@ActionLayout(promptStyle = PromptStyle.INLINE_AS_IF_EDIT)
+@ActionLayout(named = "Positioned right", describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" position=RIGHT/></cpt:property>")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit {
+public class ActionLayoutPromptVm_update2PositionRight {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final ActionLayoutPositionVm stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty2(newValue);
-        return wrapperCharacterHolder;
+    public ActionLayoutPositionVm act(String newValue) {
+        stringViewModel.setReadOnlyProperty2(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty2();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty2();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInlineAsIfEdit.java
similarity index 69%
rename from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
rename to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInlineAsIfEdit.java
index bcb4cb5..48ae1a7 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInlineAsIfEdit.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.promptStyle;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -26,24 +26,25 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
         associateWith = "readOnlyProperty2",
         associateWithSequence = "1"
 )
-@ActionLayout(promptStyle = PromptStyle.INLINE_AS_IF_EDIT)
+@ActionLayout(promptStyle = PromptStyle.INLINE_AS_IF_EDIT, named = "Inline as if edit", describedAs = "promptStyle = INLINE_AS_IF_EDIT")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit {
+public class StringViewModel_update2PromptStyleInlineAsIfEdit {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final StringViewModel stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty2(newValue);
-        return wrapperCharacterHolder;
+    public StringViewModel act(String newValue) {
+        stringViewModel.setReadOnlyProperty2(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty2();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty2();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleModal.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutDialog.java
similarity index 66%
rename from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleModal.java
rename to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutDialog.java
index 147b9da..4580059 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleModal.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutDialog.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.promptStyle;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -26,24 +26,25 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
-        associateWith = "readOnlyProperty",
+        associateWith = "readOnlyProperty3",
         associateWithSequence = "2"
 )
-@ActionLayout(promptStyle = PromptStyle.DIALOG_MODAL, named = "Modal", describedAs = "promptStyle = MODAL")
+@ActionLayout(describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" promptStyle = DIALOG/></cpt:property>")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleModal {
+public class StringViewModel_update3PromptStyleDialog {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final StringViewModel stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty(newValue);
-        return wrapperCharacterHolder;
+    public StringViewModel act(String newValue) {
+        stringViewModel.setReadOnlyProperty3(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty3();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleInline.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInline.java
similarity index 67%
rename from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleInline.java
rename to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInline.java
index 9a0f1da..8199cdd 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleInline.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInline.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.promptStyle;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -29,21 +29,21 @@ import lombok.RequiredArgsConstructor;
 //tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
-        associateWith = "readOnlyProperty",
+        associateWith = "readOnlyProperty3",
         associateWithSequence = "1"
 )
-@ActionLayout(promptStyle = PromptStyle.INLINE, named = "Inline", describedAs = "promptStyle = INLINE")
+@ActionLayout(describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" promptStyle = INLINE/></cpt:property>")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleInline {
+public class StringViewModel_update3PromptStyleInline {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final StringViewModel stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty(newValue);
-        return wrapperCharacterHolder;
+    public StringViewModel act(String newValue) {
+        stringViewModel.setReadOnlyProperty3(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty3();
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleSidebar.java b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInlineAsIfEdit.java
similarity index 64%
rename from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleSidebar.java
rename to examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInlineAsIfEdit.java
index 5b7e405..1cc012c 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleSidebar.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInlineAsIfEdit.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.ActionLayout.promptStyle;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -26,24 +26,25 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import lombok.RequiredArgsConstructor;
 
 
+//tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT,
-        associateWith = "readOnlyProperty",
-        associateWithSequence = "3"
+        associateWith = "readOnlyProperty4",
+        associateWithSequence = "1"
 )
-@ActionLayout(promptStyle = PromptStyle.DIALOG_SIDEBAR, named = "sidebar", describedAs = "promptStyle = DIALOG_SIDEBAR")
+@ActionLayout(describedAs = "<cpt:property id=\"...\"><cpt:action id=\"...\" promptStyle = INLINE_AS_IF_EDIT/></cpt:property>")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleSidebar {
+public class StringViewModel_update4PromptStyleInlineAsIfEdit {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final StringViewModel stringViewModel;
 
-    public WrapperCharacterHolder act(Character newValue) {
-        wrapperCharacterHolder.setReadOnlyProperty(newValue);
-        return wrapperCharacterHolder;
+    public StringViewModel act(String newValue) {
+        stringViewModel.setReadOnlyProperty4(newValue);
+        return stringViewModel;
     }
-    public Character default0Act() {
-        return wrapperCharacterHolder.getReadOnlyProperty();
+    public String default0Act() {
+        return stringViewModel.getReadOnlyProperty4();
     }
 
-
 }
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/PropertyLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/PropertyLayoutMenu.java
new file mode 100644
index 0000000..28ec7ad
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/PropertyLayoutMenu.java
@@ -0,0 +1,228 @@
+/*
+ *  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.types;
+
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.util.Date;
+import java.util.UUID;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.factory.FactoryService;
+import org.apache.isis.applib.value.Blob;
+import org.apache.isis.applib.value.Clob;
+import org.apache.isis.applib.value.Markup;
+import org.apache.isis.applib.value.NamedWithMimeType;
+import org.apache.isis.core.commons.internal.base._Bytes;
+import org.apache.isis.core.commons.internal.base._Strings;
+import org.apache.isis.core.commons.internal.resources._Resources;
+
+import lombok.val;
+
+import lombok.extern.log4j.Log4j2;
+
+import demoapp.dom.types.blob.BlobDemo;
+import demoapp.dom.types.clob.ClobDemo;
+import demoapp.dom.types.markup.MarkupDemo;
+import demoapp.dom.types.wrapper.WrapperDemo;
+import demoapp.dom.types.primitive.booleans.PrimitiveBooleans;
+import demoapp.dom.types.primitive.bytes.PrimitiveBytes;
+import demoapp.dom.types.primitive.chars.PrimitiveChars;
+import demoapp.dom.types.primitive.doubles.PrimitiveDoubles;
+import demoapp.dom.types.primitive.floats.PrimitiveFloats;
+import demoapp.dom.types.primitive.ints.PrimitiveInts;
+import demoapp.dom.types.primitive.longs.PrimitiveLongs;
+import demoapp.dom.types.primitive.shorts.PrimitiveShorts;
+import demoapp.dom.types.text.TextDemo;
+import demoapp.dom.types.time.TemporalDemo;
+import demoapp.dom.types.uuid.UuidDemo;
+import demoapp.dom.types.wrapper.characters.WrapperCharacters;
+
+@DomainService(nature=NatureOfService.VIEW, objectType = "demo.DataTypesMenu")
+@DomainObjectLayout(named="DataTypes")
+@Log4j2
+public class DataTypesMenu {
+
+    @Inject private FactoryService factoryService;
+
+    @Action
+    @ActionLayout(cssClassFa="fa-font")
+    public TextDemo text(){
+        val demo = factoryService.viewModel(TextDemo.class);
+
+        demo.setString("a string (click me)");
+        demo.setStringMultiline("A multiline string\nspanning\n3 lines. (click me)");
+
+        demo.setStringReadonly("a readonly string (but allows text select)");
+        demo.setStringMultilineReadonly("A readonly string\nspanning\n3 lines. (but allows text select)");
+
+        return demo;
+    }
+    
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-hashtag")
+    public WrapperDemo wrappers(){
+        val demo = factoryService.viewModel(WrapperDemo.class);
+
+        demo.setJavaLangByte(Byte.MAX_VALUE);
+        demo.setJavaLangShort(Short.MAX_VALUE);
+        demo.setJavaLangInteger(Integer.MAX_VALUE);
+        demo.setJavaLangLong(Long.MAX_VALUE);
+
+        demo.setJavaLangFloat(Float.MAX_VALUE);
+        demo.setJavaLangDouble(Double.MAX_VALUE);
+
+        return demo;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-clock")
+    public TemporalDemo temporals(){
+        val demo = factoryService.viewModel(TemporalDemo.class);
+
+        demo.setJavaUtilDate(new Date());
+        demo.setJavaSqlDate( new java.sql.Date(System.currentTimeMillis()));
+        demo.setJavaSqlTimestamp(new java.sql.Timestamp(System.currentTimeMillis()));
+
+        demo.setJavaLocalDate(LocalDate.now());
+        demo.setJavaLocalDateTime(LocalDateTime.now());
+        demo.setJavaOffsetDateTime(OffsetDateTime.now());
+
+        return demo;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-at")
+    public UuidDemo uuid(){
+        val demo = factoryService.viewModel(UuidDemo.class);
+        demo.setUuid(UUID.randomUUID());
+        return demo;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-cloud")
+    public BlobDemo blobs(){
+        val demo = factoryService.viewModel(BlobDemo.class);
+
+        try {
+            val bytes = _Bytes.of(_Resources.load(BlobDemo.class, "isis-logo-568x286.png"));
+            demo.setLogo(Blob.of("isis-logo-568x286", NamedWithMimeType.CommonMimeType.PNG, bytes));
+        } catch (Exception e) {
+            log.error("failed to create Blob from image resource", e);
+        }
+
+        return demo;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-cloud")
+    public ClobDemo clobs(){
+        val demo = factoryService.viewModel(ClobDemo.class);
+
+        try {
+            val text = _Strings.read(_Resources.load(ClobDemo.class, "document.txt"), StandardCharsets.UTF_8);
+            demo.setDocument(Clob.of("document", NamedWithMimeType.CommonMimeType.TXT, text));
+        } catch (Exception e) {
+            log.error("failed to create Clob from text resource", e);
+        }
+
+        return demo;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-code")
+    public MarkupDemo markup(){
+        val demo = factoryService.viewModel(MarkupDemo.class);
+
+        try {
+            val htmlSource = _Strings.read(_Resources.load(MarkupDemo.class, "markup-embedded.html"), StandardCharsets.UTF_8);
+            demo.setMarkup(new Markup(htmlSource));
+        } catch (Exception e) {
+            log.error("failed to create Markup from file resource", e);
+        }
+
+        return demo;
+    }
+
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-hashtag")
+    public PrimitiveBytes primitiveBytes(){
+        return new PrimitiveBytes();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-hashtag")
+    public PrimitiveShorts primitiveShorts(){
+        return new PrimitiveShorts();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-hashtag")
+    public PrimitiveInts primitiveInts(){
+        return new PrimitiveInts();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-hashtag")
+    public PrimitiveLongs primitiveLongs(){
+        return new PrimitiveLongs();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-hashtag")
+    public PrimitiveFloats primitiveFloats(){
+        return new PrimitiveFloats();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-hashtag")
+    public PrimitiveDoubles primitiveDoubles(){
+        return new PrimitiveDoubles();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-hashtag")
+    public PrimitiveChars primitiveChars(){
+        return new PrimitiveChars();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-hashtag")
+    public PrimitiveBooleans primitiveBooleans(){
+        return new PrimitiveBooleans();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-hashtag")
+    public WrapperCharacters wrapperCharacters(){
+        return new WrapperCharacters();
+    }
+
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassMetaAnnotation.java
new file mode 100644
index 0000000..faba439
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassMetaAnnotation.java
@@ -0,0 +1,18 @@
+package demoapp.dom.PropertyLayout.named;
+
+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.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
+
+@PropertyLayout(named = "Named <i>from</i> custom type", namedEscaped = false)
+@Inherited
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.ANNOTATION_TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PropertyLayoutNamedMetaAnnotation {
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm-description.adoc
new file mode 100644
index 0000000..9169f74
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm-description.adoc
@@ -0,0 +1,13 @@
+JAXB supports `Character` out-of-the-box, so no special annotations are required.
+
+[source,java]
+----
+include::WrapperCharacterViewModel.java[tags=class]
+----
+<.> a no-arg constructor is required by JAXB
+<.> required property as defined to JAXB
+<.> directly editable property as defined to Apache Isis
+<.> optional property as defined to Apache Isis.
++
+This is the default for JAXB so no additional annotation required.
+
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java
new file mode 100644
index 0000000..58ee3cb
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java
@@ -0,0 +1,96 @@
+/*
+ *  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.PropertyLayout.cssClass;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
+import org.apache.isis.applib.annotation.Title;
+import org.apache.isis.applib.annotation.Where;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import demoapp.dom.PropertyLayout.named.PropertyLayoutNamedMetaAnnotation;
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@XmlRootElement(name = "root")
+@XmlType
+@XmlAccessorType(XmlAccessType.FIELD)
+@DomainObject(
+        nature=Nature.VIEW_MODEL,
+        objectType = "demo.PropertyLayout.cssClass.ActionLayoutPromptStyleVm"
+)
+public class StringViewModel implements HasAsciiDocDescription {
+
+//end::class[]
+    public StringViewModel() {
+        this.title = "PropertyLayout#cssClass";
+    }
+
+//tag::class[]
+    @Title(prepend = "Demonstrates: ")
+    @Property(editing = Editing.DISABLED)
+    @XmlElement(required = true)
+    @Getter @Setter
+    private String title;
+
+    @Property(optionality = Optionality.OPTIONAL)
+    @PropertyLayout(cssClass = "red", describedAs = "@PropertyLayout(cssClass=\"red\")", hidden = Where.ALL_TABLES)
+    @MemberOrder(name = "properties", sequence = "1")
+    @XmlElement(required = false)
+    @Getter @Setter
+    private String propertyUsingAnnotation;
+
+    @Property(optionality = Optionality.OPTIONAL)
+    @PropertyLayout(describedAs = "<cpt:property id=\"...\" cssClass=\"red\")/>", hidden = Where.ALL_TABLES)
+    @MemberOrder(name = "properties", sequence = "2")
+    @XmlElement(required = false)
+    @Getter @Setter
+    private String propertyUsingLayout;
+
+    @Property(optionality = Optionality.OPTIONAL)
+    @PropertyLayoutCssClassMetaAnnotation
+    @PropertyLayout(describedAs = "@PropertyLayoutCssClassMetaAnnotation", hidden = Where.ALL_TABLES)
+    @MemberOrder(name = "meta-annotated", sequence = "1")
+    @XmlElement(required = false)
+    @Getter @Setter
+    private String propertyUsingMetaAnnotation;
+
+    @Property(optionality = Optionality.OPTIONAL)
+    @PropertyLayoutCssClassMetaAnnotation
+    @PropertyLayout(cssClass = "blue", describedAs = "meta-annotation overridden using @PropertyLayout(...)", hidden = Where.ALL_TABLES)
+    @MemberOrder(name = "meta-annotated", sequence = "2")
+    @XmlElement(required = false)
+    @Getter @Setter
+    private String propertyUsingMetaAnnotationOverridden;
+
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.layout.xml
new file mode 100644
index 0000000..01f28a1
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.layout.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<bs3:grid
+        xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd   http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+        xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3"
+        xmlns:cpt="http://isis.apache.org/applib/layout/component"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+	<bs3:row>
+		<bs3:col span="10" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+		<bs3:col span="2">
+			<cpt:fieldSet name="" id="sources" />
+		</bs3:col>
+	</bs3:row>
+
+	<bs3:row>
+		<bs3:col span="6">
+			<cpt:fieldSet name="General" id="general">
+				<cpt:property id="title" />
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Properties" id="properties">
+				<cpt:property id="cssClassUsingLayoutProperty" cssClass="red"/>
+			</cpt:fieldSet>
+			<cpt:fieldSet name="Contributed" id="contributed"/>
+			<cpt:fieldSet name="Meta-annotated" id="meta-annotated"/>
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+		</bs3:col>
+		<bs3:col span="6">
+			<cpt:fieldSet name="Description" id="description" >
+				<cpt:action id="clearHints" position="PANEL" />
+				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="rebuildMetamodel"  position="PANEL"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
+				<cpt:property id="description"/>
+			</cpt:fieldSet>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12" unreferencedCollections="true"/>
+	</bs3:row>
+
+</bs3:grid>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_mixinPropertyWithCssClass.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm_annotatedMixin.java
similarity index 82%
rename from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_mixinPropertyWithCssClass.java
rename to examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm_annotatedMixin.java
index 7ad81bb..ccfa09f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_mixinPropertyWithCssClass.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm_annotatedMixin.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.PropertyLayout.cssClass;
 
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
@@ -29,13 +29,13 @@ import lombok.RequiredArgsConstructor;
 @Property()
 @PropertyLayout(cssClass = "red", describedAs = "cssClass = \"red\" ", hidden = Where.ALL_TABLES)
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_mixinPropertyWithCssClass {
+public class StringViewModel_mixinPropertyWithCssClass {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final StringViewModel stringViewModel;
 
     @MemberOrder(name = "contributed", sequence = "1")
-    public Character prop() {
-        return wrapperCharacterHolder.getReadOnlyProperty();
+    public String prop() {
+        return stringViewModel.getPropertyUsingAnnotation();
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedMetaAnnotation.java
new file mode 100644
index 0000000..6c3a315
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedMetaAnnotation.java
@@ -0,0 +1,18 @@
+package demoapp.dom.PropertyLayout.named;
+
+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.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
+
+@PropertyLayout(named = "Named <i>from</i> custom type", namedEscaped = false)
+@Inherited
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.ANNOTATION_TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PropertyLayoutNamedCustomType {
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_mixinPropertyNamedNotEscaped.java b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm_annotatedEscaped.java
similarity index 63%
rename from examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_mixinPropertyNamedNotEscaped.java
rename to examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm_annotatedEscaped.java
index ad440c6..d1ee3ee 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/wrapper/characters/holder/WrapperCharacterHolder_mixinPropertyNamedNotEscaped.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedVm_annotatedEscaped.java
@@ -16,23 +16,25 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.wrapper.characters.holder;
+package demoapp.dom.PropertyLayout.named;
 
 import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
 
 import lombok.RequiredArgsConstructor;
 
 
-//@Property()
-//@PropertyLayout(named = "<i>Named<i/> <b>not</b> escaped property", namedEscaped = false, describedAs = "named = \"(some markup)\", namedEscaped = false") // TODO: this doesn't render, and causes bootlint issues
+@Property()
+@PropertyLayout(named = "<i>Named<i/> escaped mixin property", namedEscaped = true, describedAs = "named = \"(some markup)\", namedEscaped = true")
 @RequiredArgsConstructor
-public class WrapperCharacterHolder_mixinPropertyNamedNotEscaped {
+public class StringViewModel_mixinAnnotatedNamedEscaped {
 
-    private final WrapperCharacterHolder wrapperCharacterHolder;
+    private final StringViewModel stringViewModel;
 
-    @MemberOrder(name = "contributed", sequence = "3")
-    public Character prop() {
-        return wrapperCharacterHolder.getReadOnlyProperty();
+    @MemberOrder(name = "contributed", sequence = "4")
+    public String prop() {
+        return stringViewModel.getPropertyUsingAnnotation();
     }