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:55:47 UTC

[isis] branch ISIS-2222 updated (76768d2 -> 39dcfbf)

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.


    from 76768d2  ISIS-2222: fleshes out wrapper character with optional properties also.
     add 45a9aa8  ISIS-2340: fx: basic support for bs3 grid layout
     add aa8cdfb  ISIS-2340: fx: stubs for a FormPane
     add 53a2509  ISIS-2340: fx: simple form/field rendering
     add 0bf0750  ISIS-2340: fx: WebView with autofit, to render Markup types
     add 6e1ba6f  ISIS-2340: fx Markup: handle href links with system default browser
     add 34d6915  ISIS-2340: fx: adds TextFieldFactory (in preparation of. a binding API)
     new 39dcfbf  ISIS-2222: wip

The 1 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:
 .../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 ++--
 .../PropertyLayoutMenu.java}                       |   0
 .../PropertyLayoutCssClassMetaAnnotation.java      |  18 +++
 .../PropertyLayoutCssClassVm-description.adoc}     |   0
 .../cssClass/PropertyLayoutCssClassVm.java         |  96 +++++++++++++
 .../cssClass/PropertyLayoutCssClassVm.layout.xml   |  46 +++++++
 .../PropertyLayoutCssClassVm_annotatedMixin.java}  |  10 +-
 .../named/PropertyLayoutNamedMetaAnnotation.java   |  18 +++
 .../PropertyLayoutNamedVm_annotatedEscaped.java}   |  18 +--
 .../main/java/demoapp/javafx/DemoAppJavaFx.java    |   3 +-
 .../javafx/src/main/java/demoapp/javafx/icon.png   | Bin 1597 -> 1926 bytes
 incubator/pom.xml                                  |   1 +
 .../incubator/viewer/javafx/model/util/_fx.java    |  77 +++++++++--
 .../javafx/ui/IsisModuleIncViewerJavaFxUi.java     |   2 +
 .../javafx/ui/components/UiComponentFactoryFx.java |  11 +-
 .../javafx/ui/components/UiComponentHandlerFx.java |   5 +-
 .../javafx/ui/components/debug/DebugField.java     |  27 ++--
 .../FormField.java}                                |  12 +-
 .../viewer/javafx/ui/components/form/FormPane.java |  96 +++++++++++++
 .../SimpleFormField.java}                          |  21 ++-
 .../components/{ => form}/field/CustomFieldFx.java |   2 +-
 .../ui/components/markup/MarkupFieldFactory.java   | 152 +++++++++++++++++++--
 .../javafx/ui/components/object/ObjectViewFx.java  |  62 +++++----
 .../ui/components/other/FallbackFieldFactory.java  |  16 ++-
 .../javafx/ui/components/panel/TitledPanel.java    |  25 +---
 .../ui/components/text/TextFieldFactory.java       |  69 ++++++++++
 .../viewer/javafx/ui/main/UiController.java        |  17 ++-
 .../viewers/javafx/ui/src/main/resources/ui.fxml   | 104 +++++++++++---
 43 files changed, 1096 insertions(+), 291 deletions(-)
 copy examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java => ActionLayout/ActionLayoutMenu.java} (53%)
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm-description.adoc
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.java
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/ActionLayout/position/ActionLayoutPositionVm.layout.xml
 copy examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java => ActionLayout/position/ActionLayoutPositionVm_annotatedBelow.java} (65%)
 copy examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java => ActionLayout/position/ActionLayoutPositionVm_annotatedPanel.java} (69%)
 rename examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStylePanelDropDown.java => ActionLayout/position/ActionLayoutPositionVm_annotatedPanelDropDown.java} (68%)
 rename examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPositionPanel.java => ActionLayout/position/ActionLayoutPositionVm_annotatedRight.java} (63%)
 copy examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java => ActionLayout/position/ActionLayoutPositionVm_layoutBelow.java} (67%)
 copy examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java => ActionLayout/position/ActionLayoutPositionVm_layoutPanel.java} (65%)
 copy examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java => ActionLayout/position/ActionLayoutPositionVm_layoutPanelDropDown.java} (65%)
 copy examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java => ActionLayout/position/ActionLayoutPositionVm_layoutRight.java} (65%)
 rename examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyProperty2PromptInlineAsIfEdit.java => ActionLayout/promptStyle/ActionLayoutPromptStyleVm_annotatedInlineAsIfEdit.java} (69%)
 rename examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleModal.java => ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutDialog.java} (66%)
 rename examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleInline.java => ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInline.java} (67%)
 rename examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_updateReadOnlyPropertyPromptStyleSidebar.java => ActionLayout/promptStyle/ActionLayoutPromptStyleVm_layoutInlineAsIfEdit.java} (64%)
 copy examples/demo/domain/src/main/java/demoapp/dom/{types/DataTypesMenu.java => PropertyLayout/PropertyLayoutMenu.java} (100%)
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassMetaAnnotation.java
 copy examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/vm/WrapperCharacterViewModel-description.adoc => PropertyLayout/cssClass/PropertyLayoutCssClassVm-description.adoc} (100%)
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/cssClass/PropertyLayoutCssClassVm.layout.xml
 rename examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_mixinPropertyWithCssClass.java => PropertyLayout/cssClass/PropertyLayoutCssClassVm_annotatedMixin.java} (82%)
 create mode 100644 examples/demo/domain/src/main/java/demoapp/dom/PropertyLayout/named/PropertyLayoutNamedMetaAnnotation.java
 rename examples/demo/domain/src/main/java/demoapp/dom/{types/wrapper/characters/holder/WrapperCharacterHolder_mixinPropertyNamedNotEscaped.java => PropertyLayout/named/PropertyLayoutNamedVm_annotatedEscaped.java} (63%)
 copy incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/{UiComponentHandlerFx.java => form/FormField.java} (78%)
 create mode 100644 incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/form/FormPane.java
 copy incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/{UiComponentHandlerFx.java => form/SimpleFormField.java} (62%)
 rename incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/{ => form}/field/CustomFieldFx.java (97%)
 create mode 100644 incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/text/TextFieldFactory.java


[isis] 01/01: 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 39dcfbf63b14b69d99d36314cc4d20f41e502bc1
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();
     }