You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by hn...@apache.org on 2021/03/30 10:59:32 UTC

[myfaces-tobago] branch master updated: feature(attribute): auto spacing

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

hnoeth pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces-tobago.git


The following commit(s) were added to refs/heads/master by this push:
     new 186b2af  feature(attribute): auto spacing
186b2af is described below

commit 186b2af6e4ba3b246349bd5930ee08de0494bae8
Author: Henning Noeth <hn...@apache.org>
AuthorDate: Fri Mar 26 20:40:26 2021 +0100

    feature(attribute): auto spacing
    
    * implement auto spacing for:
      * labelLayout components
      * buttons and links
      * button and link groups
      * box
      * tab group
    * add interfaces with default method for getAutoSpacing
    * add insideBegin/End for tc:header, tc:footer, tc:sheet, label facet, bar facet, before/after facet
    * rename .tobago-margin-bottom to a more general .tobago-auto-spacing
    * remove margin-bottom style from tobago-box/tobago-tab-group; this is now done by
      .tobago-auto-spacing class
    * adjust tests
---
 .../myfaces/tobago/component/Attributes.java       |  1 +
 .../tobago/component/SupportsAutoSpacing.java      | 51 ++++++++++++++++++++++
 .../tobago/internal/component/AbstractUIBox.java   |  4 +-
 .../internal/component/AbstractUIButtons.java      |  3 +-
 .../internal/component/AbstractUICommand.java      |  3 +-
 .../tobago/internal/component/AbstractUIFile.java  |  3 +-
 .../tobago/internal/component/AbstractUIInput.java |  4 +-
 .../tobago/internal/component/AbstractUILinks.java |  3 +-
 .../tobago/internal/component/AbstractUIOut.java   |  3 +-
 .../component/AbstractUISelectBoolean.java         |  4 +-
 .../component/AbstractUISelectManyBase.java        |  3 +-
 .../component/AbstractUISelectOneBase.java         |  3 +-
 .../internal/component/AbstractUITabGroup.java     |  3 +-
 .../internal/renderkit/renderer/BarRenderer.java   |  2 +
 .../internal/renderkit/renderer/BoxRenderer.java   |  6 +++
 .../renderkit/renderer/ButtonsRenderer.java        |  2 +
 .../renderkit/renderer/CommandRendererBase.java    |  2 +
 .../renderkit/renderer/FigureRenderer.java         |  2 +
 .../renderkit/renderer/FooterRenderer.java         |  2 +
 .../renderkit/renderer/HeaderRenderer.java         |  2 +
 .../internal/renderkit/renderer/InRenderer.java    |  8 +---
 .../renderer/LabelLayoutRendererBase.java          |  6 ++-
 .../internal/renderkit/renderer/LinksRenderer.java |  3 ++
 .../renderer/MessageLayoutRendererBase.java        |  3 +-
 .../renderkit/renderer/SectionRenderer.java        |  4 ++
 .../internal/renderkit/renderer/SheetRenderer.java |  2 +
 .../renderkit/renderer/TabGroupRenderer.java       |  6 +++
 .../taglib/component/BoxTagDeclaration.java        |  3 +-
 .../taglib/component/ButtonTagDeclaration.java     |  3 +-
 .../taglib/component/ButtonsTagDeclaration.java    |  3 +-
 .../taglib/component/DateTagDeclaration.java       |  3 +-
 .../taglib/component/FileTagDeclaration.java       |  4 +-
 .../taglib/component/InTagDeclaration.java         |  3 +-
 .../taglib/component/LinkTagDeclaration.java       |  3 +-
 .../taglib/component/LinksTagDeclaration.java      |  3 +-
 .../taglib/component/OutTagDeclaration.java        |  3 +-
 .../taglib/component/RangeTagDeclaration.java      |  3 +-
 .../SelectBooleanCheckboxTagDeclaration.java       |  3 +-
 .../SelectBooleanToggleTagDeclaration.java         |  3 +-
 .../SelectManyCheckboxTagDeclaration.java          |  4 +-
 .../component/SelectManyListboxTagDeclaration.java |  4 +-
 .../component/SelectManyShuttleTagDeclaration.java |  4 +-
 .../component/SelectOneChoiceTagDeclaration.java   |  3 +-
 .../component/SelectOneListboxTagDeclaration.java  |  3 +-
 .../component/SelectOneRadioTagDeclaration.java    |  3 +-
 .../taglib/component/StarsTagDeclaration.java      |  4 +-
 .../taglib/component/TabGroupTagDeclaration.java   |  4 +-
 .../taglib/component/TextareaTagDeclaration.java   |  3 +-
 .../declaration/HasAutoSpacing.java}               | 27 +++++++++---
 .../myfaces/tobago/renderkit/css/TobagoClass.java  |  3 +-
 .../resources/renderer/box/box-label-facet.html    |  2 +-
 .../src/test/resources/renderer/box/box-label.html |  2 +-
 .../src/test/resources/renderer/box/simple.html    |  2 +-
 .../renderer/buttons/badge-inside-buttons.html     |  2 +-
 .../renderer/buttons/separator-inside-buttons.html |  2 +-
 .../test/resources/renderer/date/date-label.html   |  2 +-
 .../resources/renderer/date/date-today-button.html |  2 +-
 .../src/test/resources/renderer/date/date.html     |  2 +-
 .../test/resources/renderer/file/file-label.html   |  2 +-
 .../src/test/resources/renderer/in/ajax.html       |  4 +-
 .../test/resources/renderer/in/error-message.html  |  2 +-
 .../src/test/resources/renderer/in/help.html       |  2 +-
 .../renderer/in/input-group-button-after.html      |  2 +-
 .../renderer/in/input-group-button-before.html     |  2 +-
 .../renderer/in/input-group-choice-after.html      |  4 +-
 .../renderer/in/input-group-dropdown-after.html    |  2 +-
 .../renderer/in/input-group-dropdown-before.html   |  2 +-
 .../renderer/in/input-group-out-after.html         |  2 +-
 .../renderer/in/input-group-out-before.html        |  2 +-
 .../test/resources/renderer/in/label-flexLeft.html |  2 +-
 .../resources/renderer/in/label-flexRight.html     |  2 +-
 .../test/resources/renderer/in/label-flowLeft.html |  2 +-
 .../resources/renderer/in/label-flowRight.html     |  2 +-
 .../resources/renderer/in/label-gridBottom.html    |  2 +-
 .../test/resources/renderer/in/label-gridLeft.html |  2 +-
 .../resources/renderer/in/label-gridRight.html     |  2 +-
 .../test/resources/renderer/in/label-gridTop.html  |  2 +-
 .../src/test/resources/renderer/in/label-none.html |  2 +-
 .../resources/renderer/in/label-segmentLeft.html   |  2 +-
 .../resources/renderer/in/label-segmentRight.html  |  2 +-
 .../src/test/resources/renderer/in/label-skip.html |  2 +-
 .../src/test/resources/renderer/in/label-top.html  |  2 +-
 .../src/test/resources/renderer/in/simple.html     |  2 +-
 .../resources/renderer/link/booleanInsideLink.html |  2 +-
 .../src/test/resources/renderer/link/link.html     |  2 +-
 .../resources/renderer/link/manyInsideLink.html    |  2 +-
 .../resources/renderer/link/radioInsideLink.html   |  2 +-
 .../renderer/link/separatorInsideLink.html         |  2 +-
 .../renderer/links/link-inside-links-sub.html      |  2 +-
 .../renderer/links/link-inside-links.html          |  2 +-
 .../test/resources/renderer/range/range-label.html |  2 +-
 .../selectBooleanCheckboxItemLabel.html            |  2 +-
 .../selectBooleanCheckboxLabel.html                |  2 +-
 .../selectBooleanToggleItemLabel.html              |  2 +-
 .../selectBooleanToggleLabel.html                  |  2 +-
 .../selectOneChoice/selectOneChoiceLabel.html      |  2 +-
 .../selectOneRadio/selectOneRadioLabel.html        |  2 +-
 .../resources/renderer/textarea/with-label.html    |  2 +-
 tobago-theme/src/main/scss/_tobago.scss            | 22 +++-------
 99 files changed, 245 insertions(+), 114 deletions(-)

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Attributes.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Attributes.java
index 88e1350..b771662 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Attributes.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Attributes.java
@@ -39,6 +39,7 @@ public enum Attributes {
   alt,
   autocomplete,
   autoReload,
+  autoSpacing,
   backgroundImage,
   bodyContent,
   border,
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/component/SupportsAutoSpacing.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/component/SupportsAutoSpacing.java
new file mode 100644
index 0000000..6d74baf
--- /dev/null
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/component/SupportsAutoSpacing.java
@@ -0,0 +1,51 @@
+/*
+ * 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.myfaces.tobago.component;
+
+import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
+
+import javax.faces.context.FacesContext;
+import java.util.Map;
+
+public interface SupportsAutoSpacing {
+  /**
+   * use {@link #getAutoSpacing(FacesContext)} to get the correct default value.
+   * return null if autoSpacing is not set manually
+   */
+  Boolean getAutoSpacing();
+
+  default boolean getAutoSpacing(final FacesContext facesContext) {
+    Boolean autoSpacing = getAutoSpacing();
+    if (autoSpacing != null) {
+      return autoSpacing;
+    } else {
+      final Map<Object, Object> attributes = facesContext.getAttributes();
+      return attributes.get(HtmlElements.TOBAGO_HEADER) == null
+          && attributes.get(HtmlElements.TOBAGO_FOOTER) == null
+          && attributes.get(HtmlElements.TOBAGO_SHEET) == null
+          && attributes.get(HtmlElements.TOBAGO_LINKS) == null
+          && attributes.get(HtmlElements.TOBAGO_BUTTONS) == null
+          && attributes.get(Facets.before) == null
+          && attributes.get(Facets.after) == null
+          && attributes.get(Facets.label) == null
+          && attributes.get(Facets.bar) == null;
+    }
+  }
+}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java
index 0ec8ef3..f9bf56b 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java
@@ -19,10 +19,12 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
+
 /**
  * {@link org.apache.myfaces.tobago.internal.taglib.component.BoxTagDeclaration}
  */
-public abstract class AbstractUIBox extends AbstractUICollapsiblePanel {
+public abstract class AbstractUIBox extends AbstractUICollapsiblePanel implements SupportsAutoSpacing {
 
   public abstract String getLabel();
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIButtons.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIButtons.java
index 357ff5f..655beb9 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIButtons.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIButtons.java
@@ -19,13 +19,14 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.SupportsDisabled;
 import org.apache.myfaces.tobago.layout.Orientation;
 
 /**
  * {@link org.apache.myfaces.tobago.internal.taglib.component.ButtonsTagDeclaration}
  */
-public abstract class AbstractUIButtons extends AbstractUIPanelBase implements SupportsDisabled {
+public abstract class AbstractUIButtons extends AbstractUIPanelBase implements SupportsAutoSpacing, SupportsDisabled {
 
   enum PropertyKeys {
     disabled,
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommand.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommand.java
index fc08d22..a3b4dd6 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommand.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUICommand.java
@@ -21,6 +21,7 @@ package org.apache.myfaces.tobago.internal.component;
 
 import org.apache.myfaces.tobago.component.SupportFieldId;
 import org.apache.myfaces.tobago.component.SupportsAccessKey;
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.Visual;
 import org.apache.myfaces.tobago.util.ComponentUtils;
 
@@ -34,7 +35,7 @@ import javax.faces.context.FacesContext;
  * Base class for commands.
  */
 public abstract class AbstractUICommand extends AbstractUICommandBase
-    implements SupportsAccessKey, Visual, ClientBehaviorHolder, SupportFieldId {
+    implements SupportsAutoSpacing, SupportsAccessKey, Visual, ClientBehaviorHolder, SupportFieldId {
 
   enum PropertyKeys {
     disabled,
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIFile.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIFile.java
index 2041e6c..33d1f99 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIFile.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIFile.java
@@ -20,6 +20,7 @@
 package org.apache.myfaces.tobago.internal.component;
 
 import org.apache.myfaces.tobago.component.SupportFieldId;
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.SupportsHelp;
 import org.apache.myfaces.tobago.component.SupportsLabelLayout;
 import org.apache.myfaces.tobago.component.Visual;
@@ -36,7 +37,7 @@ import javax.servlet.http.Part;
  * {@link org.apache.myfaces.tobago.internal.taglib.component.FileTagDeclaration}
  */
 public abstract class AbstractUIFile extends UIInput implements SupportsLabelLayout, Visual, ClientBehaviorHolder,
-    SupportFieldId, SupportsHelp {
+    SupportFieldId, SupportsHelp, SupportsAutoSpacing {
 
   private transient boolean nextToRenderIsLabel;
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIInput.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIInput.java
index 7e7c7cf..38ef4b1 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIInput.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIInput.java
@@ -21,6 +21,7 @@ package org.apache.myfaces.tobago.internal.component;
 
 import org.apache.myfaces.tobago.component.SupportFieldId;
 import org.apache.myfaces.tobago.component.SupportsAccessKey;
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.SupportsHelp;
 import org.apache.myfaces.tobago.component.SupportsLabelLayout;
 import org.apache.myfaces.tobago.component.Visual;
@@ -33,7 +34,8 @@ import javax.faces.context.FacesContext;
  * Base class for some inputs.
  */
 public abstract class AbstractUIInput extends javax.faces.component.UIInput
-    implements SupportsAccessKey, SupportsLabelLayout, Visual, ClientBehaviorHolder, SupportFieldId, SupportsHelp {
+    implements SupportsAccessKey, SupportsAutoSpacing, SupportsLabelLayout, Visual, ClientBehaviorHolder,
+    SupportFieldId, SupportsHelp {
 
   private transient boolean nextToRenderIsLabel;
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUILinks.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUILinks.java
index b0c9789..e9c1cd7 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUILinks.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUILinks.java
@@ -19,13 +19,14 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.SupportsDisabled;
 import org.apache.myfaces.tobago.layout.Orientation;
 
 /**
  * {@link org.apache.myfaces.tobago.internal.taglib.component.LinksTagDeclaration}
  */
-public abstract class AbstractUILinks extends AbstractUIPanelBase implements SupportsDisabled {
+public abstract class AbstractUILinks extends AbstractUIPanelBase implements SupportsAutoSpacing, SupportsDisabled {
 
   enum PropertyKeys {
     disabled,
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIOut.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIOut.java
index 0322812..49bcdec 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIOut.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIOut.java
@@ -19,6 +19,7 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.SupportsLabelLayout;
 import org.apache.myfaces.tobago.component.Visual;
 import org.apache.myfaces.tobago.sanitizer.SanitizeMode;
@@ -28,7 +29,7 @@ import javax.faces.component.UIOutput;
 /**
  * {@link org.apache.myfaces.tobago.internal.taglib.component.OutTagDeclaration}
  */
-public abstract class AbstractUIOut extends UIOutput implements SupportsLabelLayout, Visual {
+public abstract class AbstractUIOut extends UIOutput implements SupportsLabelLayout, Visual, SupportsAutoSpacing {
 
   private transient boolean nextToRenderIsLabel;
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectBoolean.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectBoolean.java
index 718d2bc..6376fdf 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectBoolean.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectBoolean.java
@@ -22,6 +22,7 @@ package org.apache.myfaces.tobago.internal.component;
 import org.apache.myfaces.tobago.component.LabelLayout;
 import org.apache.myfaces.tobago.component.SupportFieldId;
 import org.apache.myfaces.tobago.component.SupportsAccessKey;
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.SupportsHelp;
 import org.apache.myfaces.tobago.component.SupportsLabelLayout;
 import org.apache.myfaces.tobago.component.Visual;
@@ -34,7 +35,8 @@ import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
 
 public abstract class AbstractUISelectBoolean extends UISelectBoolean
-    implements Visual, ClientBehaviorHolder, SupportFieldId, SupportsAccessKey, SupportsLabelLayout, SupportsHelp {
+    implements SupportsAutoSpacing, Visual, ClientBehaviorHolder, SupportFieldId, SupportsAccessKey,
+    SupportsLabelLayout, SupportsHelp {
 
   private transient boolean nextToRenderIsLabel;
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectManyBase.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectManyBase.java
index f3c9073..20888a6 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectManyBase.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectManyBase.java
@@ -19,6 +19,7 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.SupportsHelp;
 import org.apache.myfaces.tobago.component.SupportsLabelLayout;
 import org.apache.myfaces.tobago.component.Visual;
@@ -32,7 +33,7 @@ import java.util.Collection;
  * Base class for multi select.
  */
 public abstract class AbstractUISelectManyBase extends UISelectMany
-    implements Visual, SupportsLabelLayout, ClientBehaviorHolder, SupportsHelp {
+    implements SupportsAutoSpacing, Visual, SupportsLabelLayout, ClientBehaviorHolder, SupportsHelp {
 
   private transient boolean nextToRenderIsLabel;
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectOneBase.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectOneBase.java
index f942aa6..2339efe 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectOneBase.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUISelectOneBase.java
@@ -19,6 +19,7 @@
 
 package org.apache.myfaces.tobago.internal.component;
 
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.SupportsHelp;
 import org.apache.myfaces.tobago.component.SupportsLabelLayout;
 import org.apache.myfaces.tobago.component.Visual;
@@ -32,7 +33,7 @@ import javax.faces.context.FacesContext;
  * Base class for select one.
  */
 public abstract class AbstractUISelectOneBase extends javax.faces.component.UISelectOne
-    implements Visual, SupportsLabelLayout, ClientBehaviorHolder, SupportsHelp {
+    implements SupportsAutoSpacing, Visual, SupportsLabelLayout, ClientBehaviorHolder, SupportsHelp {
 
   public static final String MESSAGE_VALUE_REQUIRED = "org.apache.myfaces.tobago.UISelectOne.REQUIRED";
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITabGroup.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITabGroup.java
index 1392fca..c322ba6 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITabGroup.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITabGroup.java
@@ -20,6 +20,7 @@
 package org.apache.myfaces.tobago.internal.component;
 
 import org.apache.myfaces.tobago.component.Attributes;
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.event.TabChangeEvent;
 import org.apache.myfaces.tobago.event.TabChangeListener;
 import org.apache.myfaces.tobago.event.TabChangeSource;
@@ -47,7 +48,7 @@ import java.util.List;
  * {@link org.apache.myfaces.tobago.internal.taglib.component.TabGroupTagDeclaration}
  */
 public abstract class AbstractUITabGroup extends AbstractUIPanelBase
-    implements TabChangeSource, TobagoActionSource, ClientBehaviorHolder {
+    implements TabChangeSource, TobagoActionSource, ClientBehaviorHolder, SupportsAutoSpacing {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BarRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BarRenderer.java
index 43e868a..400bb57 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BarRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BarRenderer.java
@@ -110,7 +110,9 @@ public class BarRenderer<T extends AbstractUIBar> extends RendererBase<T> {
     if (after != null) {
       writer.startElement(HtmlElements.DIV);
       writer.writeClassAttribute(BootstrapClass.MY_LG_0, BootstrapClass.MS_AUTO);
+      insideBegin(facesContext, Facets.after);
       after.encodeAll(facesContext);
+      insideEnd(facesContext, Facets.after);
       writer.endElement(HtmlElements.DIV);
     }
     writer.endElement(HtmlElements.DIV);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRenderer.java
index 4e0f0e5..af540d3 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRenderer.java
@@ -43,11 +43,13 @@ public class BoxRenderer<T extends AbstractUIBox> extends CollapsiblePanelRender
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
     final Markup markup = component.getMarkup();
     final boolean collapsed = component.isCollapsed();
+    final boolean autoSpacing = component.getAutoSpacing(facesContext);
 
     writer.startElement(HtmlElements.TOBAGO_BOX);
     writer.writeClassAttribute(
         BootstrapClass.CARD,
         collapsed ? TobagoClass.COLLAPSED : null,
+        autoSpacing ? TobagoClass.AUTO__SPACING : null,
         component.getCustomClass(),
         markup != null && markup.contains(Markup.SPREAD) ? TobagoClass.SPREAD : null);
     final String clientId = component.getClientId(facesContext);
@@ -71,15 +73,19 @@ public class BoxRenderer<T extends AbstractUIBox> extends CollapsiblePanelRender
 
       writer.startElement(HtmlElements.H3);
       if (labelFacet != null) {
+        insideBegin(facesContext, Facets.label);
         for (final UIComponent child : RenderUtils.getFacetChildren(labelFacet)) {
           child.encodeAll(facesContext);
         }
+        insideEnd(facesContext, Facets.label);
       } else if (labelString != null) {
         writer.writeText(labelString);
       }
       writer.endElement(HtmlElements.H3);
       if (bar != null) {
+        insideBegin(facesContext, Facets.bar);
         bar.encodeAll(facesContext);
+        insideEnd(facesContext, Facets.bar);
       }
 
       writer.endElement(HtmlElements.DIV);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ButtonsRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ButtonsRenderer.java
index c9b245e..7558881 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ButtonsRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ButtonsRenderer.java
@@ -41,6 +41,7 @@ public class ButtonsRenderer<T extends AbstractUIButtons> extends RendererBase<T
 
     final Markup markup = component.getMarkup();
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
+    final boolean autoSpacing = component.getAutoSpacing(facesContext);
 
     writer.startElement(HtmlElements.TOBAGO_BUTTONS);
     writer.writeIdAttribute(component.getClientId(facesContext));
@@ -50,6 +51,7 @@ public class ButtonsRenderer<T extends AbstractUIButtons> extends RendererBase<T
         TobagoClass.BUTTONS.createMarkup(markup),
         Orientation.vertical.equals(component.getOrientation())
             ? BootstrapClass.BTN_GROUP_VERTICAL : BootstrapClass.BTN_GROUP,
+        autoSpacing ? TobagoClass.AUTO__SPACING : null,
         component.getCustomClass());
     writer.writeAttribute(HtmlAttributes.ROLE, HtmlRoleValues.GROUP.toString(), false);
     HtmlRendererUtils.writeDataAttributes(facesContext, writer, component);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java
index 391e362..beed980 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java
@@ -68,6 +68,7 @@ public abstract class CommandRendererBase<T extends AbstractUICommand> extends D
     final LabelWithAccessKey label = new LabelWithAccessKey(component);
     final boolean anchor = (component.getLink() != null || component.getOutcome() != null) && !disabled;
     final String target = component.getTarget();
+    final boolean autoSpacing = component.getAutoSpacing(facesContext);
     final boolean parentOfCommands = component.isParentOfCommands();
     final boolean dropdownSubmenu = isInside(facesContext, HtmlElements.COMMAND);
 
@@ -118,6 +119,7 @@ public abstract class CommandRendererBase<T extends AbstractUICommand> extends D
         getRendererCssClass(),
         getRendererCssClass().createMarkup(component.getMarkup()),
         getCssItems(facesContext, component),
+        autoSpacing && !dropdownSubmenu ? TobagoClass.AUTO__SPACING : null,
         dropdownSubmenu ? BootstrapClass.DROPDOWN_ITEM : null,
         parentOfCommands && !dropdownSubmenu ? BootstrapClass.DROPDOWN_TOGGLE : null,
         component.getCustomClass(),
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FigureRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FigureRenderer.java
index 117dd6b..3b5169f 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FigureRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FigureRenderer.java
@@ -70,7 +70,9 @@ public class FigureRenderer<T extends AbstractUIFigure> extends RendererBase<T>
         writer.writeText(labelString);
       }
       if (label != null) {
+        insideBegin(facesContext, Facets.label);
         label.encodeAll(facesContext);
+        insideEnd(facesContext, Facets.label);
       }
       writer.endElement(HtmlElements.FIGCAPTION);
     }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FooterRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FooterRenderer.java
index ded7283..450c310 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FooterRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FooterRenderer.java
@@ -36,6 +36,7 @@ public class FooterRenderer<T extends AbstractUIFooter> extends RendererBase<T>
   @Override
   public void encodeBeginInternal(final FacesContext facesContext, final T component) throws IOException {
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
+    insideBegin(facesContext, HtmlElements.TOBAGO_FOOTER);
     writer.startElement(HtmlElements.TOBAGO_FOOTER);
     writer.writeIdAttribute(component.getClientId(facesContext));
 
@@ -51,5 +52,6 @@ public class FooterRenderer<T extends AbstractUIFooter> extends RendererBase<T>
   public void encodeEndInternal(final FacesContext facesContext, final T component) throws IOException {
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
     writer.endElement(HtmlElements.TOBAGO_FOOTER);
+    insideEnd(facesContext, HtmlElements.TOBAGO_FOOTER);
   }
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/HeaderRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/HeaderRenderer.java
index c79915f..62a34f6 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/HeaderRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/HeaderRenderer.java
@@ -36,6 +36,7 @@ public class HeaderRenderer<T extends AbstractUIHeader> extends RendererBase<T>
   @Override
   public void encodeBeginInternal(final FacesContext facesContext, final T component) throws IOException {
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
+    insideBegin(facesContext, HtmlElements.TOBAGO_HEADER);
     writer.startElement(HtmlElements.TOBAGO_HEADER);
     writer.writeIdAttribute(component.getClientId(facesContext));
     // TBD: NAVBAR_DARK and BG_DARK should not be the default
@@ -54,5 +55,6 @@ public class HeaderRenderer<T extends AbstractUIHeader> extends RendererBase<T>
   public void encodeEndInternal(final FacesContext facesContext, final T component) throws IOException {
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
     writer.endElement(HtmlElements.TOBAGO_HEADER);
+    insideEnd(facesContext, HtmlElements.TOBAGO_HEADER);
   }
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/InRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/InRenderer.java
index 0bad446..31d083e 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/InRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/InRenderer.java
@@ -176,9 +176,7 @@ public class InRenderer<T extends AbstractUIIn> extends MessageLayoutRendererBas
       final UIComponent addon, final boolean isAfterFacet) throws IOException {
     if (addon != null) {
       for (final UIComponent child : RenderUtils.getFacetChildren(addon)) {
-        if (isAfterFacet) {
-          insideBegin(facesContext, Facets.after);
-        }
+        insideBegin(facesContext, isAfterFacet ? Facets.after : Facets.before);
         if (child instanceof AbstractUIButton) {
           child.encodeAll(facesContext);
         } else if (child instanceof AbstractUIOut) {
@@ -191,9 +189,7 @@ public class InRenderer<T extends AbstractUIIn> extends MessageLayoutRendererBas
           child.encodeAll(facesContext);
           writer.endElement(HtmlElements.SPAN);
         }
-        if (isAfterFacet) {
-          insideEnd(facesContext, Facets.after);
-        }
+        insideEnd(facesContext, isAfterFacet ? Facets.after : Facets.before);
       }
     }
   }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LabelLayoutRendererBase.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LabelLayoutRendererBase.java
index 33ed746..e593f57 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LabelLayoutRendererBase.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LabelLayoutRendererBase.java
@@ -22,6 +22,7 @@ package org.apache.myfaces.tobago.internal.renderkit.renderer;
 import org.apache.myfaces.tobago.component.Attributes;
 import org.apache.myfaces.tobago.component.LabelLayout;
 import org.apache.myfaces.tobago.component.SupportsAccessKey;
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.SupportsLabelLayout;
 import org.apache.myfaces.tobago.context.Markup;
 import org.apache.myfaces.tobago.internal.component.AbstractUIStyle;
@@ -45,7 +46,7 @@ import java.util.List;
  * Manages the rendering of the <b>label</b> and the <b>field</b> together with different possibilities for the position
  * of the label (defined by {@link org.apache.myfaces.tobago.component.Attributes#labelLayout}
  */
-public abstract class LabelLayoutRendererBase<T extends UIComponent & SupportsLabelLayout>
+public abstract class LabelLayoutRendererBase<T extends UIComponent & SupportsLabelLayout & SupportsAutoSpacing>
     extends DecodingInputRendererBase<T> {
 
   public abstract HtmlElements getComponentTag();
@@ -115,6 +116,7 @@ public abstract class LabelLayoutRendererBase<T extends UIComponent & SupportsLa
     String clientId = component.getClientId(facesContext);
     final Markup markup = (Markup) ComponentUtils.getAttribute(component, Attributes.markup);
 
+    final boolean autoSpacing = component.getAutoSpacing(facesContext);
     final LabelLayout labelLayout = component.getLabelLayout();
     final boolean nextToRenderIsLabel = component.isNextToRenderIsLabel();
     final boolean flex;
@@ -159,7 +161,7 @@ public abstract class LabelLayoutRendererBase<T extends UIComponent & SupportsLa
       writer.writeClassAttribute(
           flex ? TobagoClass.LABEL__CONTAINER : null,
           getComponentCss(facesContext, component),
-          TobagoClass.MARGIN__BOTTOM,
+          autoSpacing ? TobagoClass.AUTO__SPACING : null,
           ComponentUtils.getBooleanAttribute(component, Attributes.required) ? TobagoClass.REQUIRED : null,
           markup != null && markup.contains(Markup.SPREAD) ? TobagoClass.SPREAD : null);
       writeAdditionalAttributes(facesContext, writer, component);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinksRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinksRenderer.java
index bb0423f..1e0344a 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinksRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinksRenderer.java
@@ -23,6 +23,7 @@ import org.apache.myfaces.tobago.internal.component.AbstractUILinks;
 import org.apache.myfaces.tobago.layout.Orientation;
 import org.apache.myfaces.tobago.renderkit.RendererBase;
 import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
+import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 
@@ -39,11 +40,13 @@ public class LinksRenderer<T extends AbstractUILinks> extends RendererBase<T> {
 //    final boolean insideBar = facesContext.getAttributes().get("inside-bar") != null;
     final boolean insideBar = isInside(facesContext, HtmlElements.TOBAGO_BAR);
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
+    final boolean autoSpacing = component.getAutoSpacing(facesContext);
 
     writer.startElement(HtmlElements.TOBAGO_LINKS);
     writer.writeIdAttribute(component.getClientId(facesContext));
     writer.writeClassAttribute(
         Orientation.vertical.equals(component.getOrientation()) ? BootstrapClass.FLEX_COLUMN : null,
+        autoSpacing ? TobagoClass.AUTO__SPACING : null,
         component.getCustomClass());
     writer.startElement(HtmlElements.UL);
     writer.writeClassAttribute(
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/MessageLayoutRendererBase.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/MessageLayoutRendererBase.java
index 26dda49..a3c55af 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/MessageLayoutRendererBase.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/MessageLayoutRendererBase.java
@@ -19,6 +19,7 @@
 
 package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
+import org.apache.myfaces.tobago.component.SupportsAutoSpacing;
 import org.apache.myfaces.tobago.component.SupportsHelp;
 import org.apache.myfaces.tobago.component.SupportsLabelLayout;
 import org.apache.myfaces.tobago.internal.component.AbstractUIInput;
@@ -41,7 +42,7 @@ import javax.faces.context.FacesContext;
 import java.io.IOException;
 import java.util.List;
 
-public abstract class MessageLayoutRendererBase<T extends UIComponent & SupportsLabelLayout>
+public abstract class MessageLayoutRendererBase<T extends UIComponent & SupportsLabelLayout & SupportsAutoSpacing>
     extends LabelLayoutRendererBase<T> {
 
   @Override
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRenderer.java
index 694d82c..0046153 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRenderer.java
@@ -86,9 +86,11 @@ public class SectionRenderer<T extends AbstractUISection> extends CollapsiblePan
     final UIComponent labelFacet = ComponentUtils.getFacet(component, Facets.label);
     final String labelString = component.getLabel();
     if (labelFacet != null) {
+      insideBegin(facesContext, Facets.label);
       for (final UIComponent child : RenderUtils.getFacetChildren(labelFacet)) {
         child.encodeAll(facesContext);
       }
+      insideEnd(facesContext, Facets.label);
     } else if (labelString != null) {
       writer.startElement(HtmlElements.SPAN);
       writer.writeText(labelString);
@@ -98,7 +100,9 @@ public class SectionRenderer<T extends AbstractUISection> extends CollapsiblePan
 
     final UIComponent bar = ComponentUtils.getFacet(component, Facets.bar);
     if (bar != null) {
+      insideBegin(facesContext, Facets.bar);
       bar.encodeAll(facesContext);
+      insideEnd(facesContext, Facets.bar);
     }
 
     writer.endElement(HtmlElements.DIV);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java
index 7d2dcf4..a86a023 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SheetRenderer.java
@@ -264,6 +264,7 @@ public class SheetRenderer<T extends AbstractUISheet> extends RendererBase<T> {
     component.init(facesContext);
 
     // Outer sheet div
+    insideBegin(facesContext, HtmlElements.TOBAGO_SHEET);
     writer.startElement(HtmlElements.TOBAGO_SHEET);
     writer.writeIdAttribute(sheetId);
     HtmlRendererUtils.writeDataAttributes(facesContext, writer, component);
@@ -529,6 +530,7 @@ public class SheetRenderer<T extends AbstractUISheet> extends RendererBase<T> {
     if (header.isTransient()) {
       component.getFacets().remove("header");
     }
+    insideEnd(facesContext, HtmlElements.TOBAGO_SHEET);
   }
 
   private void encodeTableBody(
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TabGroupRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TabGroupRenderer.java
index 3d59bef..00f9059 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TabGroupRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TabGroupRenderer.java
@@ -139,6 +139,7 @@ public class TabGroupRenderer<T extends AbstractUITabGroup> extends RendererBase
     final String hiddenId = clientId + TabGroupRenderer.INDEX_POSTFIX;
     final SwitchType switchType = uiComponent.getSwitchType();
     final Markup markup = uiComponent.getMarkup();
+    final boolean autoSpacing = uiComponent.getAutoSpacing(facesContext);
     final TobagoResponseWriter writer = getResponseWriter(facesContext);
 
     writer.startElement(HtmlElements.TOBAGO_TAB_GROUP);
@@ -146,6 +147,7 @@ public class TabGroupRenderer<T extends AbstractUITabGroup> extends RendererBase
     writer.writeClassAttribute(
         BootstrapClass.CARD,
         TobagoClass.TAB_GROUP.createMarkup(markup),
+        autoSpacing ? TobagoClass.AUTO__SPACING : null,
         uiComponent.getCustomClass(),
         markup != null && markup.contains(Markup.SPREAD) ? TobagoClass.SPREAD : null);
     HtmlRendererUtils.writeDataAttributes(facesContext, writer, uiComponent);
@@ -296,7 +298,9 @@ public class TabGroupRenderer<T extends AbstractUITabGroup> extends RendererBase
             labelEmpty = false;
           }
           if (labelFacet != null) {
+            insideBegin(facesContext, Facets.label);
             labelFacet.encodeAll(facesContext);
+            insideEnd(facesContext, Facets.label);
             labelEmpty = false;
           }
           if (labelEmpty) {
@@ -305,9 +309,11 @@ public class TabGroupRenderer<T extends AbstractUITabGroup> extends RendererBase
           writer.endElement(HtmlElements.A);
 
           if (barFacet != null) {
+            insideBegin(facesContext, Facets.bar);
             writer.startElement(HtmlElements.DIV);
             barFacet.encodeAll(facesContext);
             writer.endElement(HtmlElements.DIV);
+            insideEnd(facesContext, Facets.bar);
           }
 
           writer.endElement(HtmlElements.TOBAGO_TAB);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/BoxTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/BoxTagDeclaration.java
index c031cf2..e81e657 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/BoxTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/BoxTagDeclaration.java
@@ -29,6 +29,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasCollapsedMode;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasIdBindingAndRendered;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasLabel;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsCollapsed;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsVisual;
 
@@ -60,5 +61,5 @@ import javax.faces.component.UIPanel;
     })
 
 public interface BoxTagDeclaration
-    extends HasIdBindingAndRendered, IsVisual, HasLabel, HasTip, IsCollapsed, HasCollapsedMode {
+    extends HasIdBindingAndRendered, IsVisual, HasLabel, HasTip, IsCollapsed, HasCollapsedMode, HasAutoSpacing {
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonTagDeclaration.java
index f7056b3..98034dd 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonTagDeclaration.java
@@ -41,6 +41,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasOutcome;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTabIndex;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTarget;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDefaultCommand;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabledBySecurity;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsImmediateCommand;
@@ -132,5 +133,5 @@ public interface ButtonTagDeclaration
     extends HasIdBindingAndRendered, HasAction, HasActionListener, IsImmediateCommand, HasConfirmation,
     HasLink, HasOutcome, HasFragment, IsTransition, HasTarget, IsDisabledBySecurity,
     IsOmit, IsVisual, HasLabel, HasAccessKey, HasTip, HasImage,
-    IsDefaultCommand, HasTabIndex {
+    IsDefaultCommand, HasTabIndex, HasAutoSpacing {
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonsTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonsTagDeclaration.java
index e7d2556..6d14aeb 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonsTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ButtonsTagDeclaration.java
@@ -27,6 +27,7 @@ import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasIdBindingAndRendered;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasOrientation;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsVisual;
 
 import javax.faces.component.UIPanel;
@@ -46,7 +47,7 @@ import javax.faces.component.UIPanel;
     })
 
 public interface ButtonsTagDeclaration
-    extends HasIdBindingAndRendered, IsVisual, HasTip, HasOrientation {
+    extends HasIdBindingAndRendered, IsVisual, HasTip, HasOrientation, HasAutoSpacing {
 
   /**
    * Flag indicating that this element and all children are disabled.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/DateTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/DateTagDeclaration.java
index 4901a69..da18c25 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/DateTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/DateTagDeclaration.java
@@ -41,6 +41,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValue;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsReadonly;
@@ -80,7 +81,7 @@ public interface DateTagDeclaration
     extends HasAccessKey, HasValidator, HasValue, HasValueChangeListener, HasTabIndex, IsFocus, IsVisual,
     HasValidatorMessage, HasConverterMessage, HasRequiredMessage, HasIdBindingAndRendered, IsReadonly,
     IsDisabled, HasConverter, HasLabel, HasHelp, HasLabelLayout,
-    HasTip, IsRequired, HasPlaceholder {
+    HasTip, IsRequired, HasPlaceholder, HasAutoSpacing {
 
   /**
    * If true, a today button is displayed on the datetimepicker.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/FileTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/FileTagDeclaration.java
index 29b6e55..c8f11fa 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/FileTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/FileTagDeclaration.java
@@ -39,6 +39,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsMultiple;
@@ -79,7 +80,8 @@ import javax.faces.component.UIInput;
 public interface FileTagDeclaration
     extends HasValidator, HasValidatorMessage, HasRequiredMessage, HasConverterMessage,
     HasValueChangeListener, HasIdBindingAndRendered, IsDisabled, IsFocus, IsMultiple,
-    HasLabel, HasLabelLayout, HasAccessKey, HasTip, HasHelp, IsReadonly, IsRequired, HasTabIndex, IsVisual {
+    HasLabel, HasLabelLayout, HasAccessKey, HasTip, HasHelp, IsReadonly, IsRequired, HasTabIndex, IsVisual,
+    HasAutoSpacing {
 
   /**
    * Value binding expression pointing to a
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/InTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/InTagDeclaration.java
index 5c53a30..acc31ef9 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/InTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/InTagDeclaration.java
@@ -43,6 +43,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValue;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsPassword;
@@ -90,6 +91,6 @@ public interface InTagDeclaration
     extends HasIdBindingAndRendered, HasConverter, IsReadonly, IsDisabled, IsRequired, HasHelp, HasTip, IsPassword,
     HasAccessKey, HasValidator, HasValue, HasValueChangeListener, HasTabIndex, IsFocus, IsVisual,
     HasValidatorMessage, HasConverterMessage, HasRequiredMessage, HasLabel, HasLabelLayout,
-    HasAutocomplete, HasPlaceholder {
+    HasAutocomplete, HasPlaceholder, HasAutoSpacing {
 
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinkTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinkTagDeclaration.java
index 4ce209c..59c7b38 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinkTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinkTagDeclaration.java
@@ -40,6 +40,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasOutcome;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTabIndex;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTarget;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabledBySecurity;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsImmediateCommand;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsOmit;
@@ -81,5 +82,5 @@ import javax.faces.component.UICommand;
 public interface LinkTagDeclaration
     extends HasIdBindingAndRendered, HasAction, HasActionListener, IsImmediateCommand, HasConfirmation,
             HasLink, HasOutcome, HasFragment, IsTransition, HasTarget, IsDisabledBySecurity,
-            IsOmit, HasImage, HasTabIndex, IsVisual, HasLabel, HasAccessKey, HasTip {
+            IsOmit, HasImage, HasTabIndex, IsVisual, HasLabel, HasAccessKey, HasTip, HasAutoSpacing {
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinksTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinksTagDeclaration.java
index 5398e6d..038d7cd 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinksTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/LinksTagDeclaration.java
@@ -27,6 +27,7 @@ import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasIdBindingAndRendered;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasOrientation;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsVisual;
 
 import javax.faces.component.UIPanel;
@@ -44,7 +45,7 @@ import javax.faces.component.UIPanel;
         "javax.faces.component.behavior.ClientBehaviorHolder"
     },
     rendererType = RendererTypes.LINKS)
-public interface LinksTagDeclaration extends HasIdBindingAndRendered, IsVisual, HasTip, HasOrientation {
+public interface LinksTagDeclaration extends HasIdBindingAndRendered, IsVisual, HasTip, HasOrientation, HasAutoSpacing {
 
   /**
    * Flag indicating that this element and all children are disabled.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java
index acfc002..abb3643 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java
@@ -32,6 +32,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasLabelLayout;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasSanitize;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValue;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsPlain;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsVisual;
 
@@ -55,7 +56,7 @@ import javax.faces.component.UIOutput;
 
 public interface OutTagDeclaration
     extends HasIdBindingAndRendered, HasConverter, HasTip, HasValue, IsVisual,
-    HasSanitize, HasLabel, HasLabelLayout, IsPlain {
+    HasSanitize, HasLabel, HasLabelLayout, IsPlain, HasAutoSpacing {
 
   /**
    * Flag indicating that characters that are
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/RangeTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/RangeTagDeclaration.java
index e7a2cce..ec0393b 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/RangeTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/RangeTagDeclaration.java
@@ -28,6 +28,7 @@ import org.apache.myfaces.tobago.apt.annotation.UIComponentTagAttribute;
 import org.apache.myfaces.tobago.component.ClientBehaviors;
 import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasAccessKey;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasConverter;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasConverterMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasHelp;
@@ -73,7 +74,7 @@ import javax.faces.component.UIInput;
 public interface RangeTagDeclaration
     extends HasIdBindingAndRendered, HasConverter, IsReadonly, IsDisabled, HasHelp, HasTip,
     HasAccessKey, HasValidator, HasValue, HasValueChangeListener, HasTabIndex, IsFocus, IsVisual,
-    HasValidatorMessage, HasConverterMessage, HasLabel, HasLabelLayout {
+    HasValidatorMessage, HasConverterMessage, HasLabel, HasLabelLayout, HasAutoSpacing {
 
     /**
      * Sets the minimum value of the range.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanCheckboxTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanCheckboxTagDeclaration.java
index 1a215ab..cd24534 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanCheckboxTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanCheckboxTagDeclaration.java
@@ -41,6 +41,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValue;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsReadonly;
@@ -78,5 +79,5 @@ public interface SelectBooleanCheckboxTagDeclaration extends HasValidator,
     HasValueChangeListener, HasIdBindingAndRendered, HasValue, IsDisabled,
     HasTip, HasHelp, IsReadonly, HasTabIndex, IsRequiredForSelect, HasConverter, IsFocus,
     HasValidatorMessage, HasRequiredMessageForSelect, HasConverterMessage, IsVisual,
-    HasAccessKey, HasItemLabel, HasItemImage, HasLabel, HasLabelLayout {
+    HasAccessKey, HasItemLabel, HasItemImage, HasLabel, HasLabelLayout, HasAutoSpacing {
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanToggleTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanToggleTagDeclaration.java
index bd562ac..cf51912 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanToggleTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectBooleanToggleTagDeclaration.java
@@ -41,6 +41,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValue;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsReadonly;
@@ -78,5 +79,5 @@ public interface SelectBooleanToggleTagDeclaration extends HasValidator,
     HasValueChangeListener, HasIdBindingAndRendered, HasValue, IsDisabled,
     HasTip, HasHelp, IsReadonly, HasTabIndex, IsRequiredForSelect, HasConverter, IsFocus,
     HasValidatorMessage, HasRequiredMessageForSelect, HasConverterMessage, IsVisual,
-    HasAccessKey, HasItemLabel, HasItemImage, HasLabel, HasLabelLayout {
+    HasAccessKey, HasItemLabel, HasItemImage, HasLabel, HasLabelLayout, HasAutoSpacing {
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyCheckboxTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyCheckboxTagDeclaration.java
index 0a093f9..cb27a1b 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyCheckboxTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyCheckboxTagDeclaration.java
@@ -41,6 +41,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsInline;
@@ -81,7 +82,8 @@ public interface SelectManyCheckboxTagDeclaration extends
     IsDisabled, HasId, HasTip, HasHelp, IsInline, HasRenderRange, IsRendered, IsRequiredForSelect,
     HasBinding, IsReadonly, HasConverter, HasLabelLayout,
     HasLabel, HasValidator, HasValueChangeListener,
-    HasValidatorMessage, HasConverterMessage, HasRequiredMessageForSelect, HasTabIndex, IsFocus, IsVisual {
+    HasValidatorMessage, HasConverterMessage, HasRequiredMessageForSelect, HasTabIndex, IsFocus, IsVisual,
+    HasAutoSpacing {
 
   /**
    * The value of the multi select.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListboxTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListboxTagDeclaration.java
index a5b7d10..775bbf9 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListboxTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyListboxTagDeclaration.java
@@ -41,6 +41,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsReadonly;
@@ -83,7 +84,8 @@ import javax.faces.component.UISelectMany;
 public interface SelectManyListboxTagDeclaration
     extends HasId, IsDisabled, IsRendered, HasBinding, HasTip, HasHelp,
     IsReadonly, HasConverter, IsRequiredForSelect, HasLabel, HasValidator, HasValueChangeListener, HasLabelLayout,
-    HasValidatorMessage, HasConverterMessage, HasRequiredMessageForSelect, HasTabIndex, IsFocus, IsVisual, HasSize {
+    HasValidatorMessage, HasConverterMessage, HasRequiredMessageForSelect, HasTabIndex, IsFocus, IsVisual, HasSize,
+    HasAutoSpacing {
 
   /**
    * The value of the multi select.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyShuttleTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyShuttleTagDeclaration.java
index 46f4dde..86081e6 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyShuttleTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectManyShuttleTagDeclaration.java
@@ -42,6 +42,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsReadonly;
@@ -83,7 +84,8 @@ import javax.faces.component.UISelectMany;
 public interface SelectManyShuttleTagDeclaration extends
     IsDisabled, HasId, HasTip, HasHelp, IsRendered, IsRequiredForSelect, HasBinding, IsReadonly, HasConverter,
     HasLabel, HasValidator, HasValueChangeListener, HasLabelLayout,
-    HasValidatorMessage, HasConverterMessage, HasRequiredMessageForSelect, HasTabIndex, IsFocus, IsVisual, HasSize {
+    HasValidatorMessage, HasConverterMessage, HasRequiredMessageForSelect, HasTabIndex, IsFocus, IsVisual, HasSize,
+    HasAutoSpacing {
 
   /**
    * The value of the multi select.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java
index 5388174..dfd21b7 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneChoiceTagDeclaration.java
@@ -41,6 +41,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValue;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsReadonly;
@@ -79,7 +80,7 @@ import javax.faces.component.UISelectOne;
 public interface SelectOneChoiceTagDeclaration
     extends HasValidator, HasValue, HasValueChangeListener, HasTabIndex, IsFocus, IsVisual,
     HasValidatorMessage, HasConverterMessage, HasRequiredMessage, HasId, IsDisabled, IsReadonly, HasLabel,
-    IsRendered, HasConverter, HasBinding, HasTip, HasHelp, HasLabelLayout {
+    IsRendered, HasConverter, HasBinding, HasTip, HasHelp, HasLabelLayout, HasAutoSpacing {
 
   /**
    * Flag indicating that selecting an Item representing a value is required.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListboxTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListboxTagDeclaration.java
index 1d373b3..29fa6f5 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListboxTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneListboxTagDeclaration.java
@@ -43,6 +43,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValue;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsReadonly;
@@ -87,7 +88,7 @@ import javax.faces.component.UISelectOne;
 public interface SelectOneListboxTagDeclaration
     extends HasValidator, HasValue, HasValueChangeListener, HasTabIndex, IsFocus, IsVisual,
     HasValidatorMessage, HasConverterMessage, HasRequiredMessage, HasId, IsDisabled, IsReadonly, HasLabel, IsRendered,
-    HasBinding, HasTip, HasHelp, HasConverter, HasLabelLayout, HasSize {
+    HasBinding, HasTip, HasHelp, HasConverter, HasLabelLayout, HasSize, HasAutoSpacing {
 
   /**
    * Flag indicating that selecting an Item representing a Value is Required.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneRadioTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneRadioTagDeclaration.java
index 78b71b5..19e8767 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneRadioTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SelectOneRadioTagDeclaration.java
@@ -42,6 +42,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValue;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsInline;
@@ -81,7 +82,7 @@ import javax.faces.component.UISelectOne;
 public interface SelectOneRadioTagDeclaration
     extends HasValidator, HasValue, HasValueChangeListener, HasTabIndex, IsFocus, IsVisual,
     HasValidatorMessage, HasConverterMessage, HasRequiredMessage, IsDisabled, IsReadonly, HasId, HasTip, HasHelp,
-    IsInline, HasRenderRange, IsRendered, HasBinding, HasConverter, HasLabel, HasLabelLayout {
+    IsInline, HasRenderRange, IsRendered, HasBinding, HasConverter, HasLabel, HasLabelLayout, HasAutoSpacing {
 
   /**
    * Flag indicating that selecting an Item representing a Value is Required.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/StarsTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/StarsTagDeclaration.java
index 8b09c72..f8f8ebb 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/StarsTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/StarsTagDeclaration.java
@@ -41,6 +41,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValue;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsReadonly;
@@ -72,7 +73,8 @@ import javax.faces.component.UIInput;
 
 public interface StarsTagDeclaration extends HasIdBindingAndRendered, HasConverter, HasConverterMessage, IsDisabled,
     IsFocus, HasTabIndex, HasLabel, HasLabelLayout, IsReadonly, IsRequired, HasRequiredMessage, HasTip,
-    HasValidator, HasValidatorMessage, HasValue, HasValueChangeListener, IsVisual, HasAccessKey, HasHelp {
+    HasValidator, HasValidatorMessage, HasValue, HasValueChangeListener, IsVisual, HasAccessKey, HasHelp,
+    HasAutoSpacing {
 
   /**
    * The current value of this component. May be a java.lang.Number or a javax.swing.BoundedRangeModel
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/TabGroupTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/TabGroupTagDeclaration.java
index 41afba5..fab28e2 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/TabGroupTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/TabGroupTagDeclaration.java
@@ -33,6 +33,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasAction;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasActionListener;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasIdBindingAndRendered;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasTip;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsImmediateCommand;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsVisual;
 import org.apache.myfaces.tobago.model.SwitchType;
@@ -62,7 +63,8 @@ import javax.faces.component.UIPanel;
         )
     })
 public interface TabGroupTagDeclaration
-    extends HasIdBindingAndRendered, IsImmediateCommand, HasAction, HasActionListener, IsVisual, HasTip {
+    extends HasIdBindingAndRendered, IsImmediateCommand, HasAction, HasActionListener, IsVisual, HasTip,
+    HasAutoSpacing {
 
   /**
    * Flag indicating that the tab navigation bar is rendered.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/TextareaTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/TextareaTagDeclaration.java
index 6a853dd..3c653f8 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/TextareaTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/TextareaTagDeclaration.java
@@ -43,6 +43,7 @@ import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidator;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValidatorMessage;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValue;
 import org.apache.myfaces.tobago.internal.taglib.declaration.HasValueChangeListener;
+import org.apache.myfaces.tobago.internal.taglib.declaration.HasAutoSpacing;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsDisabled;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsFocus;
 import org.apache.myfaces.tobago.internal.taglib.declaration.IsReadonly;
@@ -83,7 +84,7 @@ import javax.faces.component.UIInput;
 public interface TextareaTagDeclaration
     extends HasIdBindingAndRendered, HasConverter, IsReadonly, IsDisabled, IsRequired, HasLabel, HasLabelLayout, HasTip,
     HasHelp, HasAccessKey, HasValidator, HasValue, HasValueChangeListener, HasTabIndex, IsFocus, IsVisual,
-    HasValidatorMessage, HasConverterMessage, HasRequiredMessage, HasSanitize, HasPlaceholder {
+    HasValidatorMessage, HasConverterMessage, HasRequiredMessage, HasSanitize, HasPlaceholder, HasAutoSpacing {
 
   /**
    * The row count for this component.
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/declaration/HasAutoSpacing.java
similarity index 54%
copy from tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java
copy to tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/declaration/HasAutoSpacing.java
index 0ec8ef3..0f9dce9 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUIBox.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/declaration/HasAutoSpacing.java
@@ -17,12 +17,27 @@
  * under the License.
  */
 
-package org.apache.myfaces.tobago.internal.component;
+package org.apache.myfaces.tobago.internal.taglib.declaration;
 
-/**
- * {@link org.apache.myfaces.tobago.internal.taglib.component.BoxTagDeclaration}
- */
-public abstract class AbstractUIBox extends AbstractUICollapsiblePanel {
+import org.apache.myfaces.tobago.apt.annotation.TagAttribute;
+import org.apache.myfaces.tobago.apt.annotation.UIComponentTagAttribute;
 
-  public abstract String getLabel();
+public interface HasAutoSpacing {
+  /**
+   * Automatically add spacing (margins/paddings) to the component for better positioning.
+   * Default is 'true' except the component is inside a:
+   * - header
+   * - footer
+   * - bar
+   * - sheet
+   * - link group
+   * - button group
+   * - before facet
+   * - after facet
+   * - label facet
+   * - bar facet
+   */
+  @TagAttribute
+  @UIComponentTagAttribute(type = "java.lang.Boolean")
+  void setAutoSpacing(String autoSpacing);
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/TobagoClass.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/TobagoClass.java
index 5e563ad..18ec987 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/TobagoClass.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/TobagoClass.java
@@ -67,7 +67,7 @@ public enum TobagoClass implements CssItem {
    */
   @Deprecated
   ALIGN_ITEMS__STRETCH("tobago-alignItems-stretch"),
-
+  AUTO__SPACING("tobago-auto-spacing"),
   /**
    * @deprecated since 4.0.0, use {@link BootstrapClass#JUSTIFY_CONTENT_CENTER}
    */
@@ -159,7 +159,6 @@ public enum TobagoClass implements CssItem {
   LABEL("tobago-label"),
   LABEL__CONTAINER("tobago-label-container"),
   LINK("tobago-link"),
-  MARGIN__BOTTOM("tobago-margin-bottom"),
   MESSAGES("tobago-messages"),
   /**
    * @deprecated Since 5.0.0. Please use surrounding tag &lt;tobago-popover&gt;.
diff --git a/tobago-core/src/test/resources/renderer/box/box-label-facet.html b/tobago-core/src/test/resources/renderer/box/box-label-facet.html
index 7f97ed6..06f8a62 100644
--- a/tobago-core/src/test/resources/renderer/box/box-label-facet.html
+++ b/tobago-core/src/test/resources/renderer/box/box-label-facet.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-box class='card' id='id'>
+<tobago-box class='card tobago-auto-spacing' id='id'>
   <div class='card-header tobago-box-header'>
     <h3>label
     </h3>
diff --git a/tobago-core/src/test/resources/renderer/box/box-label.html b/tobago-core/src/test/resources/renderer/box/box-label.html
index 7f97ed6..06f8a62 100644
--- a/tobago-core/src/test/resources/renderer/box/box-label.html
+++ b/tobago-core/src/test/resources/renderer/box/box-label.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-box class='card' id='id'>
+<tobago-box class='card tobago-auto-spacing' id='id'>
   <div class='card-header tobago-box-header'>
     <h3>label
     </h3>
diff --git a/tobago-core/src/test/resources/renderer/box/simple.html b/tobago-core/src/test/resources/renderer/box/simple.html
index cc20d02..547c5e6 100644
--- a/tobago-core/src/test/resources/renderer/box/simple.html
+++ b/tobago-core/src/test/resources/renderer/box/simple.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-box class='card' id='id'>
+<tobago-box class='card tobago-auto-spacing' id='id'>
   <div class='card-body'>
   </div>
 </tobago-box>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/buttons/badge-inside-buttons.html b/tobago-core/src/test/resources/renderer/buttons/badge-inside-buttons.html
index ce8dbe6..024c4d8 100644
--- a/tobago-core/src/test/resources/renderer/buttons/badge-inside-buttons.html
+++ b/tobago-core/src/test/resources/renderer/buttons/badge-inside-buttons.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-buttons id='list' class='btn-group' role='group'>
+<tobago-buttons id='list' class='btn-group tobago-auto-spacing' role='group'>
   <tobago-badge id='badge' class='badge bg-secondary btn'>
   </tobago-badge>
   <button type='button' id='id' name='id' class='tobago-button btn btn-secondary'><tobago-behavior event='click' client-id='id'></tobago-behavior><span>button</span></button>
diff --git a/tobago-core/src/test/resources/renderer/buttons/separator-inside-buttons.html b/tobago-core/src/test/resources/renderer/buttons/separator-inside-buttons.html
index a958501..0ff3ec6 100644
--- a/tobago-core/src/test/resources/renderer/buttons/separator-inside-buttons.html
+++ b/tobago-core/src/test/resources/renderer/buttons/separator-inside-buttons.html
@@ -17,7 +17,7 @@
 <!--
 CSS class of "tobago-dropdown" has changed from btn-group to dropdown
 -->
-<tobago-buttons id='list' class='btn-group' role='group'>
+<tobago-buttons id='list' class='btn-group tobago-auto-spacing' role='group'>
   <tobago-dropdown id='id' class='dropdown btn-group'>
     <button type='button' id='id::command' name='id' data-bs-toggle='dropdown' aria-expanded='false' class='tobago-button btn btn-secondary dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>button</span></button>
     <div class='dropdown-menu' aria-labelledby='id::command' name='id'>
diff --git a/tobago-core/src/test/resources/renderer/date/date-label.html b/tobago-core/src/test/resources/renderer/date/date-label.html
index de03329..56531f5 100644
--- a/tobago-core/src/test/resources/renderer/date/date-label.html
+++ b/tobago-core/src/test/resources/renderer/date/date-label.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-date id='id' class='tobago-label-container tobago-margin-bottom' pattern='dd.mm.yyyy' i18n='{"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthsShort":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"daysShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"daysMin":["Sun","Mon","Tue","Wed","Thu","Fri" [...]
+<tobago-date id='id' class='tobago-label-container tobago-auto-spacing' pattern='dd.mm.yyyy' i18n='{"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthsShort":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"daysShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"daysMin":["Sun","Mon","Tue","Wed","Thu","Fri", [...]
   <label for='id::field' class='col-form-label'>Label</label>
   <div class='tobago-input-group-outer'>
     <div class='input-group'>
diff --git a/tobago-core/src/test/resources/renderer/date/date-today-button.html b/tobago-core/src/test/resources/renderer/date/date-today-button.html
index 139adb9..2f3b21d 100644
--- a/tobago-core/src/test/resources/renderer/date/date-today-button.html
+++ b/tobago-core/src/test/resources/renderer/date/date-today-button.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-date id='id' class='tobago-label-container tobago-margin-bottom' pattern='dd.mm.yyyy' i18n='{"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthsShort":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"daysShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"daysMin":["Sun","Mon","Tue","Wed","Thu","Fri" [...]
+<tobago-date id='id' class='tobago-label-container tobago-auto-spacing' pattern='dd.mm.yyyy' i18n='{"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthsShort":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"daysShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"daysMin":["Sun","Mon","Tue","Wed","Thu","Fri", [...]
   <label for='id::field' class='col-form-label'>Label</label>
   <div class='tobago-input-group-outer'>
     <div class='input-group'>
diff --git a/tobago-core/src/test/resources/renderer/date/date.html b/tobago-core/src/test/resources/renderer/date/date.html
index 32a0694..1c80ca2 100644
--- a/tobago-core/src/test/resources/renderer/date/date.html
+++ b/tobago-core/src/test/resources/renderer/date/date.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-date id='id' class='tobago-margin-bottom' pattern='dd.mm.yyyy' i18n='{"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthsShort":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"daysShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"daysMin":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"firstDay":0,"m [...]
+<tobago-date id='id' class='tobago-auto-spacing' pattern='dd.mm.yyyy' i18n='{"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthsShort":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"days":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"daysShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"daysMin":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"firstDay":0,"mi [...]
   <div class='tobago-input-group-outer'>
     <div class='input-group'>
       <input type='text' name='id' id='id::field' class='form-control'>
diff --git a/tobago-core/src/test/resources/renderer/file/file-label.html b/tobago-core/src/test/resources/renderer/file/file-label.html
index 0eac1fa..af5867d 100644
--- a/tobago-core/src/test/resources/renderer/file/file-label.html
+++ b/tobago-core/src/test/resources/renderer/file/file-label.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-file id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-file id='id' class='tobago-label-container tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <div class='input-group'>
     <input type='file' tabindex='-1' id='id::field' class='form-control' name='id'>
diff --git a/tobago-core/src/test/resources/renderer/in/ajax.html b/tobago-core/src/test/resources/renderer/in/ajax.html
index 3895032..99e1be0 100644
--- a/tobago-core/src/test/resources/renderer/in/ajax.html
+++ b/tobago-core/src/test/resources/renderer/in/ajax.html
@@ -16,12 +16,12 @@
 -->
 
 <tobago-panel id='panel'>
-  <tobago-in id='id' class='tobago-label-container tobago-margin-bottom'>
+  <tobago-in id='id' class='tobago-label-container tobago-auto-spacing'>
     <label for='id::field' class='col-form-label'>label</label>
     <input type='text' name='id' id='id::field' class='tobago-in form-control'>
     <tobago-behavior event='change' client-id='id' field-id='id::field' execute='textarea id' render='panel'></tobago-behavior>
   </tobago-in>
-  <tobago-textarea id='textarea' class='tobago-margin-bottom'>
+  <tobago-textarea id='textarea' class='tobago-auto-spacing'>
     <textarea name='textarea' id='textarea::field' class='form-control'></textarea>
   </tobago-textarea>
 </tobago-panel>
diff --git a/tobago-core/src/test/resources/renderer/in/error-message.html b/tobago-core/src/test/resources/renderer/in/error-message.html
index 7b5c6c3..e11fb94 100644
--- a/tobago-core/src/test/resources/renderer/in/error-message.html
+++ b/tobago-core/src/test/resources/renderer/in/error-message.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-label-container tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <div class='tobago-messages-container'>
     <input type='text' name='id' id='id::field' title='a test' class='tobago-in border-danger form-control' autofocus='autofocus'>
diff --git a/tobago-core/src/test/resources/renderer/in/help.html b/tobago-core/src/test/resources/renderer/in/help.html
index e277305..9c335c2 100644
--- a/tobago-core/src/test/resources/renderer/in/help.html
+++ b/tobago-core/src/test/resources/renderer/in/help.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-label-container tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <div class='tobago-messages-container'>
     <input type='text' name='id' id='id::field' class='tobago-in form-control'>
diff --git a/tobago-core/src/test/resources/renderer/in/input-group-button-after.html b/tobago-core/src/test/resources/renderer/in/input-group-button-after.html
index 0627e65..8746eb1 100644
--- a/tobago-core/src/test/resources/renderer/in/input-group-button-after.html
+++ b/tobago-core/src/test/resources/renderer/in/input-group-button-after.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <div class='tobago-input-group-outer'>
     <div class='input-group'>
       <input type='text' name='id' id='id::field' class='tobago-in form-control'>
diff --git a/tobago-core/src/test/resources/renderer/in/input-group-button-before.html b/tobago-core/src/test/resources/renderer/in/input-group-button-before.html
index ee634f4..667f781 100644
--- a/tobago-core/src/test/resources/renderer/in/input-group-button-before.html
+++ b/tobago-core/src/test/resources/renderer/in/input-group-button-before.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <div class='tobago-input-group-outer'>
     <div class='input-group'>
       <button type='button' id='button' name='button' class='tobago-button btn btn-secondary'><tobago-behavior event='click' client-id='button'></tobago-behavior><span>button</span></button>
diff --git a/tobago-core/src/test/resources/renderer/in/input-group-choice-after.html b/tobago-core/src/test/resources/renderer/in/input-group-choice-after.html
index d85c6e7..7b9c126 100644
--- a/tobago-core/src/test/resources/renderer/in/input-group-choice-after.html
+++ b/tobago-core/src/test/resources/renderer/in/input-group-choice-after.html
@@ -15,11 +15,11 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <div class='tobago-input-group-outer'>
     <div class='input-group'>
       <input type='text' name='id' id='id::field' class='tobago-in form-control'>
-      <tobago-select-one-choice id='choice' class='form-select tobago-margin-bottom'>
+      <tobago-select-one-choice id='choice' class='form-select'>
         <select id='choice::field' name='choice' class='form-select'>
           <option value=''>Stratocaster
           </option>
diff --git a/tobago-core/src/test/resources/renderer/in/input-group-dropdown-after.html b/tobago-core/src/test/resources/renderer/in/input-group-dropdown-after.html
index d3e88f5..370f45f 100644
--- a/tobago-core/src/test/resources/renderer/in/input-group-dropdown-after.html
+++ b/tobago-core/src/test/resources/renderer/in/input-group-dropdown-after.html
@@ -17,7 +17,7 @@
 <!--
 dropdown-menu-right is temporarily not here (in the div with dropdown-menu), XXX might be to fixed?
 -->
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <div class='tobago-input-group-outer'>
     <div class='input-group'>
       <input type='text' name='id' id='id::field' class='tobago-in form-control'>
diff --git a/tobago-core/src/test/resources/renderer/in/input-group-dropdown-before.html b/tobago-core/src/test/resources/renderer/in/input-group-dropdown-before.html
index b42a3ec..07ce947 100644
--- a/tobago-core/src/test/resources/renderer/in/input-group-dropdown-before.html
+++ b/tobago-core/src/test/resources/renderer/in/input-group-dropdown-before.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <div class='tobago-input-group-outer'>
     <div class='input-group'>
       <tobago-dropdown id='button' class='dropdown'>
diff --git a/tobago-core/src/test/resources/renderer/in/input-group-out-after.html b/tobago-core/src/test/resources/renderer/in/input-group-out-after.html
index c502b49..f94a82e 100644
--- a/tobago-core/src/test/resources/renderer/in/input-group-out-after.html
+++ b/tobago-core/src/test/resources/renderer/in/input-group-out-after.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <div class='tobago-input-group-outer'>
     <div class='input-group'>
       <input type='text' name='id' id='id::field' class='tobago-in form-control'>
diff --git a/tobago-core/src/test/resources/renderer/in/input-group-out-before.html b/tobago-core/src/test/resources/renderer/in/input-group-out-before.html
index e7941fc..2d92029 100644
--- a/tobago-core/src/test/resources/renderer/in/input-group-out-before.html
+++ b/tobago-core/src/test/resources/renderer/in/input-group-out-before.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <div class='tobago-input-group-outer'>
     <div class='input-group'>
       <tobago-out class='input-group-text'>out</tobago-out>
diff --git a/tobago-core/src/test/resources/renderer/in/label-flexLeft.html b/tobago-core/src/test/resources/renderer/in/label-flexLeft.html
index be1785b..4914277 100644
--- a/tobago-core/src/test/resources/renderer/in/label-flexLeft.html
+++ b/tobago-core/src/test/resources/renderer/in/label-flexLeft.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-label-container tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/in/label-flexRight.html b/tobago-core/src/test/resources/renderer/in/label-flexRight.html
index 0bf871a..1b0e438 100644
--- a/tobago-core/src/test/resources/renderer/in/label-flexRight.html
+++ b/tobago-core/src/test/resources/renderer/in/label-flexRight.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-label-container tobago-auto-spacing'>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
   <label for='id::field' class='col-form-label'>label</label>
 </tobago-in>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/in/label-flowLeft.html b/tobago-core/src/test/resources/renderer/in/label-flowLeft.html
index b3a3a2e..527b120 100644
--- a/tobago-core/src/test/resources/renderer/in/label-flowLeft.html
+++ b/tobago-core/src/test/resources/renderer/in/label-flowLeft.html
@@ -16,6 +16,6 @@
 -->
 
 <label for='id::field' class='col-form-label'>label</label>
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/in/label-flowRight.html b/tobago-core/src/test/resources/renderer/in/label-flowRight.html
index da4912c..d50403e 100644
--- a/tobago-core/src/test/resources/renderer/in/label-flowRight.html
+++ b/tobago-core/src/test/resources/renderer/in/label-flowRight.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
 <label for='id::field' class='col-form-label'>label</label>
diff --git a/tobago-core/src/test/resources/renderer/in/label-gridBottom.html b/tobago-core/src/test/resources/renderer/in/label-gridBottom.html
index 5325c06..ff2bd01 100644
--- a/tobago-core/src/test/resources/renderer/in/label-gridBottom.html
+++ b/tobago-core/src/test/resources/renderer/in/label-gridBottom.html
@@ -16,6 +16,6 @@
 -->
 
 <label for='id::field' class='col-form-label'>label</label>
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
diff --git a/tobago-core/src/test/resources/renderer/in/label-gridLeft.html b/tobago-core/src/test/resources/renderer/in/label-gridLeft.html
index 5325c06..ff2bd01 100644
--- a/tobago-core/src/test/resources/renderer/in/label-gridLeft.html
+++ b/tobago-core/src/test/resources/renderer/in/label-gridLeft.html
@@ -16,6 +16,6 @@
 -->
 
 <label for='id::field' class='col-form-label'>label</label>
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
diff --git a/tobago-core/src/test/resources/renderer/in/label-gridRight.html b/tobago-core/src/test/resources/renderer/in/label-gridRight.html
index 5325c06..ff2bd01 100644
--- a/tobago-core/src/test/resources/renderer/in/label-gridRight.html
+++ b/tobago-core/src/test/resources/renderer/in/label-gridRight.html
@@ -16,6 +16,6 @@
 -->
 
 <label for='id::field' class='col-form-label'>label</label>
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
diff --git a/tobago-core/src/test/resources/renderer/in/label-gridTop.html b/tobago-core/src/test/resources/renderer/in/label-gridTop.html
index 5325c06..ff2bd01 100644
--- a/tobago-core/src/test/resources/renderer/in/label-gridTop.html
+++ b/tobago-core/src/test/resources/renderer/in/label-gridTop.html
@@ -16,6 +16,6 @@
 -->
 
 <label for='id::field' class='col-form-label'>label</label>
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
diff --git a/tobago-core/src/test/resources/renderer/in/label-none.html b/tobago-core/src/test/resources/renderer/in/label-none.html
index abef565..8153fbd 100644
--- a/tobago-core/src/test/resources/renderer/in/label-none.html
+++ b/tobago-core/src/test/resources/renderer/in/label-none.html
@@ -15,6 +15,6 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
diff --git a/tobago-core/src/test/resources/renderer/in/label-segmentLeft.html b/tobago-core/src/test/resources/renderer/in/label-segmentLeft.html
index ccaea96..2eb22ca 100644
--- a/tobago-core/src/test/resources/renderer/in/label-segmentLeft.html
+++ b/tobago-core/src/test/resources/renderer/in/label-segmentLeft.html
@@ -20,7 +20,7 @@
     <label for='id::field' class='col-form-label'>label</label>
   </div>
   <div class='col-md-9'>
-    <tobago-in id='id' class='tobago-margin-bottom'>
+    <tobago-in id='id' class='tobago-auto-spacing'>
       <input type='text' name='id' id='id::field' class='tobago-in form-control'>
     </tobago-in>
   </div>
diff --git a/tobago-core/src/test/resources/renderer/in/label-segmentRight.html b/tobago-core/src/test/resources/renderer/in/label-segmentRight.html
index 9ed3332..c712b40 100644
--- a/tobago-core/src/test/resources/renderer/in/label-segmentRight.html
+++ b/tobago-core/src/test/resources/renderer/in/label-segmentRight.html
@@ -17,7 +17,7 @@
 
 <tobago-segment-layout id='segid' class='row'>
   <div class='col-md-9'>
-    <tobago-in id='id' class='tobago-margin-bottom'>
+    <tobago-in id='id' class='tobago-auto-spacing'>
       <input type='text' name='id' id='id::field' class='tobago-in form-control'>
     </tobago-in>
   </div>
diff --git a/tobago-core/src/test/resources/renderer/in/label-skip.html b/tobago-core/src/test/resources/renderer/in/label-skip.html
index 32aa9a0..2eb016a 100644
--- a/tobago-core/src/test/resources/renderer/in/label-skip.html
+++ b/tobago-core/src/test/resources/renderer/in/label-skip.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
diff --git a/tobago-core/src/test/resources/renderer/in/label-top.html b/tobago-core/src/test/resources/renderer/in/label-top.html
index 32aa9a0..2eb016a 100644
--- a/tobago-core/src/test/resources/renderer/in/label-top.html
+++ b/tobago-core/src/test/resources/renderer/in/label-top.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
diff --git a/tobago-core/src/test/resources/renderer/in/simple.html b/tobago-core/src/test/resources/renderer/in/simple.html
index b95d97c..968c39f 100644
--- a/tobago-core/src/test/resources/renderer/in/simple.html
+++ b/tobago-core/src/test/resources/renderer/in/simple.html
@@ -15,6 +15,6 @@
  * limitations under the License.
 -->
 
-<tobago-in id='id' class='tobago-margin-bottom'>
+<tobago-in id='id' class='tobago-auto-spacing'>
   <input type='text' name='id' id='id::field' class='tobago-in form-control'>
 </tobago-in>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html b/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html
index e6235ae..d5b478e 100644
--- a/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html
+++ b/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html
@@ -16,7 +16,7 @@
 -->
 
 <tobago-dropdown id='id' class='dropdown'>
-  <button type='button' id='id::command' name='id' data-bs-toggle='dropdown' aria-expanded='false' class='tobago-link btn btn-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
+  <button type='button' id='id::command' name='id' data-bs-toggle='dropdown' aria-expanded='false' class='tobago-link btn btn-link tobago-auto-spacing dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
   <div class='dropdown-menu' aria-labelledby='id::command' name='id'>
     <tobago-select-boolean-checkbox id='id' class='form-check dropdown-item'>
       <input class='form-check-input' type='checkbox' value='true' name='id' id='id::field'>
diff --git a/tobago-core/src/test/resources/renderer/link/link.html b/tobago-core/src/test/resources/renderer/link/link.html
index cb3d098..616498d 100644
--- a/tobago-core/src/test/resources/renderer/link/link.html
+++ b/tobago-core/src/test/resources/renderer/link/link.html
@@ -15,4 +15,4 @@
  * limitations under the License.
 -->
 
-<a id='id' name='id' href='https://www.apache.org/' class='tobago-link'><tobago-behavior event='click' client-id='id' omit='omit'></tobago-behavior><span>label</span></a>
\ No newline at end of file
+<a id='id' name='id' href='https://www.apache.org/' class='tobago-link tobago-auto-spacing'><tobago-behavior event='click' client-id='id' omit='omit'></tobago-behavior><span>label</span></a>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/link/manyInsideLink.html b/tobago-core/src/test/resources/renderer/link/manyInsideLink.html
index 89e669b..0a369e7 100644
--- a/tobago-core/src/test/resources/renderer/link/manyInsideLink.html
+++ b/tobago-core/src/test/resources/renderer/link/manyInsideLink.html
@@ -16,7 +16,7 @@
 -->
 
 <tobago-dropdown id='id' class='dropdown'>
-  <button type='button' id='id::command' name='id' data-bs-toggle='dropdown' aria-expanded='false' class='tobago-link btn btn-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
+  <button type='button' id='id::command' name='id' data-bs-toggle='dropdown' aria-expanded='false' class='tobago-link btn btn-link tobago-auto-spacing dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
   <div class='dropdown-menu' aria-labelledby='id::command' name='id'>
     <tobago-select-many-checkbox>
       <div class='form-check dropdown-item'>
diff --git a/tobago-core/src/test/resources/renderer/link/radioInsideLink.html b/tobago-core/src/test/resources/renderer/link/radioInsideLink.html
index 9bfa0eb..54df9b5 100644
--- a/tobago-core/src/test/resources/renderer/link/radioInsideLink.html
+++ b/tobago-core/src/test/resources/renderer/link/radioInsideLink.html
@@ -16,7 +16,7 @@
 -->
 
 <tobago-dropdown id='id' class='dropdown'>
-  <button type='button' id='id::command' name='id' data-bs-toggle='dropdown' aria-expanded='false' class='tobago-link btn btn-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
+  <button type='button' id='id::command' name='id' data-bs-toggle='dropdown' aria-expanded='false' class='tobago-link btn btn-link tobago-auto-spacing dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
   <div class='dropdown-menu' aria-labelledby='id::command' name='id'>
     <tobago-select-one-radio>
       <div class='form-check dropdown-item'>
diff --git a/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html b/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html
index a945d81..ef60ef7 100644
--- a/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html
+++ b/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html
@@ -16,7 +16,7 @@
 -->
 
 <tobago-dropdown id='id' class='dropdown'>
-  <button type='button' id='id::command' name='id' data-bs-toggle='dropdown' aria-expanded='false' class='tobago-link btn btn-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
+  <button type='button' id='id::command' name='id' data-bs-toggle='dropdown' aria-expanded='false' class='tobago-link btn btn-link tobago-auto-spacing dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
   <div class='dropdown-menu' aria-labelledby='id::command' name='id'>
     <a id='link1' name='link1' href='https://www.apache.org/' class='tobago-link dropdown-item'><tobago-behavior event='click' client-id='link1' omit='omit'></tobago-behavior><span>Link 1</span></a>
     <tobago-separator id='separator' class='dropdown-divider'>
diff --git a/tobago-core/src/test/resources/renderer/links/link-inside-links-sub.html b/tobago-core/src/test/resources/renderer/links/link-inside-links-sub.html
index 1c4d575..2d77b03 100644
--- a/tobago-core/src/test/resources/renderer/links/link-inside-links-sub.html
+++ b/tobago-core/src/test/resources/renderer/links/link-inside-links-sub.html
@@ -17,7 +17,7 @@
 <!--
 CSS class nav-item has moved from "tobago-dropdown" to "li"
 -->
-<tobago-links id='list'>
+<tobago-links id='list' class='tobago-auto-spacing'>
   <ul class='nav'>
     <li class='nav-item'>
       <tobago-dropdown id='id' class='dropdown'>
diff --git a/tobago-core/src/test/resources/renderer/links/link-inside-links.html b/tobago-core/src/test/resources/renderer/links/link-inside-links.html
index 36287c4..3c905ca 100644
--- a/tobago-core/src/test/resources/renderer/links/link-inside-links.html
+++ b/tobago-core/src/test/resources/renderer/links/link-inside-links.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-links id='list'>
+<tobago-links id='list' class='tobago-auto-spacing'>
   <ul class='nav'>
     <li class='nav-item'>
       <a id='id' name='id' href='https://www.apache.org/' class='tobago-link nav-link'><tobago-behavior event='click' client-id='id' omit='omit'></tobago-behavior><span>apache</span></a>
diff --git a/tobago-core/src/test/resources/renderer/range/range-label.html b/tobago-core/src/test/resources/renderer/range/range-label.html
index dcb920c..296f52b 100644
--- a/tobago-core/src/test/resources/renderer/range/range-label.html
+++ b/tobago-core/src/test/resources/renderer/range/range-label.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-range id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-range id='id' class='tobago-label-container tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <input type='range' name='id' id='id::field' min='0' max='100' step='1' class='tobago-in form-control'>
 </tobago-range>
diff --git a/tobago-core/src/test/resources/renderer/selectBooleanCheckbox/selectBooleanCheckboxItemLabel.html b/tobago-core/src/test/resources/renderer/selectBooleanCheckbox/selectBooleanCheckboxItemLabel.html
index 75f7cd0..eb3ce3c 100644
--- a/tobago-core/src/test/resources/renderer/selectBooleanCheckbox/selectBooleanCheckboxItemLabel.html
+++ b/tobago-core/src/test/resources/renderer/selectBooleanCheckbox/selectBooleanCheckboxItemLabel.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-select-boolean-checkbox id='id' class='tobago-margin-bottom'>
+<tobago-select-boolean-checkbox id='id' class='tobago-auto-spacing'>
   <div class='form-check col-form-label'>
     <input class='form-check-input' type='checkbox' value='true' name='id' id='id::field'>
     <label class='form-check-label' for='id::field'>label</label>
diff --git a/tobago-core/src/test/resources/renderer/selectBooleanCheckbox/selectBooleanCheckboxLabel.html b/tobago-core/src/test/resources/renderer/selectBooleanCheckbox/selectBooleanCheckboxLabel.html
index aecae62..72ffcbc 100644
--- a/tobago-core/src/test/resources/renderer/selectBooleanCheckbox/selectBooleanCheckboxLabel.html
+++ b/tobago-core/src/test/resources/renderer/selectBooleanCheckbox/selectBooleanCheckboxLabel.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-select-boolean-checkbox id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-select-boolean-checkbox id='id' class='tobago-label-container tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <div class='form-check col-form-label'>
     <input class='form-check-input' type='checkbox' value='true' name='id' id='id::field'>
diff --git a/tobago-core/src/test/resources/renderer/selectBooleanToggle/selectBooleanToggleItemLabel.html b/tobago-core/src/test/resources/renderer/selectBooleanToggle/selectBooleanToggleItemLabel.html
index 1800254..c64dcac 100644
--- a/tobago-core/src/test/resources/renderer/selectBooleanToggle/selectBooleanToggleItemLabel.html
+++ b/tobago-core/src/test/resources/renderer/selectBooleanToggle/selectBooleanToggleItemLabel.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-select-boolean-toggle id='id' class='tobago-margin-bottom'>
+<tobago-select-boolean-toggle id='id' class='tobago-auto-spacing'>
   <div class='form-check col-form-label form-switch'>
     <input class='form-check-input' type='checkbox' value='true' name='id' id='id::field'>
     <label class='form-check-label' for='id::field'>label</label>
diff --git a/tobago-core/src/test/resources/renderer/selectBooleanToggle/selectBooleanToggleLabel.html b/tobago-core/src/test/resources/renderer/selectBooleanToggle/selectBooleanToggleLabel.html
index 83b3837..3d16fab 100644
--- a/tobago-core/src/test/resources/renderer/selectBooleanToggle/selectBooleanToggleLabel.html
+++ b/tobago-core/src/test/resources/renderer/selectBooleanToggle/selectBooleanToggleLabel.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-select-boolean-toggle id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-select-boolean-toggle id='id' class='tobago-label-container tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <div class='form-check col-form-label form-switch'>
     <input class='form-check-input' type='checkbox' value='true' name='id' id='id::field'>
diff --git a/tobago-core/src/test/resources/renderer/selectOneChoice/selectOneChoiceLabel.html b/tobago-core/src/test/resources/renderer/selectOneChoice/selectOneChoiceLabel.html
index 6a4bd74..6d75f42 100644
--- a/tobago-core/src/test/resources/renderer/selectOneChoice/selectOneChoiceLabel.html
+++ b/tobago-core/src/test/resources/renderer/selectOneChoice/selectOneChoiceLabel.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-select-one-choice id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-select-one-choice id='id' class='tobago-label-container tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <select id='id::field' name='id' class='form-control'>
     <option value=''>Stratocaster
diff --git a/tobago-core/src/test/resources/renderer/selectOneRadio/selectOneRadioLabel.html b/tobago-core/src/test/resources/renderer/selectOneRadio/selectOneRadioLabel.html
index 965d2dc..243f05c 100644
--- a/tobago-core/src/test/resources/renderer/selectOneRadio/selectOneRadioLabel.html
+++ b/tobago-core/src/test/resources/renderer/selectOneRadio/selectOneRadioLabel.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-select-one-radio id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-select-one-radio id='id' class='tobago-label-container tobago-auto-spacing'>
   <label class='col-form-label'>label</label>
   <div>
     <div class='form-check'>
diff --git a/tobago-core/src/test/resources/renderer/textarea/with-label.html b/tobago-core/src/test/resources/renderer/textarea/with-label.html
index 3abcb45..1ce7b26 100644
--- a/tobago-core/src/test/resources/renderer/textarea/with-label.html
+++ b/tobago-core/src/test/resources/renderer/textarea/with-label.html
@@ -15,7 +15,7 @@
  * limitations under the License.
 -->
 
-<tobago-textarea id='id' class='tobago-label-container tobago-margin-bottom'>
+<tobago-textarea id='id' class='tobago-label-container tobago-auto-spacing'>
   <label for='id::field' class='col-form-label'>label</label>
   <textarea name='id' id='id::field' class='form-control'></textarea>
 </tobago-textarea>
\ No newline at end of file
diff --git a/tobago-theme/src/main/scss/_tobago.scss b/tobago-theme/src/main/scss/_tobago.scss
index 66183f1..e43dd0a 100644
--- a/tobago-theme/src/main/scss/_tobago.scss
+++ b/tobago-theme/src/main/scss/_tobago.scss
@@ -124,6 +124,13 @@ $page-padding-top: 1rem;
   }
 }
 
+.tobago-auto-spacing {
+  /* Since bootstrap 5.0.0-alpha1 class "form-group" is removed. In the Bootstrap demo "form-group" is replaced with
+  "mb-3". But we shouldn't use "mb-3", because it's adding an "!important" to the margin-bottom. With "!important" added
+  custom styling is much more complicated. */
+  margin-bottom: $spacer;
+}
+
 /* badge -------------------------------------------------------------- */
 .tobago-badge {
 }
@@ -173,8 +180,6 @@ tobago-behavior {
 /* box -------------------------------------------------------------- */
 
 tobago-box {
-  margin-bottom: $card-spacer-y;
-
   > .card-body {
     overflow-x: hidden;
     overflow-y: auto;
@@ -475,11 +480,6 @@ tobago-in {
       /* fix style for surrounding container (tobago-select-one-choice).
       According to bootstrap docs, <select class=.form-select> should be rendered directly to .input-group. But tobago
       renders the tobago-select-one-choice custom tag (which contain the select component) inside an input group. */
-
-      &.tobago-margin-bottom {
-        margin-bottom: 0;
-      }
-
       &.form-select {
         padding: 0;
 
@@ -676,13 +676,6 @@ tobago-flex-layout.tobago-messages-container > {
   }
 }
 
-.tobago-margin-bottom {
-  /* Since bootstrap 5.0.0-alpha1 class "form-group" is removed. In the Bootstrap demo "form-group" is replaced with
-  "mb-3". But we shouldn't use "mb-3", because it's adding an "!important" to the margin-bottom. With "!important" added
-  custom styling is much more complicated. */
-  margin-bottom: 1rem;
-}
-
 .tobago-messages {
   $alert-icon-padding-x: $alert-padding-x / 1.25;
   $alert-icon-width: $alert-icon-padding-x + 1rem + $alert-icon-padding-x;
@@ -1485,7 +1478,6 @@ tobago-tab.tobago-tab-barFacet {
 }
 
 tobago-tab-group {
-  margin-bottom: $spacer;
 }
 
 /* FIXME: This is to hide the toolbar, until it is implemented */