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 2013/07/19 12:16:56 UTC

[2/3] git commit: ISIS-468: new @MemberGroupLayout annotation ...

ISIS-468: new @MemberGroupLayout annotation ...

... and implementation in the wicket viewer


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/ec1646f2
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/ec1646f2
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/ec1646f2

Branch: refs/heads/master
Commit: ec1646f271e7950788c238691161db8de30d423e
Parents: 4c47263
Author: Dan Haywood <da...@apache.org>
Authored: Fri Jul 19 07:18:58 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Fri Jul 19 07:18:58 2013 +0100

----------------------------------------------------------------------
 .../viewer/wicket/model/models/EntityModel.java |   18 +-
 .../wicket/model/util/ObjectSpecifications.java |   30 +-
 .../entity/combined/EntityCombinedPanel.html    |   13 +-
 .../entity/combined/EntityCombinedPanel.java    |   28 +-
 .../entity/properties/EntityPropertiesForm.java |    3 +-
 .../properties/EntityPropertiesPanel.java       |    2 -
 .../viewer/wicket/ui/pages/PageAbstract.html    |    3 +-
 .../viewer/wicket/ui/pages/PageAbstract.java    |    3 +
 .../wicket/ui/pages/bootstrap/css/bootstrap.css | 1563 ++++++++++++++++++
 .../ui/pages/bootstrap/css/bootstrap.min.css    |  114 ++
 .../img/glyphicons-halflings-white.png          |  Bin 0 -> 8777 bytes
 .../bootstrap/img/glyphicons-halflings.png      |  Bin 0 -> 12799 bytes
 .../applib/annotation/MemberGroupLayout.java    |  116 ++
 .../isis/applib/annotation/MemberGroups.java    |   29 +-
 .../membergroups/MemberGroupLayoutFacet.java    |   46 +
 .../object/membergroups/MemberGroupsFacet.java  |   41 -
 .../MemberGroupLayoutFacetAbstract.java         |   72 +
 .../MemberGroupLayoutFacetFactory.java          |   60 +
 .../membergroups/MemberGroupsFacetAbstract.java |   23 +-
 .../MemberGroupLayoutFacetAnnotation.java       |   39 +
 .../MemberGroupLayoutFacetFallback.java         |   39 +
 ...roupsAnnotationElseFallbackFacetFactory.java |   53 -
 .../annotation/MemberGroupsFacetAnnotation.java |   20 +-
 .../annotation/MemberGroupsFacetFallback.java   |   34 -
 .../dflt/ProgrammingModelFacetsJava5.java       |    4 +-
 .../MemberGroupLayoutFacetFactoryTest.java      |  139 ++
 ...sAnnotationElseFallbackFacetFactoryTest.java |  103 --
 .../dom/src/main/java/dom/todo/ToDoItem.java    |    4 +-
 28 files changed, 2319 insertions(+), 280 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 2942e94..23358e3 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -20,6 +20,7 @@
 package org.apache.isis.viewer.wicket.model.models;
 
 import java.io.Serializable;
+import java.util.List;
 import java.util.Map;
 
 import com.google.common.collect.Maps;
@@ -43,6 +44,7 @@ import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.mementos.PageParameterNames;
 import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
+import org.apache.isis.viewer.wicket.model.util.ObjectSpecifications.MemberGroupLayoutHint;
 
 /**
  * Backing model to represent a {@link ObjectAdapter}.
@@ -128,13 +130,19 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
     private Mode mode = Mode.VIEW;
     private RenderingHint renderingHint = RenderingHint.REGULAR;
     private final Map<PropertyMemento, ScalarModel> propertyScalarModels = Maps.newHashMap();
+    private MemberGroupLayoutHint memberGroupLayoutHint;
 
 
     /**
      * Toggled by 'entityDetailsButton'.
      */
     private boolean entityDetailsVisible;
-    
+
+    /**
+     * Set by {@link #setMemberGroupsHint(List)}
+     */
+    private List<String> memberGroupsHint;
+
     /**
      * {@link ConcurrencyException}, if any, that might have occurred previously
      */
@@ -375,6 +383,13 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
         entityDetailsVisible = !entityDetailsVisible;
     }
 
+    public MemberGroupLayoutHint getMemberGroupLayoutHint() {
+        return memberGroupLayoutHint;
+    }
+    public void setMemberGroupLayoutHint(MemberGroupLayoutHint memberGroupLayoutHint) {
+        this.memberGroupLayoutHint = memberGroupLayoutHint;
+    }
+
     
     // //////////////////////////////////////////////////////////
     // concurrency exceptions
@@ -505,4 +520,5 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
         return IsisContext.getSpecificationLoader();
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecifications.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecifications.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecifications.java
index 627c799..b2f2cfb 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecifications.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/util/ObjectSpecifications.java
@@ -24,7 +24,7 @@ import java.util.Set;
 
 import com.google.common.collect.Lists;
 
-import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupsFacet;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 
@@ -33,17 +33,33 @@ public final class ObjectSpecifications {
     private ObjectSpecifications() {
     }
 
-    public static List<String> orderByMemberGroups(ObjectSpecification objSpec, Set<String> groupNamesToOrder) {
-        final MemberGroupsFacet facet = objSpec.getFacet(MemberGroupsFacet.class);
-        final List<String> groupNames = Lists.newArrayList(groupNamesToOrder);
+    public enum MemberGroupLayoutHint {
+        LEFT,
+        MIDDLE;
+        public List<String> getValue(MemberGroupLayoutFacet facet) {
+            return this == LEFT? facet.getLeft(): facet.getMiddle();
+        }
+    }
+
+    public static List<String> orderByMemberGroups(ObjectSpecification objSpec, Set<String> groupNamesToOrder, MemberGroupLayoutHint memberGroupLayoutHint) {
+        final MemberGroupLayoutFacet facet = objSpec.getFacet(MemberGroupLayoutFacet.class);
+        final List<String> leftColumnGroupNames = Lists.newArrayList(groupNamesToOrder);
         
         // not expected to happen
         if(facet == null) {
-            return groupNames;
+            return leftColumnGroupNames;
         }
         
-        final List<String> groupNamedInRequiredOrder = facet.value();
-        return order(groupNames, groupNamedInRequiredOrder);
+        if(memberGroupLayoutHint == MemberGroupLayoutHint.LEFT) {
+            // per the requested order, including any groups not mentioned in either list, excluding any groups in the middle column
+            final List<String> groupNamedInRequiredOrder = facet.getLeft();
+            final List<String> order = order(leftColumnGroupNames, groupNamedInRequiredOrder);
+            order.removeAll(facet.getMiddle());
+            return order;
+        } else {
+            // strictly those listed for the middle column.
+            return facet.getMiddle();
+        }
     }
 
     static List<String> order(final List<String> valuesToOrder, final List<String> valuesInRequiredOrder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.html
index fba10c0..ff610d1 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.html
@@ -21,13 +21,14 @@
 <body>
 <wicket:panel>
 	<div class="entityCombined">
-		<div wicket:id="entitySummary" />
-		<div id="entityPropertiesForLayout">
-			<div wicket:id="entityProperties"/>
-		</div>
-		<div id="entityCollectionsForLayout">
+        <div class="row-fluid">
+    		<div wicket:id="entitySummary" />
+        </div>
+        <div class="row-fluid">
+			<div wicket:id="entityPropertiesLeft"/>
+            <div wicket:id="entityPropertiesMiddle"/>
 			<div wicket:id="entityCollections"/>
-		</div>
+        </div>
 	</div>
 </wicket:panel>
 </body>

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
index 2bb55be..2403d5e 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
@@ -19,8 +19,13 @@
 
 package org.apache.isis.viewer.wicket.ui.components.entity.combined;
 
+import org.apache.wicket.Component;
+
+import org.apache.isis.applib.annotation.MemberGroupLayout.ColumnSpans;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.util.ObjectSpecifications.MemberGroupLayoutHint;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
@@ -45,8 +50,27 @@ public class EntityCombinedPanel extends PanelAbstract<EntityModel> {
             this.add(new CssClassAppender(facet.value()));
         }
 
+        final MemberGroupLayoutFacet mglFacet = model.getObject().getSpecification().getFacet(MemberGroupLayoutFacet.class);
+        final ColumnSpans columnSpans = mglFacet.getColumnSpans();
+        
         addOrReplace(ComponentType.ENTITY_SUMMARY, model);
-        addOrReplace(ComponentType.ENTITY_PROPERTIES, model);
-        addOrReplace(ComponentType.ENTITY_COLLECTIONS, model);
+        model.setMemberGroupLayoutHint(MemberGroupLayoutHint.LEFT);
+        
+        final Component leftColumn = getComponentFactoryRegistry().addOrReplaceComponent(this, "entityPropertiesLeft", ComponentType.ENTITY_PROPERTIES, model);
+        addClassForSpan(leftColumn, columnSpans.getLeft());
+        
+        if(!mglFacet.getMiddle().isEmpty()) {
+            model.setMemberGroupLayoutHint(MemberGroupLayoutHint.MIDDLE);
+            final Component middleColumn = getComponentFactoryRegistry().addOrReplaceComponent(this, "entityPropertiesMiddle", ComponentType.ENTITY_PROPERTIES, model);
+            addClassForSpan(middleColumn, columnSpans.getMiddle());
+        } else {
+            permanentlyHide("entityPropertiesMiddle");
+        }
+        final Component rightColumn = addOrReplace(ComponentType.ENTITY_COLLECTIONS, model);
+        addClassForSpan(rightColumn, columnSpans.getRight());
+    }
+
+    private static void addClassForSpan(final Component component, final int numGridCols) {
+        component.add(new CssClassAppender("span"+numGridCols));
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
index 9eccf45..49c5dc3 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
@@ -119,7 +119,7 @@ class EntityPropertiesForm extends FormAbstract<ObjectAdapter> {
         add(memberGroupRv);
 
         Map<String, List<ObjectAssociation>> associationsByGroup = ObjectAssociations.groupByMemberOrderName(associations);
-        final List<String> groupNames = ObjectSpecifications.orderByMemberGroups(objSpec, associationsByGroup.keySet());
+        final List<String> groupNames = ObjectSpecifications.orderByMemberGroups(objSpec, associationsByGroup.keySet(), entityModel.getMemberGroupLayoutHint());
         
         for(String groupName: groupNames) {
             final List<ObjectAssociation> associationsInGroup = associationsByGroup.get(groupName);
@@ -128,7 +128,6 @@ class EntityPropertiesForm extends FormAbstract<ObjectAdapter> {
             memberGroupRv.add(memberGroupRvContainer);
             memberGroupRvContainer.add(new Label(ID_MEMBER_GROUP_NAME, groupName));
 
-
             final RepeatingView propertyRv = new RepeatingView(ID_PROPERTIES);
             final EvenOrOddCssClassAppenderFactory eo = new EvenOrOddCssClassAppenderFactory();
             memberGroupRvContainer.add(propertyRv);

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesPanel.java
index 81a2310..fe9366a 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesPanel.java
@@ -19,8 +19,6 @@
 
 package org.apache.isis.viewer.wicket.ui.components.entity.properties;
 
-
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.html
index e22405a..b6ecb04 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.html
@@ -25,6 +25,7 @@
 	<wicket:head>
         <wicket:link>
     		<link href="cssreset.css" rel="stylesheet" type="text/css"/>
+    		<link href="bootstrap/css/bootstrap.css" rel="stylesheet" type="text/css"/>
     		<link href="PageAbstract.css" rel="stylesheet" type="text/css"/>
             <link href="isis-wicket-theme/jquery-ui-1.10.2.custom.css" rel="stylesheet" type="text/css"/>
             <link href="jquery.jgrowl.css" rel="stylesheet" type="text/css"/>
@@ -32,7 +33,7 @@
 		<title wicket:id="pageTitle"></title>
 	</wicket:head>
 	<body>
-		<div id="container" class="page">
+		<div id="container" class="page container-fluid">
 			<div class="headerContainer">
 				<div>
 					<h1>

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 3a5185b..0635c75 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -87,6 +87,8 @@ public abstract class PageAbstract extends WebPage {
 
     private static final JavaScriptResourceReference JQUERY_JGROWL_JS = new JavaScriptResourceReference(PageAbstract.class, "jquery.jgrowl.js");
     private static final JavaScriptResourceReference JQUERY_ISIS_WICKET_VIEWER_JS = new JavaScriptResourceReference(PageAbstract.class, "jquery.isis.wicket.viewer.js");
+    
+    //private static final JavaScriptResourceReference BOOTSTRAP_JS = new JavaScriptResourceReference(PageAbstract.class, "bootstrap/js/bootstrap.min.js");
 
     /**
      * This is a bit hacky, but best way I've found to pass an exception over to the WicketSignInPage
@@ -170,6 +172,7 @@ public abstract class PageAbstract extends WebPage {
         response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(Application.get().getJavaScriptLibrarySettings().getJQueryReference())));
         response.render(new PriorityHeaderItem(JavaScriptReferenceHeaderItem.forReference(JQUERY_JGROWL_JS)));
         response.render(new PriorityHeaderItem(JavaScriptReferenceHeaderItem.forReference(JQUERY_ISIS_WICKET_VIEWER_JS)));
+        //response.render(new PriorityHeaderItem(JavaScriptReferenceHeaderItem.forReference(BOOTSTRAP_JS)));
         
         final String feedbackMsg = JGrowlUtil.asJGrowlCalls(getMessageBroker());
         if (!StringUtils.isEmpty(feedbackMsg)) {

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/css/bootstrap.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/css/bootstrap.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/css/bootstrap.css
new file mode 100644
index 0000000..4f2027e
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/css/bootstrap.css
@@ -0,0 +1,1563 @@
+/*!
+ * Bootstrap v2.3.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+.clearfix {
+  *zoom: 1;
+}
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.clearfix:after {
+  clear: both;
+}
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+audio:not([controls]) {
+  display: none;
+}
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+a:hover,
+a:active {
+  outline: 0;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -0.5em;
+}
+sub {
+  bottom: -0.25em;
+}
+img {
+  /* Responsive images (ensure images don't scale beyond their parents) */
+
+  max-width: 100%;
+  /* Part 1: Set a maxium relative to the parent */
+
+  width: auto\9;
+  /* IE7-8 need help adjusting responsive images */
+
+  height: auto;
+  /* Part 2: Scale the height according to the width, otherwise you get stretching */
+
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+#map_canvas img,
+.google-maps img {
+  max-width: none;
+}
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer;
+}
+label,
+select,
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"],
+input[type="radio"],
+input[type="checkbox"] {
+  cursor: pointer;
+}
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+@media print {
+  * {
+    text-shadow: none !important;
+    color: #000 !important;
+    background: transparent !important;
+    box-shadow: none !important;
+  }
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+  .ir a:after,
+  a[href^="javascript:"]:after,
+  a[href^="#"]:after {
+    content: "";
+  }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  img {
+    max-width: 100% !important;
+  }
+  @page  {
+    margin: 0.5cm;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+}
+.row {
+  margin-left: -10px;
+  *zoom: 1;
+}
+.row:before,
+.row:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.row:after {
+  clear: both;
+}
+[class*="span"] {
+  float: left;
+  min-height: 1px;
+  margin-left: 10px;
+}
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 939.92px;
+}
+.span12 {
+  width: 939.92px;
+}
+.span11 {
+  width: 860.76px;
+}
+.span10 {
+  width: 781.5999999999999px;
+}
+.span9 {
+  width: 702.4399999999999px;
+}
+.span8 {
+  width: 623.28px;
+}
+.span7 {
+  width: 544.12px;
+}
+.span6 {
+  width: 464.96px;
+}
+.span5 {
+  width: 385.79999999999995px;
+}
+.span4 {
+  width: 306.64px;
+}
+.span3 {
+  width: 227.48px;
+}
+.span2 {
+  width: 148.32px;
+}
+.span1 {
+  width: 69.16px;
+}
+.offset12 {
+  margin-left: 959.92px;
+}
+.offset11 {
+  margin-left: 880.76px;
+}
+.offset10 {
+  margin-left: 801.5999999999999px;
+}
+.offset9 {
+  margin-left: 722.4399999999999px;
+}
+.offset8 {
+  margin-left: 643.28px;
+}
+.offset7 {
+  margin-left: 564.12px;
+}
+.offset6 {
+  margin-left: 484.96px;
+}
+.offset5 {
+  margin-left: 405.79999999999995px;
+}
+.offset4 {
+  margin-left: 326.64px;
+}
+.offset3 {
+  margin-left: 247.48px;
+}
+.offset2 {
+  margin-left: 168.32px;
+}
+.offset1 {
+  margin-left: 89.16px;
+}
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.row-fluid:after {
+  clear: both;
+}
+.row-fluid [class*="span"] {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  float: left;
+  margin-left: 1.0639203336454166%;
+  *margin-left: 1.0107243169631457%;
+}
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+.row-fluid .controls-row [class*="span"] + [class*="span"] {
+  margin-left: 1.0639203336454166%;
+}
+.row-fluid .span12 {
+  width: 100%;
+  *width: 99.94680398331774%;
+}
+.row-fluid .span11 {
+  width: 91.57800663886289%;
+  *width: 91.52481062218062%;
+}
+.row-fluid .span10 {
+  width: 83.15601327772576%;
+  *width: 83.1028172610435%;
+}
+.row-fluid .span9 {
+  width: 74.73401991658865%;
+  *width: 74.68082389990639%;
+}
+.row-fluid .span8 {
+  width: 66.31202655545152%;
+  *width: 66.25883053876926%;
+}
+.row-fluid .span7 {
+  width: 57.89003319431441%;
+  *width: 57.83683717763214%;
+}
+.row-fluid .span6 {
+  width: 49.468039833177286%;
+  *width: 49.414843816495015%;
+}
+.row-fluid .span5 {
+  width: 41.046046472040175%;
+  *width: 40.9928504553579%;
+}
+.row-fluid .span4 {
+  width: 32.624053110903056%;
+  *width: 32.570857094220784%;
+}
+.row-fluid .span3 {
+  width: 24.202059749765937%;
+  *width: 24.148863733083665%;
+}
+.row-fluid .span2 {
+  width: 15.78006638862882%;
+  *width: 15.726870371946548%;
+}
+.row-fluid .span1 {
+  width: 7.3580730274917014%;
+  *width: 7.304877010809431%;
+}
+.row-fluid .offset12 {
+  margin-left: 102.12784066729083%;
+  *margin-left: 102.02144863392631%;
+}
+.row-fluid .offset12:first-child {
+  margin-left: 101.06392033364541%;
+  *margin-left: 100.95752830028088%;
+}
+.row-fluid .offset11 {
+  margin-left: 93.70584730615371%;
+  *margin-left: 93.5994552727892%;
+}
+.row-fluid .offset11:first-child {
+  margin-left: 92.6419269725083%;
+  *margin-left: 92.53553493914377%;
+}
+.row-fluid .offset10 {
+  margin-left: 85.2838539450166%;
+  *margin-left: 85.17746191165206%;
+}
+.row-fluid .offset10:first-child {
+  margin-left: 84.21993361137118%;
+  *margin-left: 84.11354157800665%;
+}
+.row-fluid .offset9 {
+  margin-left: 76.86186058387949%;
+  *margin-left: 76.75546855051495%;
+}
+.row-fluid .offset9:first-child {
+  margin-left: 75.79794025023406%;
+  *margin-left: 75.69154821686953%;
+}
+.row-fluid .offset8 {
+  margin-left: 68.43986722274235%;
+  *margin-left: 68.33347518937784%;
+}
+.row-fluid .offset8:first-child {
+  margin-left: 67.37594688909694%;
+  *margin-left: 67.26955485573241%;
+}
+.row-fluid .offset7 {
+  margin-left: 60.017873861605246%;
+  *margin-left: 59.9114818282407%;
+}
+.row-fluid .offset7:first-child {
+  margin-left: 58.953953527959825%;
+  *margin-left: 58.84756149459529%;
+}
+.row-fluid .offset6 {
+  margin-left: 51.59588050046812%;
+  *margin-left: 51.48948846710358%;
+}
+.row-fluid .offset6:first-child {
+  margin-left: 50.5319601668227%;
+  *margin-left: 50.425568133458164%;
+}
+.row-fluid .offset5 {
+  margin-left: 43.17388713933101%;
+  *margin-left: 43.067495105966465%;
+}
+.row-fluid .offset5:first-child {
+  margin-left: 42.10996680568559%;
+  *margin-left: 42.00357477232105%;
+}
+.row-fluid .offset4 {
+  margin-left: 34.75189377819389%;
+  *margin-left: 34.645501744829346%;
+}
+.row-fluid .offset4:first-child {
+  margin-left: 33.687973444548476%;
+  *margin-left: 33.581581411183926%;
+}
+.row-fluid .offset3 {
+  margin-left: 26.32990041705677%;
+  *margin-left: 26.223508383692227%;
+}
+.row-fluid .offset3:first-child {
+  margin-left: 25.265980083411353%;
+  *margin-left: 25.15958805004681%;
+}
+.row-fluid .offset2 {
+  margin-left: 17.90790705591965%;
+  *margin-left: 17.801515022555108%;
+}
+.row-fluid .offset2:first-child {
+  margin-left: 16.843986722274238%;
+  *margin-left: 16.737594688909695%;
+}
+.row-fluid .offset1 {
+  margin-left: 9.485913694782536%;
+  *margin-left: 9.379521661417993%;
+}
+.row-fluid .offset1:first-child {
+  margin-left: 8.421993361137119%;
+  *margin-left: 8.315601327772576%;
+}
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+.container:before,
+.container:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.container:after {
+  clear: both;
+}
+.container-fluid {
+  padding-right: 10px;
+  padding-left: 10px;
+  *zoom: 1;
+}
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.container-fluid:after {
+  clear: both;
+}
+@-ms-viewport {
+  width: device-width;
+}
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+.visible-phone {
+  display: none !important;
+}
+.visible-tablet {
+  display: none !important;
+}
+.hidden-desktop {
+  display: none !important;
+}
+.visible-desktop {
+  display: inherit !important;
+}
+@media (min-width: 768px) and (max-width: 979px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+}
+@media (max-width: 767px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+}
+.visible-print {
+  display: none !important;
+}
+@media print {
+  .visible-print {
+    display: inherit !important;
+  }
+  .hidden-print {
+    display: none !important;
+  }
+}
+@media (max-width: 767px) {
+  body {
+    padding-left: 20px;
+    padding-right: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom,
+  .navbar-static-top {
+    margin-left: -20px;
+    margin-right: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    clear: none;
+    width: auto;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0;
+  }
+  [class*="span"],
+  .uneditable-input[class*="span"],
+  .row-fluid [class*="span"] {
+    float: none;
+    display: block;
+    width: 100%;
+    margin-left: 0;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+  }
+  .row-fluid [class*="offset"]:first-child {
+    margin-left: 0;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 0;
+  }
+  .modal {
+    position: fixed;
+    top: 20px;
+    left: 20px;
+    right: 20px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade {
+    top: -100px;
+  }
+  .modal.fade.in {
+    top: 20px;
+  }
+}
+@media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 20px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+  .media .pull-left,
+  .media .pull-right {
+    float: none;
+    display: block;
+    margin-bottom: 10px;
+  }
+  .media-object {
+    margin-right: 0;
+    margin-left: 0;
+  }
+  .modal {
+    top: 10px;
+    left: 10px;
+    right: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+@media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -10px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 10px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 759.92px;
+  }
+  .span12 {
+    width: 759.92px;
+  }
+  .span11 {
+    width: 695.76px;
+  }
+  .span10 {
+    width: 631.5999999999999px;
+  }
+  .span9 {
+    width: 567.4399999999999px;
+  }
+  .span8 {
+    width: 503.28px;
+  }
+  .span7 {
+    width: 439.12px;
+  }
+  .span6 {
+    width: 374.96px;
+  }
+  .span5 {
+    width: 310.79999999999995px;
+  }
+  .span4 {
+    width: 246.64px;
+  }
+  .span3 {
+    width: 182.48px;
+  }
+  .span2 {
+    width: 118.32px;
+  }
+  .span1 {
+    width: 54.16px;
+  }
+  .offset12 {
+    margin-left: 779.92px;
+  }
+  .offset11 {
+    margin-left: 715.76px;
+  }
+  .offset10 {
+    margin-left: 651.5999999999999px;
+  }
+  .offset9 {
+    margin-left: 587.4399999999999px;
+  }
+  .offset8 {
+    margin-left: 523.28px;
+  }
+  .offset7 {
+    margin-left: 459.12px;
+  }
+  .offset6 {
+    margin-left: 394.96px;
+  }
+  .offset5 {
+    margin-left: 330.79999999999995px;
+  }
+  .offset4 {
+    margin-left: 266.64px;
+  }
+  .offset3 {
+    margin-left: 202.48px;
+  }
+  .offset2 {
+    margin-left: 138.32px;
+  }
+  .offset1 {
+    margin-left: 74.16px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    float: left;
+    margin-left: 1.315927992420255%;
+    *margin-left: 1.262731975737984%;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 1.315927992420255%;
+  }
+  .row-fluid .span12 {
+    width: 100.00000000000001%;
+    *width: 99.94680398331775%;
+  }
+  .row-fluid .span11 {
+    width: 91.55700600063165%;
+    *width: 91.50380998394938%;
+  }
+  .row-fluid .span10 {
+    width: 83.11401200126329%;
+    *width: 83.06081598458103%;
+  }
+  .row-fluid .span9 {
+    width: 74.67101800189494%;
+    *width: 74.61782198521267%;
+  }
+  .row-fluid .span8 {
+    width: 66.22802400252658%;
+    *width: 66.17482798584432%;
+  }
+  .row-fluid .span7 {
+    width: 57.785030003158234%;
+    *width: 57.73183398647596%;
+  }
+  .row-fluid .span6 {
+    width: 49.34203600378988%;
+    *width: 49.28883998710761%;
+  }
+  .row-fluid .span5 {
+    width: 40.89904200442152%;
+    *width: 40.845845987739246%;
+  }
+  .row-fluid .span4 {
+    width: 32.45604800505316%;
+    *width: 32.40285198837089%;
+  }
+  .row-fluid .span3 {
+    width: 24.01305400568481%;
+    *width: 23.95985798900254%;
+  }
+  .row-fluid .span2 {
+    width: 15.570060006316455%;
+    *width: 15.516863989634183%;
+  }
+  .row-fluid .span1 {
+    width: 7.1270660069481%;
+    *width: 7.0738699902658295%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 102.63185598484053%;
+    *margin-left: 102.525463951476%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 101.31592799242027%;
+    *margin-left: 101.20953595905574%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 94.18886198547216%;
+    *margin-left: 94.08246995210763%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 92.8729339930519%;
+    *margin-left: 92.76654195968737%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 85.7458679861038%;
+    *margin-left: 85.63947595273928%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 84.42993999368355%;
+    *margin-left: 84.32354796031902%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 77.30287398673545%;
+    *margin-left: 77.19648195337092%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 75.98694599431519%;
+    *margin-left: 75.88055396095066%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 68.8598799873671%;
+    *margin-left: 68.75348795400257%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 67.54395199494684%;
+    *margin-left: 67.43755996158231%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 60.41688598799875%;
+    *margin-left: 60.310493954634204%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.10095799557849%;
+    *margin-left: 58.99456596221395%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 51.97389198863039%;
+    *margin-left: 51.86749995526585%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 50.657963996210135%;
+    *margin-left: 50.55157196284559%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 43.53089798926203%;
+    *margin-left: 43.42450595589749%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.21496999684177%;
+    *margin-left: 42.10857796347723%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 35.087903989893675%;
+    *margin-left: 34.98151195652913%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 33.77197599747342%;
+    *margin-left: 33.665583964108876%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 26.64490999052532%;
+    *margin-left: 26.538517957160778%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.328981998105068%;
+    *margin-left: 25.222589964740525%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 18.201915991156966%;
+    *margin-left: 18.095523957792423%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 16.88598799873671%;
+    *margin-left: 16.779595965372167%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 9.75892199178861%;
+    *margin-left: 9.652529958424068%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.442993999368355%;
+    *margin-left: 8.336601966003814%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 10px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 745.92px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 681.76px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 617.5999999999999px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 553.4399999999999px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 489.28px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 425.12px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 360.96px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 296.79999999999995px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 232.64px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 168.48px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 104.32px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 40.16px;
+  }
+}
+@media (min-width: 1200px) {
+  .row {
+    margin-left: -10px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 10px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1169.96px;
+  }
+  .span12 {
+    width: 1169.96px;
+  }
+  .span11 {
+    width: 1071.63px;
+  }
+  .span10 {
+    width: 973.3px;
+  }
+  .span9 {
+    width: 874.97px;
+  }
+  .span8 {
+    width: 776.64px;
+  }
+  .span7 {
+    width: 678.31px;
+  }
+  .span6 {
+    width: 579.98px;
+  }
+  .span5 {
+    width: 481.65px;
+  }
+  .span4 {
+    width: 383.32px;
+  }
+  .span3 {
+    width: 284.99px;
+  }
+  .span2 {
+    width: 186.66px;
+  }
+  .span1 {
+    width: 88.33px;
+  }
+  .offset12 {
+    margin-left: 1189.96px;
+  }
+  .offset11 {
+    margin-left: 1091.63px;
+  }
+  .offset10 {
+    margin-left: 993.3px;
+  }
+  .offset9 {
+    margin-left: 894.97px;
+  }
+  .offset8 {
+    margin-left: 796.64px;
+  }
+  .offset7 {
+    margin-left: 698.31px;
+  }
+  .offset6 {
+    margin-left: 599.98px;
+  }
+  .offset5 {
+    margin-left: 501.65px;
+  }
+  .offset4 {
+    margin-left: 403.32px;
+  }
+  .offset3 {
+    margin-left: 304.99px;
+  }
+  .offset2 {
+    margin-left: 206.66px;
+  }
+  .offset1 {
+    margin-left: 108.33px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    float: left;
+    margin-left: 0.8547300762419228%;
+    *margin-left: 0.801534059559652%;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 0.8547300762419228%;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680398331774%;
+  }
+  .row-fluid .span11 {
+    width: 91.59543916031316%;
+    *width: 91.5422431436309%;
+  }
+  .row-fluid .span10 {
+    width: 83.19087832062634%;
+    *width: 83.13768230394408%;
+  }
+  .row-fluid .span9 {
+    width: 74.78631748093952%;
+    *width: 74.73312146425725%;
+  }
+  .row-fluid .span8 {
+    width: 66.3817566412527%;
+    *width: 66.32856062457043%;
+  }
+  .row-fluid .span7 {
+    width: 57.97719580156586%;
+    *width: 57.92399978488359%;
+  }
+  .row-fluid .span6 {
+    width: 49.57263496187904%;
+    *width: 49.51943894519677%;
+  }
+  .row-fluid .span5 {
+    width: 41.16807412219221%;
+    *width: 41.11487810550994%;
+  }
+  .row-fluid .span4 {
+    width: 32.763513282505386%;
+    *width: 32.710317265823114%;
+  }
+  .row-fluid .span3 {
+    width: 24.35895244281856%;
+    *width: 24.305756426136288%;
+  }
+  .row-fluid .span2 {
+    width: 15.95439160313173%;
+    *width: 15.90119558644946%;
+  }
+  .row-fluid .span1 {
+    width: 7.549830763444904%;
+    *width: 7.496634746762633%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 101.70946015248384%;
+    *margin-left: 101.60306811911931%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 100.85473007624192%;
+    *margin-left: 100.74833804287739%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 93.304899312797%;
+    *margin-left: 93.19850727943248%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 92.45016923655508%;
+    *margin-left: 92.34377720319056%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 84.90033847311018%;
+    *margin-left: 84.79394643974565%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 84.04560839686826%;
+    *margin-left: 83.93921636350373%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 76.49577763342336%;
+    *margin-left: 76.38938560005883%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 75.64104755718144%;
+    *margin-left: 75.53465552381691%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 68.09121679373654%;
+    *margin-left: 67.984824760372%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 67.23648671749461%;
+    *margin-left: 67.13009468413009%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 59.686655954049705%;
+    *margin-left: 59.58026392068516%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 58.831925877807784%;
+    *margin-left: 58.72553384444324%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 51.28209511436288%;
+    *margin-left: 51.17570308099834%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 50.42736503812096%;
+    *margin-left: 50.32097300475642%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 42.87753427467605%;
+    *margin-left: 42.77114224131151%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.02280419843413%;
+    *margin-left: 41.91641216506959%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 34.47297343498923%;
+    *margin-left: 34.366581401624686%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 33.61824335874731%;
+    *margin-left: 33.511851325382764%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 26.068412595302405%;
+    *margin-left: 25.962020561937862%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.21368251906048%;
+    *margin-left: 25.107290485695938%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 17.663851755615575%;
+    *margin-left: 17.557459722251032%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 16.809121679373654%;
+    *margin-left: 16.70272964600911%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 9.25929091592875%;
+    *margin-left: 9.152898882564207%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.404560839686827%;
+    *margin-left: 8.298168806322284%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 10px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 1155.96px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 1057.63px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 959.3px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 860.97px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 762.64px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 664.31px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 565.98px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 467.65px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 369.32px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 270.99px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 172.66px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 74.33px;
+  }
+  .thumbnails {
+    margin-left: -10px;
+  }
+  .thumbnails > li {
+    margin-left: 10px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+@media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 20px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 20px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  .navbar .brand {
+    padding-left: 10px;
+    padding-right: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 10px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #777777;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: #777777;
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .nav > li > a:focus,
+  .nav-collapse .dropdown-menu a:hover,
+  .nav-collapse .dropdown-menu a:focus {
+    background-color: #f2f2f2;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a,
+  .navbar-inverse .nav-collapse .dropdown-menu a {
+    color: #999999;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .nav > li > a:focus,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:focus {
+    background-color: #111111;
+  }
+  .nav-collapse.in .btn-group {
+    margin-top: 5px;
+    padding: 0;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    float: none;
+    display: none;
+    max-width: none;
+    margin: 0 15px;
+    padding: 0;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+    -moz-border-radius: 0;
+    border-radius: 0;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+  }
+  .nav-collapse .open > .dropdown-menu {
+    display: block;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .nav > li > .dropdown-menu:before,
+  .nav-collapse .nav > li > .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 10px 15px;
+    margin: 10px 0;
+    border-top: 1px solid #f2f2f2;
+    border-bottom: 1px solid #f2f2f2;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+    -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+    box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+  }
+  .navbar-inverse .nav-collapse .navbar-form,
+  .navbar-inverse .nav-collapse .navbar-search {
+    border-top-color: #111111;
+    border-bottom-color: #111111;
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    overflow: hidden;
+    height: 0;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+}
+@media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/css/bootstrap.min.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/css/bootstrap.min.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/css/bootstrap.min.css
new file mode 100644
index 0000000..b5ab0a4
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,114 @@
+/*!
+ * Bootstrap v2.3.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
+.clearfix:after{clear:both;}
+.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
+.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
+article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
+audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
+audio:not([controls]){display:none;}
+html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
+a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+a:hover,a:active{outline:0;}
+sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
+sup{top:-0.5em;}
+sub{bottom:-0.25em;}
+img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;}
+#map_canvas img,.google-maps img{max-width:none;}
+button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
+button,input{*overflow:visible;line-height:normal;}
+button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}
+label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer;}
+input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;}
+input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
+textarea{overflow:auto;vertical-align:top;}
+@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important;} a,a:visited{text-decoration:underline;} a[href]:after{content:" (" attr(href) ")";} abbr[title]:after{content:" (" attr(title) ")";} .ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:"";} pre,blockquote{border:1px solid #999;page-break-inside:avoid;} thead{display:table-header-group;} tr,img{page-break-inside:avoid;} img{max-width:100% !important;} @page {margin:0.5cm;}p,h2,h3{orphans:3;widows:3;} h2,h3{page-break-after:avoid;}}.row{margin-left:-10px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;}
+.row:after{clear:both;}
+[class*="span"]{float:left;min-height:1px;margin-left:10px;}
+.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:939.92px;}
+.span12{width:939.92px;}
+.span11{width:860.76px;}
+.span10{width:781.5999999999999px;}
+.span9{width:702.4399999999999px;}
+.span8{width:623.28px;}
+.span7{width:544.12px;}
+.span6{width:464.96px;}
+.span5{width:385.79999999999995px;}
+.span4{width:306.64px;}
+.span3{width:227.48px;}
+.span2{width:148.32px;}
+.span1{width:69.16px;}
+.offset12{margin-left:959.92px;}
+.offset11{margin-left:880.76px;}
+.offset10{margin-left:801.5999999999999px;}
+.offset9{margin-left:722.4399999999999px;}
+.offset8{margin-left:643.28px;}
+.offset7{margin-left:564.12px;}
+.offset6{margin-left:484.96px;}
+.offset5{margin-left:405.79999999999995px;}
+.offset4{margin-left:326.64px;}
+.offset3{margin-left:247.48px;}
+.offset2{margin-left:168.32px;}
+.offset1{margin-left:89.16px;}
+.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
+.row-fluid:after{clear:both;}
+.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:1.0639203336454166%;*margin-left:1.0107243169631457%;}
+.row-fluid [class*="span"]:first-child{margin-left:0;}
+.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:1.0639203336454166%;}
+.row-fluid .span12{width:100%;*width:99.94680398331774%;}
+.row-fluid .span11{width:91.57800663886289%;*width:91.52481062218062%;}
+.row-fluid .span10{width:83.15601327772576%;*width:83.1028172610435%;}
+.row-fluid .span9{width:74.73401991658865%;*width:74.68082389990639%;}
+.row-fluid .span8{width:66.31202655545152%;*width:66.25883053876926%;}
+.row-fluid .span7{width:57.89003319431441%;*width:57.83683717763214%;}
+.row-fluid .span6{width:49.468039833177286%;*width:49.414843816495015%;}
+.row-fluid .span5{width:41.046046472040175%;*width:40.9928504553579%;}
+.row-fluid .span4{width:32.624053110903056%;*width:32.570857094220784%;}
+.row-fluid .span3{width:24.202059749765937%;*width:24.148863733083665%;}
+.row-fluid .span2{width:15.78006638862882%;*width:15.726870371946548%;}
+.row-fluid .span1{width:7.3580730274917014%;*width:7.304877010809431%;}
+.row-fluid .offset12{margin-left:102.12784066729083%;*margin-left:102.02144863392631%;}
+.row-fluid .offset12:first-child{margin-left:101.06392033364541%;*margin-left:100.95752830028088%;}
+.row-fluid .offset11{margin-left:93.70584730615371%;*margin-left:93.5994552727892%;}
+.row-fluid .offset11:first-child{margin-left:92.6419269725083%;*margin-left:92.53553493914377%;}
+.row-fluid .offset10{margin-left:85.2838539450166%;*margin-left:85.17746191165206%;}
+.row-fluid .offset10:first-child{margin-left:84.21993361137118%;*margin-left:84.11354157800665%;}
+.row-fluid .offset9{margin-left:76.86186058387949%;*margin-left:76.75546855051495%;}
+.row-fluid .offset9:first-child{margin-left:75.79794025023406%;*margin-left:75.69154821686953%;}
+.row-fluid .offset8{margin-left:68.43986722274235%;*margin-left:68.33347518937784%;}
+.row-fluid .offset8:first-child{margin-left:67.37594688909694%;*margin-left:67.26955485573241%;}
+.row-fluid .offset7{margin-left:60.017873861605246%;*margin-left:59.9114818282407%;}
+.row-fluid .offset7:first-child{margin-left:58.953953527959825%;*margin-left:58.84756149459529%;}
+.row-fluid .offset6{margin-left:51.59588050046812%;*margin-left:51.48948846710358%;}
+.row-fluid .offset6:first-child{margin-left:50.5319601668227%;*margin-left:50.425568133458164%;}
+.row-fluid .offset5{margin-left:43.17388713933101%;*margin-left:43.067495105966465%;}
+.row-fluid .offset5:first-child{margin-left:42.10996680568559%;*margin-left:42.00357477232105%;}
+.row-fluid .offset4{margin-left:34.75189377819389%;*margin-left:34.645501744829346%;}
+.row-fluid .offset4:first-child{margin-left:33.687973444548476%;*margin-left:33.581581411183926%;}
+.row-fluid .offset3{margin-left:26.32990041705677%;*margin-left:26.223508383692227%;}
+.row-fluid .offset3:first-child{margin-left:25.265980083411353%;*margin-left:25.15958805004681%;}
+.row-fluid .offset2{margin-left:17.90790705591965%;*margin-left:17.801515022555108%;}
+.row-fluid .offset2:first-child{margin-left:16.843986722274238%;*margin-left:16.737594688909695%;}
+.row-fluid .offset1{margin-left:9.485913694782536%;*margin-left:9.379521661417993%;}
+.row-fluid .offset1:first-child{margin-left:8.421993361137119%;*margin-left:8.315601327772576%;}
+[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;}
+[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;}
+.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;}
+.container:after{clear:both;}
+.container-fluid{padding-right:10px;padding-left:10px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;}
+.container-fluid:after{clear:both;}
+@-ms-viewport{width:device-width;}.hidden{display:none;visibility:hidden;}
+.visible-phone{display:none !important;}
+.visible-tablet{display:none !important;}
+.hidden-desktop{display:none !important;}
+.visible-desktop{display:inherit !important;}
+@media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}.visible-print{display:none !important;}
+@media print{.visible-print{display:inherit !important;} .hidden-print{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-left:-20px;margin-right:-20px;} .container-fluid{padding:0;} .dl-horizontal dt{float:none;clear:none;width:auto;text-align:left;} .dl-horizontal dd{margin-left:0;} .container{width:auto;} .row-fluid{width:100%;} .row,.thumbnails{margin-left:0;} .thumbnails>li{float:none;margin-left:0;} [class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .row-fluid [class*="offset"]:first-child{margin-left:0;} .input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[cl
 ass*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto;} .controls-row [class*="span"]+[class*="span"]{margin-left:0;} .modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0;}.modal.fade{top:-100px;} .modal.fade.in{top:20px;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:20px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .media .pull-left,.media .pull-right{float:none;display:block;ma
 rgin-bottom:10px;} .media-object{margin-right:0;margin-left:0;} .modal{top:10px;left:10px;right:10px;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-10px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:10px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:759.92px;} .span12{width:759.92px;} .span11{width:695.76px;} .span10{width:631.5999999999999px;} .span9{width:567.4399999999999px;} .span8{width:503.28px;} .span7{width:439.12px;} .span6{width:374.96px;} .span5{width:310.79999999999995px;} .span4{width:246.64px;} .span3{width:182.48px;} .span2{width:118.32px;} .span1{width:54.16px;} .offset12{margin-left:779.92px;} .offset11{margin-left:715.76px;} .offset10{margin-left:651.5999999999999px;} .offset9{margin-left:587.439
 9999999999px;} .offset8{margin-left:523.28px;} .offset7{margin-left:459.12px;} .offset6{margin-left:394.96px;} .offset5{margin-left:330.79999999999995px;} .offset4{margin-left:266.64px;} .offset3{margin-left:202.48px;} .offset2{margin-left:138.32px;} .offset1{margin-left:74.16px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:1.315927992420255%;*margin-left:1.262731975737984%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:1.315927992420255%;} .row-fluid .span12{width:100.00000000000001%;*width:99.94680398331775%;} .row-fluid .span11{width:91.55700600063165%;*width:91.50380998394938%;} .row-fluid .span10{width:83.11401200126329%;*width:83.06081598458
 103%;} .row-fluid .span9{width:74.67101800189494%;*width:74.61782198521267%;} .row-fluid .span8{width:66.22802400252658%;*width:66.17482798584432%;} .row-fluid .span7{width:57.785030003158234%;*width:57.73183398647596%;} .row-fluid .span6{width:49.34203600378988%;*width:49.28883998710761%;} .row-fluid .span5{width:40.89904200442152%;*width:40.845845987739246%;} .row-fluid .span4{width:32.45604800505316%;*width:32.40285198837089%;} .row-fluid .span3{width:24.01305400568481%;*width:23.95985798900254%;} .row-fluid .span2{width:15.570060006316455%;*width:15.516863989634183%;} .row-fluid .span1{width:7.1270660069481%;*width:7.0738699902658295%;} .row-fluid .offset12{margin-left:102.63185598484053%;*margin-left:102.525463951476%;} .row-fluid .offset12:first-child{margin-left:101.31592799242027%;*margin-left:101.20953595905574%;} .row-fluid .offset11{margin-left:94.18886198547216%;*margin-left:94.08246995210763%;} .row-fluid .offset11:first-child{margin-left:92.8729339930519%;*margin-left:
 92.76654195968737%;} .row-fluid .offset10{margin-left:85.7458679861038%;*margin-left:85.63947595273928%;} .row-fluid .offset10:first-child{margin-left:84.42993999368355%;*margin-left:84.32354796031902%;} .row-fluid .offset9{margin-left:77.30287398673545%;*margin-left:77.19648195337092%;} .row-fluid .offset9:first-child{margin-left:75.98694599431519%;*margin-left:75.88055396095066%;} .row-fluid .offset8{margin-left:68.8598799873671%;*margin-left:68.75348795400257%;} .row-fluid .offset8:first-child{margin-left:67.54395199494684%;*margin-left:67.43755996158231%;} .row-fluid .offset7{margin-left:60.41688598799875%;*margin-left:60.310493954634204%;} .row-fluid .offset7:first-child{margin-left:59.10095799557849%;*margin-left:58.99456596221395%;} .row-fluid .offset6{margin-left:51.97389198863039%;*margin-left:51.86749995526585%;} .row-fluid .offset6:first-child{margin-left:50.657963996210135%;*margin-left:50.55157196284559%;} .row-fluid .offset5{margin-left:43.53089798926203%;*margin-left:
 43.42450595589749%;} .row-fluid .offset5:first-child{margin-left:42.21496999684177%;*margin-left:42.10857796347723%;} .row-fluid .offset4{margin-left:35.087903989893675%;*margin-left:34.98151195652913%;} .row-fluid .offset4:first-child{margin-left:33.77197599747342%;*margin-left:33.665583964108876%;} .row-fluid .offset3{margin-left:26.64490999052532%;*margin-left:26.538517957160778%;} .row-fluid .offset3:first-child{margin-left:25.328981998105068%;*margin-left:25.222589964740525%;} .row-fluid .offset2{margin-left:18.201915991156966%;*margin-left:18.095523957792423%;} .row-fluid .offset2:first-child{margin-left:16.88598799873671%;*margin-left:16.779595965372167%;} .row-fluid .offset1{margin-left:9.75892199178861%;*margin-left:9.652529958424068%;} .row-fluid .offset1:first-child{margin-left:8.442993999368355%;*margin-left:8.336601966003814%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:10px;} input.span12,textarea.span12,.
 uneditable-input.span12{width:745.92px;} input.span11,textarea.span11,.uneditable-input.span11{width:681.76px;} input.span10,textarea.span10,.uneditable-input.span10{width:617.5999999999999px;} input.span9,textarea.span9,.uneditable-input.span9{width:553.4399999999999px;} input.span8,textarea.span8,.uneditable-input.span8{width:489.28px;} input.span7,textarea.span7,.uneditable-input.span7{width:425.12px;} input.span6,textarea.span6,.uneditable-input.span6{width:360.96px;} input.span5,textarea.span5,.uneditable-input.span5{width:296.79999999999995px;} input.span4,textarea.span4,.uneditable-input.span4{width:232.64px;} input.span3,textarea.span3,.uneditable-input.span3{width:168.48px;} input.span2,textarea.span2,.uneditable-input.span2{width:104.32px;} input.span1,textarea.span1,.uneditable-input.span1{width:40.16px;}}@media (min-width:1200px){.row{margin-left:-10px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:l
 eft;min-height:1px;margin-left:10px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1169.96px;} .span12{width:1169.96px;} .span11{width:1071.63px;} .span10{width:973.3px;} .span9{width:874.97px;} .span8{width:776.64px;} .span7{width:678.31px;} .span6{width:579.98px;} .span5{width:481.65px;} .span4{width:383.32px;} .span3{width:284.99px;} .span2{width:186.66px;} .span1{width:88.33px;} .offset12{margin-left:1189.96px;} .offset11{margin-left:1091.63px;} .offset10{margin-left:993.3px;} .offset9{margin-left:894.97px;} .offset8{margin-left:796.64px;} .offset7{margin-left:698.31px;} .offset6{margin-left:599.98px;} .offset5{margin-left:501.65px;} .offset4{margin-left:403.32px;} .offset3{margin-left:304.99px;} .offset2{margin-left:206.66px;} .offset1{margin-left:108.33px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="spa
 n"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:0.8547300762419228%;*margin-left:0.801534059559652%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:0.8547300762419228%;} .row-fluid .span12{width:100%;*width:99.94680398331774%;} .row-fluid .span11{width:91.59543916031316%;*width:91.5422431436309%;} .row-fluid .span10{width:83.19087832062634%;*width:83.13768230394408%;} .row-fluid .span9{width:74.78631748093952%;*width:74.73312146425725%;} .row-fluid .span8{width:66.3817566412527%;*width:66.32856062457043%;} .row-fluid .span7{width:57.97719580156586%;*width:57.92399978488359%;} .row-fluid .span6{width:49.57263496187904%;*width:49.51943894519677%;} .row-fluid .span5{width:41.16807412219221%;*width:41.11487810550994%;} .row-fluid .span4{width:32.763513282505386%;*width:32.710317265823114%;} .row-fluid .span3{widt
 h:24.35895244281856%;*width:24.305756426136288%;} .row-fluid .span2{width:15.95439160313173%;*width:15.90119558644946%;} .row-fluid .span1{width:7.549830763444904%;*width:7.496634746762633%;} .row-fluid .offset12{margin-left:101.70946015248384%;*margin-left:101.60306811911931%;} .row-fluid .offset12:first-child{margin-left:100.85473007624192%;*margin-left:100.74833804287739%;} .row-fluid .offset11{margin-left:93.304899312797%;*margin-left:93.19850727943248%;} .row-fluid .offset11:first-child{margin-left:92.45016923655508%;*margin-left:92.34377720319056%;} .row-fluid .offset10{margin-left:84.90033847311018%;*margin-left:84.79394643974565%;} .row-fluid .offset10:first-child{margin-left:84.04560839686826%;*margin-left:83.93921636350373%;} .row-fluid .offset9{margin-left:76.49577763342336%;*margin-left:76.38938560005883%;} .row-fluid .offset9:first-child{margin-left:75.64104755718144%;*margin-left:75.53465552381691%;} .row-fluid .offset8{margin-left:68.09121679373654%;*margin-left:67.98
 4824760372%;} .row-fluid .offset8:first-child{margin-left:67.23648671749461%;*margin-left:67.13009468413009%;} .row-fluid .offset7{margin-left:59.686655954049705%;*margin-left:59.58026392068516%;} .row-fluid .offset7:first-child{margin-left:58.831925877807784%;*margin-left:58.72553384444324%;} .row-fluid .offset6{margin-left:51.28209511436288%;*margin-left:51.17570308099834%;} .row-fluid .offset6:first-child{margin-left:50.42736503812096%;*margin-left:50.32097300475642%;} .row-fluid .offset5{margin-left:42.87753427467605%;*margin-left:42.77114224131151%;} .row-fluid .offset5:first-child{margin-left:42.02280419843413%;*margin-left:41.91641216506959%;} .row-fluid .offset4{margin-left:34.47297343498923%;*margin-left:34.366581401624686%;} .row-fluid .offset4:first-child{margin-left:33.61824335874731%;*margin-left:33.511851325382764%;} .row-fluid .offset3{margin-left:26.068412595302405%;*margin-left:25.962020561937862%;} .row-fluid .offset3:first-child{margin-left:25.21368251906048%;*mar
 gin-left:25.107290485695938%;} .row-fluid .offset2{margin-left:17.663851755615575%;*margin-left:17.557459722251032%;} .row-fluid .offset2:first-child{margin-left:16.809121679373654%;*margin-left:16.70272964600911%;} .row-fluid .offset1{margin-left:9.25929091592875%;*margin-left:9.152898882564207%;} .row-fluid .offset1:first-child{margin-left:8.404560839686827%;*margin-left:8.298168806322284%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:10px;} input.span12,textarea.span12,.uneditable-input.span12{width:1155.96px;} input.span11,textarea.span11,.uneditable-input.span11{width:1057.63px;} input.span10,textarea.span10,.uneditable-input.span10{width:959.3px;} input.span9,textarea.span9,.uneditable-input.span9{width:860.97px;} input.span8,textarea.span8,.uneditable-input.span8{width:762.64px;} input.span7,textarea.span7,.uneditable-input.span7{width:664.31px;} input.span6,textarea.span6,.uneditable-input.span6{width:565.98px;} 
 input.span5,textarea.span5,.uneditable-input.span5{width:467.65px;} input.span4,textarea.span4,.uneditable-input.span4{width:369.32px;} input.span3,textarea.span3,.uneditable-input.span3{width:270.99px;} input.span2,textarea.span2,.uneditable-input.span2{width:172.66px;} input.span1,textarea.span1,.uneditable-input.span1{width:74.33px;} .thumbnails{margin-left:-10px;} .thumbnails>li{margin-left:10px;} .row-fluid .thumbnails{margin-left:0;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:static;} .navbar-fixed-top{margin-bottom:20px;} .navbar-fixed-bottom{margin-top:20px;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .nav-collapse{clear:both;} .nav-collapse .nav{float:none;margin:0 0 10px;} .nav-collapse .nav>li{float:none;} .nav-collapse .nav>li>a{margin-bottom:2px;} .nav-collapse .nav>.div
 ider-vertical{display:none;} .nav-collapse .nav .nav-header{color:#777777;text-shadow:none;} .nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-collapse .dropdown-menu li+li a{margin-bottom:2px;} .nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2;} .navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999999;} .navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111111;} .nav-collapse.in .btn-group{margin-top:5px;padding:0;} .na
 v-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:none;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .nav-collapse .open>.dropdown-menu{display:block;} .nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none;} .nav-collapse .dropdown-menu .divider{display:none;} .nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none;} .nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);} .navbar-inver
 se .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111;} .navbar .nav-collapse .nav.pull-right{float:none;margin-left:0;} .nav-collapse,.nav-collapse.collapse{overflow:hidden;height:0;} .navbar .btn-navbar{display:block;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}}

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/img/glyphicons-halflings-white.png
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/img/glyphicons-halflings-white.png b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/img/glyphicons-halflings-white.png
new file mode 100644
index 0000000..3bf6484
Binary files /dev/null and b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/img/glyphicons-halflings-white.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/img/glyphicons-halflings.png
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/img/glyphicons-halflings.png b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/img/glyphicons-halflings.png
new file mode 100644
index 0000000..a996999
Binary files /dev/null and b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap/img/glyphicons-halflings.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroupLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroupLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroupLayout.java
new file mode 100644
index 0000000..7441e86
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroupLayout.java
@@ -0,0 +1,116 @@
+/*
+ *  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 org.apache.isis.applib.annotation;
+
+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;
+
+/**
+ * A successor to {@link MemberGroups}, specifying the (groups of) members in a page,
+ * column by column. 
+ * 
+ * <p>
+ * The left column and middle column determine the ordering of the entity's properties.  The
+ * value of the {@link #left() left} list and {@link #middle() middle} list specify the order
+ * of the property groups (inferred from each property's {@link MemberOrder#name() MemberOrder.name} attribute.
+ * 
+ * <p>
+ * The right column is for the entity's collections.  The order of this collections is simply as
+ * determined by the collection's {@link MemberOrder#sequence() MemberOrder.sequence} attribute
+ * 
+ * <p>
+ * If both this annotation, {@link MemberGroupLayout}, and {@link MemberGroups} annotation
+ * are present on an entity, then this one takes precedence.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MemberGroupLayout {
+
+    public enum ColumnSpans {
+        _2_0_10(2,0,10),
+        _3_0_9(3,0,9),
+        _4_0_8(4,0,8),
+        _5_0_7(5,0,7),
+        _6_0_6(6,0,6),
+        _3_3_6(3,3,6),
+        _2_3_7(2,3,7),
+        _2_4_6(2,4,6),
+        _4_4_4(4,4,4);
+        
+        private int left;
+        private int middle;
+        private int right;
+
+        private ColumnSpans(int left, int middle, int right) {
+            this.left = left;
+            this.middle = middle;
+            this.right = right;
+        }
+
+        public int getLeft() {
+            return left;
+        }
+        public int getMiddle() {
+            return middle;
+        }
+        public int getRight() {
+            return right;
+        }
+        
+    }
+
+    /**
+     * Specify the spans of each of the <i>left</i>_<i>middle</i>_<i>right</i> columns.
+     * 
+     * <p>
+     * The sum of the spans is always 12.
+     */
+    ColumnSpans columnSpans() default ColumnSpans._4_0_8;
+
+    /**
+     * Order of groups of properties as they appear in the left-most column of a webpage,
+     * grouped as they appear as the <tt>name</tt> attribute of the {@link MemberOrder} 
+     * annotation.
+     * 
+     * <p>
+     * The order in this list determines the order that the property groups will be rendered.  
+     * By convention any {@link MemberOrder} that does not have a {@link MemberOrder#name() name} is considered
+     * to be in the default group, whose name is hard-coded as <i>General</i>.
+     * 
+     * <p>
+     * Equivalent to {@link MemberGroups#value()} annotation.
+     */
+    String[] left() default {};
+
+    /**
+     * As {@link #left()}, but for the middle column in a page.
+     * 
+     * <p>
+     * If the value of this attribute is non-empty but the {@link #columnSpans()} specifies a zero size
+     * (eg {@link ColumnSpans#_2_0_10}, then the framework will not boot and will instead indicate 
+     * a meta-model validation exception. 
+     */
+    String[] middle() default {};
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java
index e643c95..92cc35e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java
@@ -25,22 +25,31 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+/**
+ * Names of groups of properties, as they appear as the <tt>name</tt> attribute
+ * of the {@link MemberOrder} annotation.
+ * 
+ * <p>
+ * The order in this list determines the order that the property groups will be
+ * rendered. By convention any {@link MemberOrder} that does not have a
+ * {@link MemberOrder#name() name} is considered to be in the default group,
+ * whose name is hard-coded as <i>General</i>.
+ * 
+ * <p>
+ * In the case of the Wicket viewer, these property groups are rendered down the
+ * left hand side.
+ * 
+ * @deprecated - use {@link MemberGroupLayout} instead. If both annotations are
+ *             present, then {@link MemberGroupLayout} takes precedence.
+ */
 @Inherited
 @Target({ ElementType.TYPE })
 @Retention(RetentionPolicy.RUNTIME)
+@Deprecated
 public @interface MemberGroups {
 
     /**
-     * Names of groups of properties, as they appear as the <tt>name</tt> attribute of the 
-     * {@link MemberOrder} annotation.
-     * 
-     * <p>
-     * The order in this list determines the order that the property groups will be rendered.  By convention
-     * any {@link MemberOrder} that does not have a {@link MemberOrder#name() name} is considered
-     * to be in the default group, whose name is hard-coded as <i>General</i>.
-     * 
-     * <p>
-     * In the case of the Wicket viewer, these property groups are rendered down the left hand side.
+     * Specifies the order of the member groups.
      */
     String[] value() default {};
 

http://git-wip-us.apache.org/repos/asf/isis/blob/ec1646f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/MemberGroupLayoutFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/MemberGroupLayoutFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/MemberGroupLayoutFacet.java
new file mode 100644
index 0000000..409c1ab
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/MemberGroupLayoutFacet.java
@@ -0,0 +1,46 @@
+/*
+ *  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 org.apache.isis.core.metamodel.facets.object.membergroups;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.MemberGroupLayout.ColumnSpans;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
+
+/**
+ * Indicates the (column) layout of property groups (as defined by {@link MemberOrderFacet})
+ * and collections.
+ * 
+ * <p>
+ * Corresponds to the {@link MemberGroupsFacet} annotation in the applib.
+ */
+public interface MemberGroupLayoutFacet extends Facet {
+
+    /**
+     * The default group for properties if not otherwise specified.
+     */
+    public final static String DEFAULT_GROUP = "General";
+
+    public ColumnSpans getColumnSpans();
+
+    public List<String> getLeft();
+    public List<String> getMiddle();
+}