myfaces-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From lof...@apache.org
Subject [myfaces-tobago] branch master updated: TOBAGO-2044: Evaluate use of Bootstrap 5
Date Wed, 23 Sep 2020 13:07:57 GMT
This is an automated email from the ASF dual-hosted git repository.

lofwyr 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 0d11c9b  TOBAGO-2044: Evaluate use of Bootstrap 5
0d11c9b is described below

commit 0d11c9b463ef6a6dffb759d8b53a83496bee8954
Author: Udo Schnurpfeil <udo.schnurpfeil@irian.eu>
AuthorDate: Wed Sep 23 15:07:35 2020 +0200

    TOBAGO-2044: Evaluate use of Bootstrap 5
    
    implement 5 alpha 1
    still broken: menu und dropdowns
---
 .../internal/renderkit/renderer/BadgeRenderer.java |  20 +-
 .../renderkit/renderer/ButtonRenderer.java         |   2 +-
 .../internal/renderkit/renderer/FileRenderer.java  |  46 +-
 .../renderer/LabelLayoutRendererBase.java          |  10 +-
 .../renderer/MessageLayoutRendererBase.java        |   2 +-
 .../internal/renderkit/renderer/RangeRenderer.java |   3 +-
 ...SelectBooleanCheckboxInsideCommandRenderer.java |   3 +-
 .../renderer/SelectBooleanCheckboxRenderer.java    |   7 +-
 .../renderer/SelectBooleanToggleRenderer.java      |   4 +-
 .../renderer/SelectManyCheckboxRenderer.java       |  10 +-
 .../renderer/SelectOneChoiceInsideInRenderer.java  |   2 +-
 .../renderkit/renderer/SelectOneRadioRenderer.java |  10 +-
 .../renderkit/renderer/TreeSelectRenderer.java     |  11 +-
 .../tobago/renderkit/css/BootstrapClass.java       | 181 ++++-
 .../renderkit/css/FontAwesomeIconEncoder.java      | 102 ---
 .../myfaces/tobago/renderkit/css/IconEncoder.java  |  34 -
 .../myfaces/tobago/renderkit/css/TobagoClass.java  |   2 +-
 .../tobago/renderkit/html/CustomAttributes.java    |   1 +
 .../tobago/webapp/TobagoResponseWriter.java        |  15 -
 tobago-core/src/main/resources/scss/_tobago.scss   | 140 +---
 .../src/main/resources/scss/_variables.scss        | 894 +++++++++++++++++++++
 .../src/main/resources/scss/datepicker-bs5.scss    |  97 +++
 .../20-component/100-upload/File_Upload.xhtml      |  15 +-
 .../src/main/npm/package-lock.json                 |   6 +-
 .../src/main/npm/package.json                      |  17 +-
 .../src/main/scss/tobago-theme.scss                |   5 +-
 .../src/main/npm/package-lock.json                 |   6 +-
 .../src/main/npm/package.json                      |  17 +-
 .../src/main/scss/tobago-theme.scss                |   5 +-
 .../src/main/npm/package-lock.json                 |   6 +-
 .../src/main/npm/package.json                      |  17 +-
 .../src/main/scss/tobago-theme.scss                |   5 +-
 .../src/main/npm/package-lock.json                 |   6 +-
 .../src/main/npm/package.json                      |  17 +-
 .../src/main/scss/tobago-theme.scss                |   5 +-
 .../src/main/npm/package-lock.json                 |   6 +-
 .../src/main/npm/package.json                      |  17 +-
 .../src/main/npm/ts/tobago-file.ts                 |  30 +-
 .../src/main/scss/tobago-theme.scss                |   5 +-
 39 files changed, 1400 insertions(+), 381 deletions(-)

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BadgeRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BadgeRenderer.java
index 7ccd331..708901a 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BadgeRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BadgeRenderer.java
@@ -51,7 +51,7 @@ public class BadgeRenderer extends RendererBase {
         TobagoClass.BADGE.createMarkup(markup),
         BootstrapClass.BADGE,
         getBadgeColor(markup),
-        markup.contains(Markup.PILL) ? BootstrapClass.BADGE_PILL : null,
+        markup.contains(Markup.PILL) ? BootstrapClass.ROUNDED_PILL : null,
         getAdditionalCssItem(),
         badge.getCustomClass());
 
@@ -77,23 +77,23 @@ public class BadgeRenderer extends RendererBase {
     if (markup.contains(Markup.NONE)) {
       return null;
     } else if (markup.contains(Markup.PRIMARY)) {
-      return BootstrapClass.BADGE_PRIMARY;
+      return BootstrapClass.BG_PRIMARY;
     } else if (markup.contains(Markup.SECONDARY)) {
-      return BootstrapClass.BADGE_SECONDARY;
+      return BootstrapClass.BG_SECONDARY;
     } else if (markup.contains(Markup.SUCCESS)) {
-      return BootstrapClass.BADGE_SUCCESS;
+      return BootstrapClass.BG_SUCCESS;
     } else if (markup.contains(Markup.DANGER)) {
-      return BootstrapClass.BADGE_DANGER;
+      return BootstrapClass.BG_DANGER;
     } else if (markup.contains(Markup.WARNING)) {
-      return BootstrapClass.BADGE_WARNING;
+      return BootstrapClass.BG_WARNING;
     } else if (markup.contains(Markup.INFO)) {
-      return BootstrapClass.BADGE_INFO;
+      return BootstrapClass.BG_INFO;
     } else if (markup.contains(Markup.LIGHT)) {
-      return BootstrapClass.BADGE_LIGHT;
+      return BootstrapClass.BG_LIGHT;
     } else if (markup.contains(Markup.DARK)) {
-      return BootstrapClass.BADGE_DARK;
+      return BootstrapClass.BG_DARK;
     } else {
-      return BootstrapClass.BADGE_SECONDARY;
+      return BootstrapClass.BG_SECONDARY;
     }
   }
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ButtonRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ButtonRenderer.java
index 4ddc5be..ed88683 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ButtonRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ButtonRenderer.java
@@ -49,7 +49,7 @@ public class ButtonRenderer extends CommandRendererBase {
         BootstrapClass.BTN,
         getButtonColor(command.getMarkup(), defaultCommand),
         markup.contains(Markup.BADGE) ? BootstrapClass.BADGE : null,
-        markup.contains(Markup.BADGE) && markup.contains(Markup.PILL) ? BootstrapClass.BADGE_PILL : null,
+        markup.contains(Markup.BADGE) && markup.contains(Markup.PILL) ? BootstrapClass.ROUNDED_PILL : null,
     };
   }
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FileRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FileRenderer.java
index b2765a9..6db5ee3 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FileRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/FileRenderer.java
@@ -24,8 +24,9 @@ import org.apache.myfaces.tobago.internal.component.AbstractUIFile;
 import org.apache.myfaces.tobago.internal.util.HtmlRendererUtils;
 import org.apache.myfaces.tobago.internal.util.HttpPartWrapper;
 import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
+import org.apache.myfaces.tobago.renderkit.css.Icons;
 import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
-import org.apache.myfaces.tobago.renderkit.html.DataAttributes;
+import org.apache.myfaces.tobago.renderkit.html.CustomAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
 import org.apache.myfaces.tobago.renderkit.html.HtmlInputTypes;
@@ -115,13 +116,23 @@ public class FileRenderer extends MessageLayoutRendererBase implements Component
   }
 
   @Override
+  protected void encodeAttributes(final FacesContext facesContext, final UIComponent component) throws IOException {
+    final AbstractUIFile file = (AbstractUIFile) component;
+    final String placeholder = file.getPlaceholder();
+    final String multiFormat = ResourceUtils.getString(facesContext, "file.selected");
+
+    final TobagoResponseWriter writer = getResponseWriter(facesContext);
+    writer.writeAttribute(HtmlAttributes.PLACEHOLDER, placeholder, true);
+    writer.writeAttribute(CustomAttributes.MULTI_FORMAT, multiFormat, true);
+  }
+
+  @Override
   protected void encodeBeginField(final FacesContext facesContext, final UIComponent component) throws IOException {
 
     final AbstractUIFile file = (AbstractUIFile) component;
     final String clientId = file.getClientId(facesContext);
     final String fieldId = file.getFieldId(facesContext);
     final String accept = createAcceptFromValidators(file);
-    final String placeholder = file.getPlaceholder();
     final boolean multiple = file.isMultiple() && !file.isRequired();
     final boolean disabled = file.isDisabled();
     final boolean readonly = file.isReadonly();
@@ -133,9 +144,10 @@ public class FileRenderer extends MessageLayoutRendererBase implements Component
 
     writer.startElement(HtmlElements.DIV);
     writer.writeClassAttribute(
-        BootstrapClass.CUSTOM_FILE,
+        BootstrapClass.FORM_FILE,
         TobagoClass.FILE.createMarkup(file.getMarkup()),
-        file.getCustomClass());
+        file.getCustomClass(),
+        BootstrapClass.FORM_CONTROL_PLAINTEXT);
     HtmlRendererUtils.writeDataAttributes(facesContext, writer, file);
 
     writer.startElement(HtmlElements.INPUT);
@@ -145,17 +157,12 @@ public class FileRenderer extends MessageLayoutRendererBase implements Component
     writer.writeAttribute(HtmlAttributes.TABINDEX, -1);
     writer.writeIdAttribute(fieldId);
     writer.writeClassAttribute(
-        BootstrapClass.CUSTOM_FILE_INPUT,
+        BootstrapClass.FORM_FILE_INPUT,
         BootstrapClass.borderColor(ComponentUtils.getMaximumSeverity(file)));
     writer.writeNameAttribute(clientId);
-    final String multiFormat = ResourceUtils.getString(facesContext, "file.selected");
-    writer.writeAttribute(DataAttributes.dynamic("tobago-file-multi-format"), multiFormat, true);
     // readonly seems not making sense in browsers.
     writer.writeAttribute(HtmlAttributes.DISABLED, disabled || readonly);
     writer.writeAttribute(HtmlAttributes.READONLY, readonly);
-    if (!disabled && !readonly) {
-      writer.writeAttribute(HtmlAttributes.PLACEHOLDER, placeholder, true);
-    }
     writer.writeAttribute(HtmlAttributes.REQUIRED, file.isRequired());
     // TODO Focus
     //HtmlRendererUtils.renderFocus(clientId, file.isFocus(), ComponentUtils.isError(file), facesContext, writer);
@@ -168,14 +175,19 @@ public class FileRenderer extends MessageLayoutRendererBase implements Component
     encodeBehavior(writer, facesContext, file);
 
     writer.startElement(HtmlElements.LABEL);
-    writer.writeClassAttribute(
-        BootstrapClass.CUSTOM_FILE_LABEL,
-        placeholder != null ? TobagoClass.FILE__PLACEHOLDER : null
-    );
+    writer.writeClassAttribute(BootstrapClass.FORM_FILE_LABEL);
     writer.writeAttribute(HtmlAttributes.FOR, fieldId, false);
-    if (placeholder != null && !disabled && !readonly) {
-      writer.writeText(placeholder);
-    }
+    writer.startElement(HtmlElements.SPAN);
+    writer.writeClassAttribute(BootstrapClass.FORM_FILE_TEXT);
+    writer.endElement(HtmlElements.SPAN);
+    writer.startElement(HtmlElements.SPAN);
+    writer.writeClassAttribute(BootstrapClass.FORM_FILE_BUTTON);
+    writer.startElement(HtmlElements.I);
+    // TODO: define a name
+    writer.writeAttribute(HtmlAttributes.TITLE, "Browse", false);
+    writer.writeClassAttribute(Icons.FA, Icons.FOLDER_OPEN);
+    writer.endElement(HtmlElements.I);
+    writer.endElement(HtmlElements.SPAN);
     writer.endElement(HtmlElements.LABEL);
   }
 
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 b92fdf9..9f12d0e 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
@@ -72,6 +72,9 @@ public abstract class LabelLayoutRendererBase extends DecodingInputRendererBase
     encodeEndSurroundingLabel(facesContext, component);
   }
 
+  protected void encodeAttributes(final FacesContext facesContext, final UIComponent component) throws IOException {
+  }
+
   @Override
   public void encodeChildren(final FacesContext context, final UIComponent component) throws IOException {
     if (component.getChildCount() > 0) {
@@ -107,6 +110,7 @@ public abstract class LabelLayoutRendererBase extends DecodingInputRendererBase
       case skip:
         writer.startElement(getComponentTag());
         writer.writeIdAttribute(clientId);
+        encodeAttributes(facesContext, component);
         return;
       case flexLeft:
       case flexRight:
@@ -134,10 +138,11 @@ public abstract class LabelLayoutRendererBase extends DecodingInputRendererBase
     } else {
       writer.startElement(getComponentTag());
       writer.writeIdAttribute(clientId);
+      encodeAttributes(facesContext, component);
     }
     writer.writeClassAttribute(
         flex ? TobagoClass.FLEX_LAYOUT : null,
-        BootstrapClass.FORM_GROUP,
+        BootstrapClass.MB_3,
         TobagoClass.LABEL__CONTAINER,
         ComponentUtils.getBooleanAttribute(component, Attributes.required) ? TobagoClass.REQUIRED : null,
         markup != null && markup.contains(Markup.SPREAD) ? TobagoClass.SPREAD : null);
@@ -167,8 +172,9 @@ public abstract class LabelLayoutRendererBase extends DecodingInputRendererBase
 
         writer.startElement(getComponentTag());
         writer.writeIdAttribute(clientId);
+        encodeAttributes(facesContext, component);
         writer.writeClassAttribute(
-            BootstrapClass.FORM_GROUP,
+            BootstrapClass.MB_3,
             ComponentUtils.getBooleanAttribute(component, Attributes.required) ? TobagoClass.REQUIRED : null,
             markup != null && markup.contains(Markup.SPREAD) ? TobagoClass.SPREAD : null);
         break;
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 29cb6c3..140957e 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
@@ -234,7 +234,7 @@ public abstract class MessageLayoutRendererBase extends LabelLayoutRendererBase
     writer.writeClassAttribute(TobagoClass.POPOVER__BOX, BootstrapClass.POPOVER);
     writer.writeNameAttribute(popoverId);
     writer.startElement(HtmlElements.DIV);
-    writer.writeClassAttribute(BootstrapClass.ARROW);
+    writer.writeClassAttribute(BootstrapClass.POPOVER_ARROW);
     writer.endElement(HtmlElements.DIV);
     writer.startElement(HtmlElements.H3);
     writer.writeClassAttribute(BootstrapClass.POPOVER_HEADER);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/RangeRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/RangeRenderer.java
index d6a681b..e405bee 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/RangeRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/RangeRenderer.java
@@ -106,10 +106,11 @@ public class RangeRenderer extends MessageLayoutRendererBase {
   private void encodeTooltip(final TobagoResponseWriter writer, final String content) throws IOException {
     writer.startElement(HtmlElements.DIV);
 //    writer.writeClassAttribute(TobagoClass.POPOVER__BOX, BootstrapClass.POPOVER);
+    // todo: check to used TOOLTIP instead of POPOVER
     writer.writeClassAttribute(BootstrapClass.POPOVER, BootstrapClass.D_NONE);
 //    writer.writeNameAttribute(popoverId);
     writer.startElement(HtmlElements.DIV);
-    writer.writeClassAttribute(BootstrapClass.ARROW);
+    writer.writeClassAttribute(BootstrapClass.POPOVER_ARROW);
     writer.endElement(HtmlElements.DIV);
     writer.startElement(HtmlElements.DIV);
     writer.writeClassAttribute(BootstrapClass.POPOVER_BODY);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxInsideCommandRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxInsideCommandRenderer.java
index 4dca7d4..068df56 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxInsideCommandRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxInsideCommandRenderer.java
@@ -48,8 +48,7 @@ public class SelectBooleanCheckboxInsideCommandRenderer extends SelectBooleanChe
   @Override
   protected CssItem[] getOuterCssItems(final FacesContext facesContext, final AbstractUISelectBoolean select) {
     return new CssItem[]{
-        BootstrapClass.CUSTOM_CONTROL,
-        BootstrapClass.CUSTOM_CHECKBOX
+        BootstrapClass.FORM_CHECK
     };
   }
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxRenderer.java
index aee06bf..c0ad340 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanCheckboxRenderer.java
@@ -101,7 +101,7 @@ public class SelectBooleanCheckboxRenderer extends MessageLayoutRendererBase {
     }
 
     writer.startElement(HtmlElements.INPUT);
-    writer.writeClassAttribute(BootstrapClass.CUSTOM_CONTROL_INPUT);
+    writer.writeClassAttribute(BootstrapClass.FORM_CHECK_INPUT);
     writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.CHECKBOX);
     writer.writeAttribute(HtmlAttributes.VALUE, "true", false);
     writer.writeNameAttribute(clientId);
@@ -116,7 +116,7 @@ public class SelectBooleanCheckboxRenderer extends MessageLayoutRendererBase {
 
     writer.startElement(HtmlElements.LABEL);
     writer.writeClassAttribute(
-        BootstrapClass.CUSTOM_CONTROL_LABEL,
+        BootstrapClass.FORM_CHECK_LABEL,
         getCssItems(facesContext, select));
     if (!disabled && label.getAccessKey() != null) {
       writer.writeAttribute(HtmlAttributes.ACCESSKEY, Character.toString(label.getAccessKey()), false);
@@ -160,8 +160,7 @@ public class SelectBooleanCheckboxRenderer extends MessageLayoutRendererBase {
   protected CssItem[] getOuterCssItems(final FacesContext facesContext, final AbstractUISelectBoolean select) {
     return new CssItem[]{
         !select.isLabelLayoutSkip() ? BootstrapClass.COL_FORM_LABEL : null,
-        BootstrapClass.CUSTOM_CONTROL,
-        BootstrapClass.CUSTOM_CHECKBOX
+        BootstrapClass.FORM_CHECK
     };
   }
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanToggleRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanToggleRenderer.java
index 4ca02ea..1936cf0 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanToggleRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectBooleanToggleRenderer.java
@@ -36,8 +36,8 @@ public class SelectBooleanToggleRenderer extends SelectBooleanCheckboxRenderer {
   protected CssItem[] getOuterCssItems(final FacesContext facesContext, final AbstractUISelectBoolean select) {
     return new CssItem[]{
         !select.isLabelLayoutSkip() ? BootstrapClass.COL_FORM_LABEL : null,
-        BootstrapClass.CUSTOM_CONTROL,
-        BootstrapClass.CUSTOM_SWITCH
+        BootstrapClass.FORM_CHECK,
+        BootstrapClass.FORM_SWITCH
     };
   }
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java
index dc0e2e8..46b7956 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectManyCheckboxRenderer.java
@@ -83,12 +83,10 @@ public class SelectManyCheckboxRenderer extends SelectManyRendererBase {
         final String itemId = id + ComponentUtils.SUB_SEPARATOR + i;
         writer.startElement(HtmlElements.DIV);
         writer.writeClassAttribute(
-            BootstrapClass.CUSTOM_CONTROL,
-            BootstrapClass.CUSTOM_CHECKBOX,
-            inline ? BootstrapClass.CUSTOM_CONTROL_INLINE : null);
-
+            BootstrapClass.FORM_CHECK,
+            inline ? BootstrapClass.FORM_CHECK_INLINE : null);
         writer.startElement(HtmlElements.INPUT);
-        writer.writeClassAttribute(BootstrapClass.CUSTOM_CONTROL_INPUT);
+        writer.writeClassAttribute(BootstrapClass.FORM_CHECK_INPUT);
         writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.CHECKBOX);
         final String formattedValue = ComponentUtils.getFormattedValue(facesContext, select, item.getValue());
         final boolean checked;
@@ -113,7 +111,7 @@ public class SelectManyCheckboxRenderer extends SelectManyRendererBase {
 
         writer.startElement(HtmlElements.LABEL);
         writer.writeClassAttribute(
-            BootstrapClass.CUSTOM_CONTROL_LABEL,
+            BootstrapClass.FORM_CHECK_LABEL,
             getCssItems(facesContext, select));
         writer.writeAttribute(HtmlAttributes.FOR, itemId, false);
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneChoiceInsideInRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneChoiceInsideInRenderer.java
index ff16632..b9dc351 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneChoiceInsideInRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneChoiceInsideInRenderer.java
@@ -41,7 +41,7 @@ public class SelectOneChoiceInsideInRenderer extends SelectOneChoiceRenderer {
 
   @Override
   protected CssItem[] getCssItems(final FacesContext facesContext, final AbstractUISelectOneChoice select) {
-    return new CssItem[]{BootstrapClass.CUSTOM_SELECT};
+    return new CssItem[]{BootstrapClass.FORM_SELECT};
   }
 
   @Override
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java
index 9d34ae9..21b5ec2 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneRadioRenderer.java
@@ -85,12 +85,10 @@ public class SelectOneRadioRenderer extends SelectOneRendererBase {
         final String itemId = id + ComponentUtils.SUB_SEPARATOR + i;
         writer.startElement(HtmlElements.DIV);
         writer.writeClassAttribute(
-            BootstrapClass.CUSTOM_CONTROL,
-            BootstrapClass.CUSTOM_RADIO,
-            inline ? BootstrapClass.CUSTOM_CONTROL_INLINE : null);
-
+            BootstrapClass.FORM_CHECK,
+            inline ? BootstrapClass.FORM_CHECK_INLINE : null);
         writer.startElement(HtmlElements.INPUT);
-        writer.writeClassAttribute(BootstrapClass.CUSTOM_CONTROL_INPUT);
+        writer.writeClassAttribute(BootstrapClass.FORM_CHECK_INPUT);
         writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.RADIO);
         final String formattedValue = ComponentUtils.getFormattedValue(facesContext, select, item.getValue());
         final boolean checked;
@@ -115,7 +113,7 @@ public class SelectOneRadioRenderer extends SelectOneRendererBase {
 
         writer.startElement(HtmlElements.LABEL);
         writer.writeClassAttribute(
-            BootstrapClass.CUSTOM_CONTROL_LABEL,
+            BootstrapClass.FORM_CHECK_LABEL,
             getCssItems(facesContext, select));
         writer.writeAttribute(HtmlAttributes.FOR, itemId, false);
         if (item instanceof org.apache.myfaces.tobago.model.SelectItem) {
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TreeSelectRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TreeSelectRenderer.java
index 43dff32..32474f7 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TreeSelectRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TreeSelectRenderer.java
@@ -117,14 +117,15 @@ public class TreeSelectRenderer extends RendererBase {
     writer.writeClassAttribute(
         treeSelect.getCustomClass(),
         TobagoClass.TREE_SELECT.createMarkup(markup),
-        showCustomControl ? BootstrapClass.CUSTOM_CONTROL : null,
-        showCustomControl && selectable.isMulti() ? BootstrapClass.CUSTOM_CHECKBOX : null,
-        showCustomControl && selectable.isSingle() ? BootstrapClass.CUSTOM_RADIO : null);
+        // TODO: check rendered page for other selectables. Are them looking good?
+        showCustomControl ? BootstrapClass.FORM_CHECK_INLINE : null,
+        showCustomControl && selectable.isMulti() ? BootstrapClass.FORM_CHECK : null,
+        showCustomControl && selectable.isSingle() ? BootstrapClass.FORM_CHECK : null);
     HtmlRendererUtils.writeDataAttributes(facesContext, writer, treeSelect);
 
     if (showCustomControl) {
       writer.startElement(HtmlElements.INPUT);
-      writer.writeClassAttribute(BootstrapClass.CUSTOM_CONTROL_INPUT);
+      writer.writeClassAttribute(BootstrapClass.FORM_CHECK_INPUT);
       if (selectable.isSingle()) {
         writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.RADIO);
         writer.writeNameAttribute(getClientIdWithoutRowIndex(data, id));
@@ -143,7 +144,7 @@ public class TreeSelectRenderer extends RendererBase {
     final String label = treeSelect.getLabel();
     writer.startElement(HtmlElements.LABEL);
     writer.writeClassAttribute(TobagoClass.TREE_SELECT__LABEL,
-        showCustomControl ? BootstrapClass.CUSTOM_CONTROL_LABEL : null);
+        showCustomControl ? BootstrapClass.FORM_CHECK_LABEL : null);
     final String title = HtmlRendererUtils.getTitleFromTipAndMessages(facesContext, treeSelect);
     if (title != null) {
       writer.writeAttribute(HtmlAttributes.TITLE, title, true);
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/BootstrapClass.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/BootstrapClass.java
index 95b81ba..3657258 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/BootstrapClass.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/BootstrapClass.java
@@ -57,18 +57,65 @@ public enum BootstrapClass implements CssItem {
   ALIGN_ITEMS_END("align-items-end"),
   ALIGN_ITEMS_START("align-items-start"),
   ALIGN_ITEMS_STRETCH("align-items-stretch"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #POPOVER_ARROW} or {@link #TOOLTIP_ARROW}
+   */
+  @Deprecated
   ARROW("arrow"),
+  BG_DANGER("bg-danger"),
   BG_DARK("bg-dark"),
+  BG_INFO("bg-info"),
+  BG_LIGHT("bg-light"),
+  BG_PRIMARY("bg-primary"),
+  BG_SECONDARY("bg-secondary"),
+  BG_SUCCESS("bg-success"),
+  BG_WARNING("bg-warning"),
   BADGE("badge"),
-  BADGE_DANGER("badge-danger"),
-  BADGE_DARK("badge-dark"),
-  BADGE_INFO("badge-info"),
-  BADGE_LIGHT("badge-light"),
-  BADGE_PILL("badge-pill"),
-  BADGE_PRIMARY("badge-primary"),
-  BADGE_SECONDARY("badge-secondary"),
-  BADGE_SUCCESS("badge-success"),
-  BADGE_WARNING("badge-warning"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #BG_DANGER}
+   */
+  @Deprecated
+  BADGE_DANGER("bg-danger"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #BG_DARK}
+   */
+  @Deprecated
+  BADGE_DARK("bg-dark"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #BG_INFO}
+   */
+  @Deprecated
+  BADGE_INFO("bg-info"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #BG_LIGHT}
+   */
+  @Deprecated
+  BADGE_LIGHT("bg-light"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #ROUNDED_PILL}
+   */
+  @Deprecated
+  BADGE_PILL("rounded-pill"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #BG_PRIMARY}
+   */
+  @Deprecated
+  BADGE_PRIMARY("bg-primary"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #BG_SECONDARY}
+   */
+  @Deprecated
+  BADGE_SECONDARY("bg-secondary"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #BG_SUCCESS}
+   */
+  @Deprecated
+  BADGE_SUCCESS("bg-success"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #BG_WARNING}
+   */
+  @Deprecated
+  BADGE_WARNING("bg-warning"),
   BORDER_DANGER("border-danger"),
   BORDER_INFO("border-info"),
   BORDER_WARNING("border-warning"),
@@ -173,17 +220,61 @@ public enum BootstrapClass implements CssItem {
   COL_AUTO("col-auto"),
   CONTAINER("container"),
   CONTAINER_FLUID("container-fluid"),
-  CUSTOM_CHECKBOX("custom-checkbox"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #FORM_CHECK}
+   */
+  @Deprecated
+  CUSTOM_CHECKBOX("form-check"),
+  /**
+   * @deprecated since 5.0.0
+   */
+  @Deprecated
   CUSTOM_CONTROL("custom-control"),
-  CUSTOM_CONTROL_LABEL("custom-control-label"),
-  CUSTOM_CONTROL_INLINE("custom-control-inline"),
-  CUSTOM_CONTROL_INPUT("custom-control-input"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #FORM_CHECK_LABEL} or maybe any other?
+   */
+  @Deprecated
+  CUSTOM_CONTROL_LABEL("form-check-label"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #FORM_CHECK_INLINE} or maybe any other?
+   */
+  @Deprecated
+  CUSTOM_CONTROL_INLINE("form-check-inline"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #FORM_CHECK_INPUT} or maybe any other?
+   */
+  @Deprecated
+  CUSTOM_CONTROL_INPUT("form-check-input"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #FORM_FILE}
+   */
+  @Deprecated
   CUSTOM_FILE("custom-file"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #FORM_FILE_INPUT}
+   */
+  @Deprecated
   CUSTOM_FILE_INPUT("custom-file-input"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #FORM_FILE_LABEL}
+   */
+  @Deprecated
   CUSTOM_FILE_LABEL("custom-file-label"),
-  CUSTOM_RADIO("custom-radio"),
-  CUSTOM_SELECT("custom-select"),
-  CUSTOM_SWITCH("custom-switch"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #FORM_CHECK}
+   */
+  @Deprecated
+  CUSTOM_RADIO("form-check"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #FORM_SELECT}
+   */
+  @Deprecated
+  CUSTOM_SELECT("form-select"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #FORM_SWITCH}
+   */
+  @Deprecated
+  CUSTOM_SWITCH("form-switch"),
   D_FLEX("d-flex"),
   D_INLINE("d-inline"),
   D_NONE("d-none"),
@@ -218,8 +309,23 @@ public enum BootstrapClass implements CssItem {
   FORM_CHECK_LABEL("form-check-label"),
   FORM_CONTROL("form-control"),
   FORM_CONTROL_PLAINTEXT("form-control-plaintext"),
+  FORM_FILE("form-file"),
+  FORM_FILE_BUTTON("form-file-button"),
+  FORM_FILE_INPUT("form-file-input"),
+  FORM_FILE_LABEL("form-file-label"),
+  FORM_FILE_TEXT("form-file-text"),
+  /**
+   * @deprecated since 5.0.0, please use {@link #MB_3} or other
+   */
+  @Deprecated
   FORM_GROUP("form-group"),
+  /**
+   * @deprecated since 5.0.0
+   */
+  @Deprecated
   FORM_INLINE("form-inline"),
+  FORM_SELECT("form-select"),
+  FORM_SWITCH("form-switch"),
   INPUT_GROUP("input-group"),
   INPUT_GROUP_APPEND("input-group-append"),
   INPUT_GROUP_PREPEND("input-group-prepend"),
@@ -230,6 +336,19 @@ public enum BootstrapClass implements CssItem {
   JUSTIFY_CONTENT_CENTER("justify-content-center"),
   JUSTIFY_CONTENT_END("justify-content-end"),
   JUSTIFY_CONTENT_START("justify-content-start"),
+  MB_0("mb-0"),
+  MB_1("mb-1"),
+  MB_2("mb-2"),
+  MB_3("mb-3"),
+  MB_4("mb-4"),
+  MB_5("mb-5"),
+  MB_AUTO("mb-auto"),
+  ML_0("ml-0"),
+  ML_1("ml-1"),
+  ML_2("ml-2"),
+  ML_3("ml-3"),
+  ML_4("ml-4"),
+  ML_5("ml-5"),
   ML_AUTO("ml-auto"),
   ML_LG_AUTO("ml-lg-auto"),
   ML_MD_AUTO("ml-md-auto"),
@@ -240,11 +359,24 @@ public enum BootstrapClass implements CssItem {
   MODAL_DIALOG("modal-dialog"),
   MODAL_LG("modal-lg"),
   MODAL_SM("modal-sm"),
+  MR_0("mr-0"),
+  MR_1("mr-1"),
+  MR_2("mr-2"),
+  MR_3("mr-3"),
+  MR_4("mr-4"),
+  MR_5("mr-5"),
   MR_AUTO("mr-auto"),
   MR_LG_AUTO("mr-lg-auto"),
   MR_MD_AUTO("mr-md-auto"),
   MR_SM_AUTO("mr-sm-auto"),
   MR_XL_AUTO("mr-xl-auto"),
+  MT_0("mt-0"),
+  MT_1("mt-1"),
+  MT_2("mt-2"),
+  MT_3("mt-3"),
+  MT_4("mt-4"),
+  MT_5("mt-5"),
+  MT_AUTO("mt-auto"),
   MY_LG_0("my-lg-0"),
   MY_LG_1("my-lg-1"),
   MY_LG_2("my-lg-2"),
@@ -336,10 +468,12 @@ public enum BootstrapClass implements CssItem {
   PAGE_LINK("page-link"),
   PAGINATION("pagination"),
   POPOVER("popover"),
+  POPOVER_ARROW("popover-arrow"),
   POPOVER_BODY("popover-body"),
   POPOVER_HEADER("popover-header"),
   PROGRESS("progress"),
   PROGRESS_BAR("progress-bar"),
+  ROUNDED_PILL("rounded-pill"),
   ROW("row"),
   SHOW("show"),
   SR_ONLY("sr-only"),
@@ -353,7 +487,11 @@ public enum BootstrapClass implements CssItem {
   TEXT_SUCCESS("text-success"),
   TEXT_WARNING("text-warning"),
   TEXT_CENTER("text-center"),
-  TEXT_JUSTIFY("text-justify"),
+  /**
+   * @deprecated since 5.0.0, please use {@link org.apache.myfaces.tobago.renderkit.css.TobagoClass#TEXT__JUSTIFY}
+   */
+  @Deprecated
+  TEXT_JUSTIFY("tobago-text-justify"),
   TEXT_LEFT("text-left"),
   TEXT_RIGHT("text-right"),
   TAB_CONTENT("tab-content"),
@@ -364,7 +502,8 @@ public enum BootstrapClass implements CssItem {
   TABLE_HOVER("table-hover"),
   TABLE_INFO("table-info"),
   TABLE_SM("table-sm"),
-  TABLE_STRIPED("table-striped");
+  TABLE_STRIPED("table-striped"),
+  TOOLTIP_ARROW("tooltip-arrow");
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
@@ -457,7 +596,7 @@ public enum BootstrapClass implements CssItem {
       case right:
         return BootstrapClass.TEXT_RIGHT;
       case justify:
-        return BootstrapClass.TEXT_JUSTIFY;
+        return TobagoClass.TEXT__JUSTIFY;
       case center:
         return BootstrapClass.TEXT_CENTER;
       default:
@@ -639,9 +778,9 @@ public enum BootstrapClass implements CssItem {
 
     private void generateOffset(final List<BootstrapClass> result, final Object offset, final BootstrapClass[] values) {
       if (offset != null) {
-        int offsetIndex = Integer.valueOf((String) offset);
+        int offsetIndex = Integer.parseInt((String) offset);
         if (offsetIndex >= 0) {
-          offsetIndex = offsetIndex > 11 ? 11 : offsetIndex;
+          offsetIndex = Math.min(offsetIndex, 11);
           result.add(values[offsetIndex]);
         }
       }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/FontAwesomeIconEncoder.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/FontAwesomeIconEncoder.java
deleted file mode 100644
index 2b57a0a..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/FontAwesomeIconEncoder.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.myfaces.tobago.renderkit.css;
-
-import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
-import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.lang.invoke.MethodHandles;
-import java.util.EnumMap;
-import java.util.regex.Pattern;
-
-/**
- * @deprecated since 4.0.0. Please use {@link Icons} and render classic: "find usages Icons".
- */
-@Deprecated
-public class FontAwesomeIconEncoder implements IconEncoder {
-
-  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-  /**
-   * @deprecated 4.0.0. User {@link Icons#FA }
-   */
-  @Deprecated
-  public static final CssItem FA = Icons.FA;
-
-  private static final Pattern PATTERN = Pattern.compile("^(fa(-[a-z]+)+)$");
-
-
-  private static final EnumMap<Icons, CssItem> ICONS;
-
-  static {
-    ICONS = new EnumMap<>(Icons.class);
-    for (final Icons icon : Icons.values()) {
-      ICONS.put(icon, new FontAwesomeCssItem("fa-" + icon.name().toLowerCase().replaceAll("_", "-")));
-    }
-  }
-
-  @Override
-  public void encode(final TobagoResponseWriter writer, final Icons icon, final CssItem... cssItems)
-      throws IOException {
-    writer.startElement(HtmlElements.I);
-    writer.writeClassAttribute(Icons.FA, cssItems, icon);
-    writer.endElement(HtmlElements.I);
-  }
-
-  /**
-   * @deprecated 4.0.0. {@link Icons} implements {@link CssItem}, so this method is no longer needed.
-   */
-  @Deprecated
-  public static CssItem generateClass(final Icons icon) {
-    if (icon == null) {
-      return null;
-    }
-    final CssItem result = ICONS.get(icon);
-    if (result == null) {
-      LOG.warn("Missing icon: '" + icon + "'");
-    }
-    return result;
-  }
-
-  /**
-   * @deprecated 4.0.0. Use {@link Icons#custom }
-   */
-  @Deprecated
-  public static CssItem generateClass(final String name) {
-    return Icons.custom(name);
-  }
-
-  private static final class FontAwesomeCssItem implements CssItem {
-
-    private String name;
-
-    FontAwesomeCssItem(final String name) {
-      this.name = name;
-    }
-
-    @Override
-    public String getName() {
-      return name;
-    }
-  }
-}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/IconEncoder.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/IconEncoder.java
deleted file mode 100644
index a3fe972..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/IconEncoder.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.myfaces.tobago.renderkit.css;
-
-import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
-
-import java.io.IOException;
-
-/**
- * @deprecated since 4.0.0. May be subject of change in later versions!
- */
-@Deprecated
-public interface IconEncoder {
-
-  void encode(TobagoResponseWriter writer, Icons icon, final CssItem... cssItems) throws IOException;
-
-}
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 ce13a34..e488521 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
@@ -129,7 +129,6 @@ public enum TobagoClass implements CssItem {
   DROPDOWN__OPEN("tobago-dropdown-open"),
   DROPDOWN__SELECTED("tobago-dropdown-selected"),
   FILE("tobago-file"),
-  FILE__PLACEHOLDER("tobago-file-placeholder"),
   FLEX_LAYOUT("tobago-flexLayout"),
   FLOW_LAYOUT("tobago-flowLayout"),
   FIGURE("tobago-figure"),
@@ -226,6 +225,7 @@ public enum TobagoClass implements CssItem {
   TAB__CONTENT("tobago-tab-content"),
   TAB_GROUP("tobago-tabGroup"),
   TEXTAREA("tobago-textarea"),
+  TEXT__JUSTIFY("tobago-text-justify"),
   TREE("tobago-tree"),
   TREE__EXPANDED("tobago-tree-expanded"),
   TREE__SELECTED("tobago-tree-selected"),
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/CustomAttributes.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/CustomAttributes.java
index 1f1201c..b2a1fd7 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/CustomAttributes.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/CustomAttributes.java
@@ -49,6 +49,7 @@ public enum CustomAttributes implements MarkupLanguageAttributes {
   LOCAL_MENU("local-menu"),
   MAX_ITEMS("max-items"),
   MIN_CHARS("min-chars"),
+  MULTI_FORMAT("multi-format"),
   OMIT("omit"),
   ORIENTATION("orientation"),
   PARENT("parent"),
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/webapp/TobagoResponseWriter.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/webapp/TobagoResponseWriter.java
index 9e9bfe5..2d461af 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/webapp/TobagoResponseWriter.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/webapp/TobagoResponseWriter.java
@@ -21,9 +21,6 @@ package org.apache.myfaces.tobago.webapp;
 
 import org.apache.myfaces.tobago.internal.util.Deprecation;
 import org.apache.myfaces.tobago.renderkit.css.CssItem;
-import org.apache.myfaces.tobago.renderkit.css.FontAwesomeIconEncoder;
-import org.apache.myfaces.tobago.renderkit.css.IconEncoder;
-import org.apache.myfaces.tobago.renderkit.css.Icons;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
 import org.apache.myfaces.tobago.renderkit.html.HtmlTypes;
@@ -41,8 +38,6 @@ import java.nio.charset.StandardCharsets;
  */
 public abstract class TobagoResponseWriter extends ResponseWriter {
 
-  private IconEncoder iconEncoder = new FontAwesomeIconEncoder();
-
   // same as in ResponseWriter
 
   /**
@@ -230,16 +225,6 @@ public abstract class TobagoResponseWriter extends ResponseWriter {
   }
 
   /**
-   * Writes an supported icon.
-   *
-   * @deprecated 4.0.0. Use normal rendering methods.
-   */
-  @Deprecated
-  public void writeIcon(final Icons icon, final CssItem... cssItems) throws IOException {
-    iconEncoder.encode(this, icon, cssItems);
-  }
-
-  /**
    * Write text content. The text will be escaped.
    */
   public void writeText(final String text) throws IOException {
diff --git a/tobago-core/src/main/resources/scss/_tobago.scss b/tobago-core/src/main/resources/scss/_tobago.scss
index f8ecfb5..54a69ee 100644
--- a/tobago-core/src/main/resources/scss/_tobago.scss
+++ b/tobago-core/src/main/resources/scss/_tobago.scss
@@ -19,73 +19,7 @@
 XXX used variables: only for the IDE, will not really used by the build system, because this
 XXX code will be inserted after the _variables.scss
 */
-$alert-padding-x: 1.25rem !default;
-$border-radius: .25rem !default;
-$border-width: 1px !default;
-$font-size-base: 1rem !default;
-$line-height-base: 1.5 !default;
-$custom-control-gutter: .5rem !default;
-$custom-control-indicator-size: 1rem !default;
-$input-border-width: $input-btn-border-width !default;
-$input-btn-border-width: $border-width !default;
-$input-btn-padding-y: .375rem !default;
-$input-padding-y: $input-btn-padding-y !default;
-$zindex-dropdown: 1000 !default;
-$zindex-popover: 1060 !default;
-$spacer: 1rem !default;
-$spacer-x: $spacer !default;
-$spacer-y: $spacer !default;
-$card-spacer-y: .75rem !default;
-$form-group-margin-bottom: $spacer-y !default;
-$brand-primary: #0275d8 !default;
-$link-color: $brand-primary !default;
-$link-hover-color: darken($link-color, 15%) !default;
-$nav-link-padding: .5em 1em !default;
-$blue: #0275d8 !default;
-$white: #fff !default;
-$gray-100: #f8f9fa !default;
-$gray-200: #e9ecef !default;
-$gray-300: #dee2e6 !default;
-$gray-400: #ced4da !default;
-$gray-500: #adb5bd !default;
-$gray-600: #6c757d !default;
-$gray-700: #495057 !default;
-$gray-800: #343a40 !default;
-$gray-900: #212529 !default;
-$black: #000 !default;
-$body-bg: $white !default;
-$table-dark-color: $body-bg !default;
-$headings-font-weight: 500;
-$navbar-dark-active-color: rgba($white, 1) !default;
-$navbar-light-active-color: rgba($black, .9) !default;
-$border-width: 1px !default;
-$input-color: $gray-700 !default;
-$input-btn-border-width: $border-width !default; // For form controls and buttons
-$input-btn-padding-y: .5rem !default;
-$input-btn-padding-x: .75rem !default;
-$dropdown-item-padding-x: 1.5rem !default;
-$dropdown-item-padding-y: .25rem !default;
-$dropdown-link-color: colors("gray-dark") !default;
-$component-active-color: $white !default;
-$dropdown-link-active-color: $component-active-color !default;
-$dropdown-link-disabled-color: $gray-light !default;
-$dropdown-link-hover-bg: $gray-lightest !default;
-$nav-tabs-link-active-color: #495057 !default;
-$nav-link-disabled-color: #868e96 !default;
-$btn-primary-color: $white !default;
-$btn-secondary-color: colors("gray-dark") !default;
-$form-check-input-gutter: 1.25rem !default;
-$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;
-$input-btn-focus-width: .2rem !default;
-$input-btn-focus-color: rgba(theme-color("primary"), .25) !default;
-$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;
-$input-focus-box-shadow: $input-btn-focus-box-shadow !default;
-$form-check-inline-input-margin-x: 0.75rem;
-$input-placeholder-color: $gray-600 !default;
-$grid-gutter-width: 30px !default;
-$dropdown-link-hover-color: darken($gray-900, 5%) !default;
-
-$page-padding-top: 1rem;
+@import "variables";
 
 /* used icons ---------------------------------------------------- */
 
@@ -100,8 +34,12 @@ $fa-times-circle: "\f057";
 $fa-toggle-off: "\f204";
 $fa-toggle-on: "\f205";
 
-/* non-bootstrap variabled --------------------------------------- */
+/* non-bootstrap variables --------------------------------------- */
+
 $form-disabled-alpha: 0.5;
+$page-padding-top: 1rem;
+
+/* main ---------------------------------------------------------- */
 
 @mixin tobagoTreeNodeToggle() {
   .tobago-treeNode-toggle:not(.invisible) {
@@ -206,6 +144,7 @@ tobago-behavior {
 
 /* button -------------------------------------------------------------- */
 
+/* XXX for what is this needed?
 a.tobago-button {
   &.btn-primary:focus {
     color: $btn-primary-color;
@@ -214,6 +153,7 @@ a.tobago-button {
     color: $btn-secondary-color;
   }
 }
+*/
 
 button.tobago-button {
   &:disabled {
@@ -277,17 +217,6 @@ workaround for Bootstrap Modal (Popup) with vanillajs-datepicker
 .tobago-file {} //TODO remove
 tobago-file {
   display: block;
-
-  .custom-file-label {
-    &:after {
-      font-family: FontAwesome;
-      content: "\f07c";
-    }
-
-    &.tobago-file-placeholder {
-      color: $input-placeholder-color;
-    }
-  }
 }
 
 /* flexLayout -------------------------------------------------------------- */
@@ -359,8 +288,8 @@ tobago-footer {
   display: grid;
   border-spacing: 0;
   border-collapse: collapse;
-  grid-column-gap: $spacer-x; // old
-  column-gap: $spacer-x;
+  grid-column-gap: $spacer; // old
+  column-gap: $spacer;
 
   .tobago-label-container > {
     .tobago-textarea, .tobago-selectManyListbox, .tobago-selectManyShuttle {
@@ -517,9 +446,7 @@ button {
   }
 
   &.nav-link { /* bootstrap don't know button.nav-link*/
-    padding: $nav-link-padding;
-    padding-top: .55em;
-    padding-bottom: .45em;
+    padding: .55em $nav-link-padding-x .45em;
   }
 }
 
@@ -657,27 +584,28 @@ ul > tobago-dropdown {
 }
 
 .dropdown-menu {
-  .custom-control {
+  .form-check {
     padding-left: 0;
 
-    .custom-control-label.dropdown-item {
-      padding-left: ($custom-control-gutter + $custom-control-indicator-size) + $dropdown-item-padding-x;
+    .form-check-label.dropdown-item {
+      // todo check! this was BS4: padding-left: ($custom-control-gutter + $custom-control-indicator-size) + $dropdown-item-padding-x;
+      padding-left: ($spacer * 1.5 + $spacer) + $dropdown-item-padding-x;
 
       &:before {
-        top: (($font-size-base * $line-height-base - $custom-control-indicator-size) / 2) + $dropdown-item-padding-y;
+        top: (($font-size-base * $line-height-base - $spacer) / 2) + $dropdown-item-padding-y;
         left: $dropdown-item-padding-x;
       }
 
       &:after {
-        top: (($font-size-base * $line-height-base - $custom-control-indicator-size) / 2) + $dropdown-item-padding-y;
+        top: (($font-size-base * $line-height-base - $spacer) / 2) + $dropdown-item-padding-y;
         left: $dropdown-item-padding-x;
       }
     }
   }
 }
 
-
 /* dropdown-submenu ------------------------------------------------------- */
+
 .tobago-dropdown-submenu {
   cursor: pointer;
   position: relative;
@@ -770,7 +698,8 @@ span.tobago-out:empty:before {
 }
 
 .table-dark .form-control-plaintext {
-  color: $table-dark-color;
+  color: $white;
+// was in bs4: color: $table-dark-color;
 }
 
 /* page ----------------------------------------------------------- */
@@ -1016,7 +945,7 @@ h1, h2, h3, h4, h5, h6 {
 }
 
 @mixin adjustCustomControlLabel() {
-  .custom-control-label {
+  .form-check-label {
     &:after {
       content: "";
     }
@@ -1255,7 +1184,7 @@ th.tobago-sheet-headerCell {
   content: "\f0dc";
   font-family: FontAwesome;
   color: $gray-300;
-  margin-left: $spacer-x;
+  margin-left: $spacer;
 }
 
 .tobago-sheet-header-markup-ascending::after {
@@ -1273,8 +1202,8 @@ th.tobago-sheet-headerCell-markup-filler > .tobago-sheet-header {
 }
 
 .tobago-sheet-columnSelector {
-  margin-top: ($spacer-y * 0.75);
-  margin-bottom: ($spacer-y * 0.75);
+  margin-top: ($spacer * 0.75);
+  margin-bottom: ($spacer * 0.75);
 }
 
 tobago-sheet {
@@ -1592,7 +1521,7 @@ tobago-tab.tobago-tab-barFacet {
 }
 
 tobago-tab-group {
-  margin-bottom: $form-group-margin-bottom;
+  margin-bottom: $spacer;
 }
 
 /* tree ---------------------------------------------------------------------- */
@@ -1612,8 +1541,8 @@ tobago-tab-group {
 }
 
 .tobago-treeSelect .form-check-inline {
-  margin-left: $form-check-inline-input-margin-x / 2;
-  margin-right: $form-check-inline-input-margin-x / 2;
+  margin-left: $spacer * .75 / 2;
+  margin-right: $spacer * .75 / 2;
 }
 
 .tobago-treeCommand {
@@ -1633,7 +1562,7 @@ tobago-tree {
     tobago-tree-select {
       display: inline;
 
-      &.custom-control {
+      &.form-check {
         display: inline;
       }
     }
@@ -1677,17 +1606,17 @@ tobago-tree-listbox, .tobago-treeListbox {
 .tobago-textarea {
   &-markup-fatal, &-markup-error {
     &.border-danger:focus {
-      box-shadow: 0 0 0 .2rem rgba(theme-color("danger"), .25);
+      box-shadow: 0 0 0 .2rem rgba($danger, .25);
     }
   }
   &-markup-warn {
     &.border-warning:focus {
-      box-shadow: 0 0 0 .2rem rgba(theme-color("warning"), .25);
+      box-shadow: 0 0 0 .2rem rgba($warning, .25);
     }
   }
   &-markup-info {
     &.border-info:focus {
-      box-shadow: 0 0 0 .2rem rgba(theme-color("info"), .25);
+      box-shadow: 0 0 0 .2rem rgba($info, .25);
     }
   }
 }
@@ -1742,5 +1671,10 @@ fixme: there is a problem with the selectManyShuttle with this style.
 .tobago-required label:after,
 label.tobago-required:after {
   content: "*";
-  color: theme-color("danger");
+  color: $danger;
+}
+
+/* added here, because Bootstrap has removed .text-justify */
+.tobago-text-justify {
+  text-align: justify !important;
 }
diff --git a/tobago-core/src/main/resources/scss/_variables.scss b/tobago-core/src/main/resources/scss/_variables.scss
new file mode 100644
index 0000000..9d548cb
--- /dev/null
+++ b/tobago-core/src/main/resources/scss/_variables.scss
@@ -0,0 +1,894 @@
+/*
+ * 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.
+ */
+
+/*
+XXX used variables: only for the IDE, will not be used by the build system, because this
+XXX code will be inserted after bootstraps _variables.scss
+*/
+$white:    #fff !default;
+$gray-100: #f8f9fa !default;
+$gray-200: #e9ecef !default;
+$gray-300: #dee2e6 !default;
+$gray-400: #ced4da !default;
+$gray-500: #adb5bd !default;
+$gray-600: #6c757d !default;
+$gray-700: #495057 !default;
+$gray-800: #343a40 !default;
+$gray-900: #212529 !default;
+$black:    #000 !default;
+$grays: (
+        "100": $gray-100,
+        "200": $gray-200,
+        "300": $gray-300,
+        "400": $gray-400,
+        "500": $gray-500,
+        "600": $gray-600,
+        "700": $gray-700,
+        "800": $gray-800,
+        "900": $gray-900
+) !default;
+$blue:    #0d6efd !default;
+$indigo:  #6610f2 !default;
+$purple:  #6f42c1 !default;
+$pink:    #d63384 !default;
+$red:     #dc3545 !default;
+$orange:  #fd7e14 !default;
+$yellow:  #ffc107 !default;
+$green:   #28a745 !default;
+$teal:    #20c997 !default;
+$cyan:    #17a2b8 !default;
+$colors: (
+        "blue":       $blue,
+        "indigo":     $indigo,
+        "purple":     $purple,
+        "pink":       $pink,
+        "red":        $red,
+        "orange":     $orange,
+        "yellow":     $yellow,
+        "green":      $green,
+        "teal":       $teal,
+        "cyan":       $cyan,
+        "white":      $white,
+        "gray":       $gray-600,
+        "gray-dark":  $gray-800
+) !default;
+$primary:       $blue !default;
+$secondary:     $gray-600 !default;
+$success:       $green !default;
+$info:          $cyan !default;
+$warning:       $yellow !default;
+$danger:        $red !default;
+$light:         $gray-100 !default;
+$dark:          $gray-800 !default;
+$theme-colors: (
+        "primary":    $primary,
+        "secondary":  $secondary,
+        "success":    $success,
+        "info":       $info,
+        "warning":    $warning,
+        "danger":     $danger,
+        "light":      $light,
+        "dark":       $dark
+) !default;
+$theme-color-interval: 8% !default;
+$min-contrast-ratio:   3 !default;
+$color-contrast-dark:      $gray-900 !default;
+$color-contrast-light:     $white !default;
+$blue-100: tint-color($blue, 8) !default;
+$blue-200: tint-color($blue, 6) !default;
+$blue-300: tint-color($blue, 4) !default;
+$blue-400: tint-color($blue, 2) !default;
+$blue-500: $blue !default;
+$blue-600: shade-color($blue, 2) !default;
+$blue-700: shade-color($blue, 4) !default;
+$blue-800: shade-color($blue, 6) !default;
+$blue-900: shade-color($blue, 8) !default;
+$indigo-100: tint-color($indigo, 8) !default;
+$indigo-200: tint-color($indigo, 6) !default;
+$indigo-300: tint-color($indigo, 4) !default;
+$indigo-400: tint-color($indigo, 2) !default;
+$indigo-500: $indigo !default;
+$indigo-600: shade-color($indigo, 2) !default;
+$indigo-700: shade-color($indigo, 4) !default;
+$indigo-800: shade-color($indigo, 6) !default;
+$indigo-900: shade-color($indigo, 8) !default;
+$purple-100: tint-color($purple, 8) !default;
+$purple-200: tint-color($purple, 6) !default;
+$purple-300: tint-color($purple, 4) !default;
+$purple-400: tint-color($purple, 2) !default;
+$purple-500: $purple !default;
+$purple-600: shade-color($purple, 2) !default;
+$purple-700: shade-color($purple, 4) !default;
+$purple-800: shade-color($purple, 6) !default;
+$purple-900: shade-color($purple, 8) !default;
+$pink-100: tint-color($pink, 8) !default;
+$pink-200: tint-color($pink, 6) !default;
+$pink-300: tint-color($pink, 4) !default;
+$pink-400: tint-color($pink, 2) !default;
+$pink-500: $pink !default;
+$pink-600: shade-color($pink, 2) !default;
+$pink-700: shade-color($pink, 4) !default;
+$pink-800: shade-color($pink, 6) !default;
+$pink-900: shade-color($pink, 8) !default;
+$red-100: tint-color($red, 8) !default;
+$red-200: tint-color($red, 6) !default;
+$red-300: tint-color($red, 4) !default;
+$red-400: tint-color($red, 2) !default;
+$red-500: $red !default;
+$red-600: shade-color($red, 2) !default;
+$red-700: shade-color($red, 4) !default;
+$red-800: shade-color($red, 6) !default;
+$red-900: shade-color($red, 8) !default;
+$orange-100: tint-color($orange, 8) !default;
+$orange-200: tint-color($orange, 6) !default;
+$orange-300: tint-color($orange, 4) !default;
+$orange-400: tint-color($orange, 2) !default;
+$orange-500: $orange !default;
+$orange-600: shade-color($orange, 2) !default;
+$orange-700: shade-color($orange, 4) !default;
+$orange-800: shade-color($orange, 6) !default;
+$orange-900: shade-color($orange, 8) !default;
+$yellow-100: tint-color($yellow, 8) !default;
+$yellow-200: tint-color($yellow, 6) !default;
+$yellow-300: tint-color($yellow, 4) !default;
+$yellow-400: tint-color($yellow, 2) !default;
+$yellow-500: $yellow !default;
+$yellow-600: shade-color($yellow, 2) !default;
+$yellow-700: shade-color($yellow, 4) !default;
+$yellow-800: shade-color($yellow, 6) !default;
+$yellow-900: shade-color($yellow, 8) !default;
+$green-100: tint-color($green, 8) !default;
+$green-200: tint-color($green, 6) !default;
+$green-300: tint-color($green, 4) !default;
+$green-400: tint-color($green, 2) !default;
+$green-500: $green !default;
+$green-600: shade-color($green, 2) !default;
+$green-700: shade-color($green, 4) !default;
+$green-800: shade-color($green, 6) !default;
+$green-900: shade-color($green, 8) !default;
+$teal-100: tint-color($teal, 8) !default;
+$teal-200: tint-color($teal, 6) !default;
+$teal-300: tint-color($teal, 4) !default;
+$teal-400: tint-color($teal, 2) !default;
+$teal-500: $teal !default;
+$teal-600: shade-color($teal, 2) !default;
+$teal-700: shade-color($teal, 4) !default;
+$teal-800: shade-color($teal, 6) !default;
+$teal-900: shade-color($teal, 8) !default;
+$cyan-100: tint-color($cyan, 8) !default;
+$cyan-200: tint-color($cyan, 6) !default;
+$cyan-300: tint-color($cyan, 4) !default;
+$cyan-400: tint-color($cyan, 2) !default;
+$cyan-500: $cyan !default;
+$cyan-600: shade-color($cyan, 2) !default;
+$cyan-700: shade-color($cyan, 4) !default;
+$cyan-800: shade-color($cyan, 6) !default;
+$cyan-900: shade-color($cyan, 8) !default;
+$escaped-characters: (
+                ("<","%3c"),
+                (">","%3e"),
+                ("#","%23"),
+                ("(","%28"),
+                (")","%29"),
+) !default;
+$enable-caret:                true !default;
+$enable-rounded:              true !default;
+$enable-shadows:              false !default;
+$enable-gradients:            false !default;
+$enable-transitions:          true !default;
+$enable-reduced-motion:       true !default;
+$enable-grid-classes:         true !default;
+$enable-button-pointers:      true !default;
+$enable-rfs:                  true !default;
+$enable-validation-icons:     true !default;
+$enable-negative-margins:     false !default;
+$enable-deprecation-messages: true !default;
+$enable-important-utilities:  true !default;
+$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;
+$spacer: 1rem !default;
+$spacers: (
+        0: 0,
+        1: $spacer / 4,
+        2: $spacer / 2,
+        3: $spacer,
+        4: $spacer * 1.5,
+        5: $spacer * 3,
+) !default;
+$negative-spacers: if($enable-negative-margins, negativify-map($spacers), null) !default;
+$body-bg:                   $white !default;
+$body-color:                $gray-900 !default;
+$body-text-align:           null !default;
+$link-color:                              $primary !default;
+$link-decoration:                         underline !default;
+$link-hover-color:                        darken($link-color, 15%) !default;
+$link-hover-decoration:                   null !default;
+$emphasized-link-hover-darken-percentage: 15% !default;
+$stretched-link-pseudo-element:           after !default;
+$stretched-link-z-index:                  1 !default;
+$paragraph-margin-bottom:   1rem !default;
+$grid-breakpoints: (
+        xs: 0,
+        sm: 576px,
+        md: 768px,
+        lg: 992px,
+        xl: 1200px,
+        xxl: 1400px
+) !default;
+@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
+@include _assert-starts-at-zero($grid-breakpoints, "$grid-breakpoints");
+$container-max-widths: (
+        sm: 540px,
+        md: 720px,
+        lg: 960px,
+        xl: 1140px,
+        xxl: 1320px
+) !default;
+@include _assert-ascending($container-max-widths, "$container-max-widths");
+$grid-columns:                12 !default;
+$grid-gutter-width:           1.5rem !default;
+$grid-row-columns:            6 !default;
+$gutters: $spacers !default;
+$container-padding-x: 1rem !default;
+$border-width:                1px !default;
+$border-color:                $gray-300 !default;
+$border-radius:               .25rem !default;
+$border-radius-sm:            .2rem !default;
+$border-radius-lg:            .3rem !default;
+$rounded-pill:                50rem !default;
+$box-shadow:                  0 .5rem 1rem rgba($black, .15) !default;
+$box-shadow-sm:               0 .125rem .25rem rgba($black, .075) !default;
+$box-shadow-lg:               0 1rem 3rem rgba($black, .175) !default;
+$box-shadow-inset:            inset 0 1px 2px rgba($black, .075) !default;
+$component-active-color:      $white !default;
+$component-active-bg:         $primary !default;
+$caret-width:                 .3em !default;
+$caret-vertical-align:        $caret-width * .85 !default;
+$caret-spacing:               $caret-width * .85 !default;
+$transition-base:             all .2s ease-in-out !default;
+$transition-fade:             opacity .15s linear !default;
+$transition-collapse:         height .35s ease !default;
+$embed-responsive-aspect-ratios: (
+        "21by9": (
+                x: 21,
+                y: 9
+        ),
+        "16by9": (
+                x: 16,
+                y: 9
+        ),
+        "4by3": (
+                x: 4,
+                y: 3
+        ),
+        "1by1": (
+                x: 1,
+                y: 1
+        )
+) !default;
+$font-family-sans-serif:      system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
+$font-family-monospace:       SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
+$font-family-base:            var(--bs-font-sans-serif) !default;
+$font-family-code:            var(--bs-font-monospace) !default;
+$font-size-root:              null !default;
+$font-size-base:              1rem !default; // Assumes the browser default, typically `16px`
+$font-size-sm:                $font-size-base * .875 !default;
+$font-size-lg:                $font-size-base * 1.25 !default;
+$font-weight-lighter:         lighter !default;
+$font-weight-light:           300 !default;
+$font-weight-normal:          400 !default;
+$font-weight-bold:            700 !default;
+$font-weight-bolder:          bolder !default;
+$font-weight-base:            $font-weight-normal !default;
+$line-height-base:            1.5 !default;
+$line-height-sm:              1.25 !default;
+$line-height-lg:              2 !default;
+$h1-font-size:                $font-size-base * 2.5 !default;
+$h2-font-size:                $font-size-base * 2 !default;
+$h3-font-size:                $font-size-base * 1.75 !default;
+$h4-font-size:                $font-size-base * 1.5 !default;
+$h5-font-size:                $font-size-base * 1.25 !default;
+$h6-font-size:                $font-size-base !default;
+$headings-margin-bottom:      $spacer / 2 !default;
+$headings-font-family:        null !default;
+$headings-font-style:         null !default;
+$headings-font-weight:        500 !default;
+$headings-line-height:        1.2 !default;
+$headings-color:              null !default;
+$display-font-sizes: (
+        1: 5rem,
+        2: 4.5rem,
+        3: 4rem,
+        4: 3.5rem,
+        5: 3rem,
+        6: 2.5rem
+) !default;
+$display-font-weight: 300 !default;
+$display-line-height: $headings-line-height !default;
+$lead-font-size:              $font-size-base * 1.25 !default;
+$lead-font-weight:            300 !default;
+$small-font-size:             .875em !default;
+$sub-sup-font-size:           .75em !default;
+$text-muted:                  $gray-600 !default;
+$initialism-font-size:        $small-font-size !default;
+$blockquote-margin-y:         $spacer !default;
+$blockquote-font-size:        $font-size-base * 1.25 !default;
+$blockquote-footer-color:     $gray-600 !default;
+$blockquote-footer-font-size: $small-font-size !default;
+$hr-margin-y:                 $spacer !default;
+$hr-color:                    inherit !default;
+$hr-height:                   $border-width !default;
+$hr-opacity:                  .25 !default;
+$legend-margin-bottom:        .5rem !default;
+$legend-font-size:            1.5rem !default;
+$legend-font-weight:          null !default;
+$mark-padding:                .2em !default;
+$dt-font-weight:              $font-weight-bold !default;
+$nested-kbd-font-weight:      $font-weight-bold !default;
+$list-inline-padding:         .5rem !default;
+$mark-bg:                     #fcf8e3 !default;
+$table-cell-padding-y:        .5rem !default;
+$table-cell-padding-x:        .5rem !default;
+$table-cell-padding-y-sm:     .25rem !default;
+$table-cell-padding-x-sm:     .25rem !default;
+$table-cell-vertical-align:   top !default;
+$table-color:                 $body-color !default;
+$table-bg:                    transparent !default;
+$table-striped-color:         $table-color !default;
+$table-striped-bg-factor:     .05 !default;
+$table-striped-bg:            rgba($black, $table-striped-bg-factor) !default;
+$table-active-color:          $table-color !default;
+$table-active-bg-factor:      .1 !default;
+$table-active-bg:             rgba($black, $table-active-bg-factor) !default;
+$table-hover-color:           $table-color !default;
+$table-hover-bg-factor:       .075 !default;
+$table-hover-bg:              rgba($black, $table-hover-bg-factor) !default;
+$table-border-factor:         .1 !default;
+$table-border-width:          $border-width !default;
+$table-border-color:          $border-color !default;
+$table-striped-order:         odd !default;
+$table-group-seperator-color: currentColor !default;
+$table-caption-color:         $text-muted !default;
+$table-bg-level:              -9 !default;
+$table-variants: (
+        "primary":    color-level($primary, $table-bg-level),
+        "secondary":  color-level($secondary, $table-bg-level),
+        "success":    color-level($success, $table-bg-level),
+        "info":       color-level($info, $table-bg-level),
+        "warning":    color-level($warning, $table-bg-level),
+        "danger":     color-level($danger, $table-bg-level),
+        "light":      $light,
+        "dark":       $dark,
+) !default;
+$input-btn-padding-y:         .375rem !default;
+$input-btn-padding-x:         .75rem !default;
+$input-btn-font-family:       null !default;
+$input-btn-font-size:         $font-size-base !default;
+$input-btn-line-height:       $line-height-base !default;
+$input-btn-focus-width:         .2rem !default;
+$input-btn-focus-color-opacity: .25 !default;
+$input-btn-focus-color:         rgba($component-active-bg, $input-btn-focus-color-opacity) !default;
+$input-btn-focus-box-shadow:    0 0 0 $input-btn-focus-width $input-btn-focus-color !default;
+$input-btn-padding-y-sm:      .25rem !default;
+$input-btn-padding-x-sm:      .5rem !default;
+$input-btn-font-size-sm:      $font-size-sm !default;
+$input-btn-padding-y-lg:      .5rem !default;
+$input-btn-padding-x-lg:      1rem !default;
+$input-btn-font-size-lg:      $font-size-lg !default;
+$input-btn-border-width:      $border-width !default;
+$btn-padding-y:               $input-btn-padding-y !default;
+$btn-padding-x:               $input-btn-padding-x !default;
+$btn-font-family:             $input-btn-font-family !default;
+$btn-font-size:               $input-btn-font-size !default;
+$btn-line-height:             $input-btn-line-height !default;
+$btn-white-space:             null !default; // Set to `nowrap` to prevent text wrapping
+$btn-padding-y-sm:            $input-btn-padding-y-sm !default;
+$btn-padding-x-sm:            $input-btn-padding-x-sm !default;
+$btn-font-size-sm:            $input-btn-font-size-sm !default;
+$btn-padding-y-lg:            $input-btn-padding-y-lg !default;
+$btn-padding-x-lg:            $input-btn-padding-x-lg !default;
+$btn-font-size-lg:            $input-btn-font-size-lg !default;
+$btn-border-width:            $input-btn-border-width !default;
+$btn-font-weight:             $font-weight-normal !default;
+$btn-box-shadow:              inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;
+$btn-focus-width:             $input-btn-focus-width !default;
+$btn-focus-box-shadow:        $input-btn-focus-box-shadow !default;
+$btn-disabled-opacity:        .65 !default;
+$btn-active-box-shadow:       inset 0 3px 5px rgba($black, .125) !default;
+$btn-link-color:              $link-color !default;
+$btn-link-hover-color:        $link-hover-color !default;
+$btn-link-disabled-color:     $gray-600 !default;
+$btn-block-spacing-y:         .5rem !default;
+$btn-border-radius:           $border-radius !default;
+$btn-border-radius-sm:        $border-radius-sm !default;
+$btn-border-radius-lg:        $border-radius-lg !default;
+$btn-transition:              color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
+$form-text-margin-top:                  .25rem !default;
+$form-text-font-size:                   $small-font-size !default;
+$form-text-font-style:                  null !default;
+$form-text-font-weight:                 null !default;
+$form-text-color:                       $text-muted !default;
+$form-label-margin-bottom:              .5rem !default;
+$form-label-font-size:                  null !default;
+$form-label-font-style:                 null !default;
+$form-label-font-weight:                null !default;
+$form-label-color:                      null !default;
+$input-padding-y:                       $input-btn-padding-y !default;
+$input-padding-x:                       $input-btn-padding-x !default;
+$input-font-family:                     $input-btn-font-family !default;
+$input-font-size:                       $input-btn-font-size !default;
+$input-font-weight:                     $font-weight-base !default;
+$input-line-height:                     $input-btn-line-height !default;
+$input-padding-y-sm:                    $input-btn-padding-y-sm !default;
+$input-padding-x-sm:                    $input-btn-padding-x-sm !default;
+$input-font-size-sm:                    $input-btn-font-size-sm !default;
+$input-padding-y-lg:                    $input-btn-padding-y-lg !default;
+$input-padding-x-lg:                    $input-btn-padding-x-lg !default;
+$input-font-size-lg:                    $input-btn-font-size-lg !default;
+$input-bg:                              $white !default;
+$input-disabled-bg:                     $gray-200 !default;
+$input-disabled-border-color:           null !default;
+$input-color:                           $gray-700 !default;
+$input-border-color:                    $gray-400 !default;
+$input-border-width:                    $input-btn-border-width !default;
+$input-box-shadow:                      $box-shadow-inset !default;
+$input-border-radius:                   $border-radius !default;
+$input-border-radius-sm:                $border-radius-sm !default;
+$input-border-radius-lg:                $border-radius-lg !default;
+$input-focus-bg:                        $input-bg !default;
+$input-focus-border-color:              lighten($component-active-bg, 25%) !default;
+$input-focus-color:                     $input-color !default;
+$input-focus-width:                     $input-btn-focus-width !default;
+$input-focus-box-shadow:                $input-btn-focus-box-shadow !default;
+$input-placeholder-color:               $gray-600 !default;
+$input-plaintext-color:                 $body-color !default;
+$input-height-border:                   $input-border-width * 2 !default;
+$input-height-inner:                    add($input-line-height * 1em, $input-padding-y * 2) !default;
+$input-height-inner-half:               add($input-line-height * .5em, $input-padding-y) !default;
+$input-height-inner-quarter:            add($input-line-height * .25em, $input-padding-y / 2) !default;
+$input-height:                          add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;
+$input-height-sm:                       add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;
+$input-height-lg:                       add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;
+$input-transition:                      border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
+$form-check-input-width:                  1.25em !default;
+$form-check-min-height:                   $font-size-base * $line-height-base !default;
+$form-check-padding-left:                 $form-check-input-width + .5em !default;
+$form-check-margin-bottom:                .125rem !default;
+$form-check-label-color:                  null !default;
+$form-check-label-cursor:                 null !default;
+$form-check-transition:                   background-color .15s ease-in-out, background-position .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
+$form-check-input-active-filter:          brightness(90%) !default;
+$form-check-input-bg:                     $body-bg !default;
+$form-check-input-border:                 1px solid rgba(0, 0, 0, .25) !default;
+$form-check-input-border-radius:          .25em !default;
+$form-check-radio-border-radius:          50% !default;
+$form-check-input-focus-border:           $input-focus-border-color !default;
+$form-check-input-focus-box-shadow:       $input-btn-focus-box-shadow !default;
+$form-check-input-checked-color:          $component-active-color !default;
+$form-check-input-checked-bg-color:       $component-active-bg !default;
+$form-check-input-checked-border-color:   $form-check-input-checked-bg-color !default;
+$form-check-input-checked-bg-image:       url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-checked-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/></svg>") !default;
+$form-check-radio-checked-bg-image:       url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='2' fill='#{$form-check-input-checked-color}'/></svg>") !default;
+$form-check-input-indeterminate-color:          $component-active-color !default;
+$form-check-input-indeterminate-bg-color:       $component-active-bg !default;
+$form-check-input-indeterminate-border-color:   $form-check-input-indeterminate-bg-color !default;
+$form-check-input-indeterminate-bg-image:       url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-indeterminate-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/></svg>") !default;
+$form-switch-color:               rgba(0, 0, 0, .25) !default;
+$form-switch-width:               2em !default;
+$form-switch-padding-left:        $form-switch-width + .5em !default;
+$form-switch-bg-image:            url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-color}'/></svg>") !default;
+$form-switch-border-radius:       $form-switch-width !default;
+$form-switch-focus-color:         $input-focus-border-color !default;
+$form-switch-focus-bg-image:      url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-focus-color}'/></svg>") !default;
+$form-switch-checked-color:       $component-active-color !default;
+$form-switch-checked-bg-image:    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-checked-color}'/></svg>") !default;
+$form-switch-checked-bg-position: right center !default;
+$form-check-inline-margin-right:        1rem !default;
+$input-group-addon-color:               $input-color !default;
+$input-group-addon-bg:                  $gray-200 !default;
+$input-group-addon-border-color:        $input-border-color !default;
+$form-select-padding-y:             $input-padding-y !default;
+$form-select-padding-x:             $input-padding-x !default;
+$form-select-font-family:           $input-font-family !default;
+$form-select-font-size:             $input-font-size !default;
+$form-select-height:                $input-height !default;
+$form-select-indicator-padding:     1rem !default; // Extra padding to account for the presence of the background-image based indicator
+$form-select-font-weight:           $input-font-weight !default;
+$form-select-line-height:           $input-line-height !default;
+$form-select-color:                 $input-color !default;
+$form-select-disabled-color:        $gray-600 !default;
+$form-select-bg:                    $input-bg !default;
+$form-select-disabled-bg:           $gray-200 !default;
+$form-select-disabled-border-color: $input-disabled-border-color !default;
+$form-select-bg-position:           right $form-select-padding-x center !default;
+$form-select-bg-size:               16px 12px !default; // In pixels because image dimensions
+$form-select-indicator-color:       $gray-800 !default;
+$form-select-indicator:             url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/></svg>") !default;
+$form-select-feedback-icon-padding-right: add(1em * .75, (2 * $form-select-padding-y * .75) + $form-select-padding-x + $form-select-indicator-padding) !default;
+$form-select-feedback-icon-position:      center right ($form-select-padding-x + $form-select-indicator-padding) !default;
+$form-select-feedback-icon-size:          $input-height-inner-half $input-height-inner-half !default;
+$form-select-border-width:        $input-border-width !default;
+$form-select-border-color:        $input-border-color !default;
+$form-select-border-radius:       $border-radius !default;
+$form-select-box-shadow:          $box-shadow-inset !default;
+$form-select-focus-border-color:  $input-focus-border-color !default;
+$form-select-focus-width:         $input-focus-width !default;
+$form-select-focus-box-shadow:    0 0 0 $form-select-focus-width $input-btn-focus-color !default;
+$form-select-padding-y-sm:        $input-padding-y-sm !default;
+$form-select-padding-x-sm:        $input-padding-x-sm !default;
+$form-select-font-size-sm:        $input-font-size-sm !default;
+$form-select-height-sm:           $input-height-sm !default;
+$form-select-padding-y-lg:        $input-padding-y-lg !default;
+$form-select-padding-x-lg:        $input-padding-x-lg !default;
+$form-select-font-size-lg:        $input-font-size-lg !default;
+$form-select-height-lg:           $input-height-lg !default;
+$form-range-track-width:          100% !default;
+$form-range-track-height:         .5rem !default;
+$form-range-track-cursor:         pointer !default;
+$form-range-track-bg:             $gray-300 !default;
+$form-range-track-border-radius:  1rem !default;
+$form-range-track-box-shadow:     $box-shadow-inset !default;
+$form-range-thumb-width:                   1rem !default;
+$form-range-thumb-height:                  $form-range-thumb-width !default;
+$form-range-thumb-bg:                      $component-active-bg !default;
+$form-range-thumb-border:                  0 !default;
+$form-range-thumb-border-radius:           1rem !default;
+$form-range-thumb-box-shadow:              0 .1rem .25rem rgba($black, .1) !default;
+$form-range-thumb-focus-box-shadow:        0 0 0 1px $body-bg, $input-focus-box-shadow !default;
+$form-range-thumb-focus-box-shadow-width:  $input-focus-width !default; // For focus box shadow issue in Edge
+$form-range-thumb-active-bg:               lighten($component-active-bg, 35%) !default;
+$form-range-thumb-disabled-bg:             $gray-500 !default;
+$form-range-thumb-transition:              background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
+$form-file-height:                $input-height !default;
+$form-file-focus-border-color:    $input-focus-border-color !default;
+$form-file-focus-box-shadow:      $input-focus-box-shadow !default;
+$form-file-disabled-bg:           $input-disabled-bg !default;
+$form-file-disabled-border-color: $input-disabled-border-color !default;
+$form-file-padding-y:             $input-padding-y !default;
+$form-file-padding-x:             $input-padding-x !default;
+$form-file-line-height:           $input-line-height !default;
+$form-file-font-family:           $input-font-family !default;
+$form-file-font-weight:           $input-font-weight !default;
+$form-file-color:                 $input-color !default;
+$form-file-bg:                    $input-bg !default;
+$form-file-border-width:          $input-border-width !default;
+$form-file-border-color:          $input-border-color !default;
+$form-file-border-radius:         $input-border-radius !default;
+$form-file-box-shadow:            $input-box-shadow !default;
+$form-file-button-color:          $form-file-color !default;
+$form-file-button-bg:             $input-group-addon-bg !default;
+$form-file-padding-y-sm:          $input-padding-y-sm !default;
+$form-file-padding-x-sm:          $input-padding-x-sm !default;
+$form-file-font-size-sm:          $input-font-size-sm !default;
+$form-file-height-sm:             $input-height-sm !default;
+$form-file-padding-y-lg:          $input-padding-y-lg !default;
+$form-file-padding-x-lg:          $input-padding-x-lg !default;
+$form-file-font-size-lg:          $input-font-size-lg !default;
+$form-file-height-lg:             $input-height-lg !default;
+$form-feedback-margin-top:          $form-text-margin-top !default;
+$form-feedback-font-size:           $form-text-font-size !default;
+$form-feedback-font-style:          $form-text-font-style !default;
+$form-feedback-valid-color:         $success !default;
+$form-feedback-invalid-color:       $danger !default;
+$form-feedback-icon-valid-color:    $form-feedback-valid-color !default;
+$form-feedback-icon-valid:          url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>") !default;
+$form-feedback-icon-invalid-color:  $form-feedback-invalid-color !default;
+$form-feedback-icon-invalid:        url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}' viewBox='0 0 12 12'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>") !default;
+$form-validation-states: (
+        "valid": (
+                "color": $form-feedback-valid-color,
+                "icon": $form-feedback-icon-valid
+        ),
+        "invalid": (
+                "color": $form-feedback-invalid-color,
+                "icon": $form-feedback-icon-invalid
+        )
+) !default;
+$zindex-dropdown:                   1000 !default;
+$zindex-sticky:                     1020 !default;
+$zindex-fixed:                      1030 !default;
+$zindex-modal-backdrop:             1040 !default;
+$zindex-modal:                      1050 !default;
+$zindex-popover:                    1060 !default;
+$zindex-tooltip:                    1070 !default;
+$nav-link-padding-y:                .5rem !default;
+$nav-link-padding-x:                1rem !default;
+$nav-link-transition:               color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;
+$nav-link-disabled-color:           $gray-600 !default;
+$nav-tabs-border-color:             $gray-300 !default;
+$nav-tabs-border-width:             $border-width !default;
+$nav-tabs-border-radius:            $border-radius !default;
+$nav-tabs-link-hover-border-color:  $gray-200 $gray-200 $nav-tabs-border-color !default;
+$nav-tabs-link-active-color:        $gray-700 !default;
+$nav-tabs-link-active-bg:           $body-bg !default;
+$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;
+$nav-pills-border-radius:           $border-radius !default;
+$nav-pills-link-active-color:       $component-active-color !default;
+$nav-pills-link-active-bg:          $component-active-bg !default;
+$navbar-padding-y:                  $spacer / 2 !default;
+$navbar-padding-x:                  null !default;
+$navbar-nav-link-padding-x:         .5rem !default;
+$navbar-brand-font-size:            $font-size-lg !default;
+$nav-link-height:                   $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;
+$navbar-brand-height:               $navbar-brand-font-size * $line-height-base !default;
+$navbar-brand-padding-y:            ($nav-link-height - $navbar-brand-height) / 2 !default;
+$navbar-brand-margin-right:         1rem !default;
+$navbar-toggler-padding-y:          .25rem !default;
+$navbar-toggler-padding-x:          .75rem !default;
+$navbar-toggler-font-size:          $font-size-lg !default;
+$navbar-toggler-border-radius:      $btn-border-radius !default;
+$navbar-toggler-focus-width:        $btn-focus-width !default;
+$navbar-toggler-transition:         box-shadow .15s ease-in-out !default;
+$navbar-dark-color:                 rgba($white, .55) !default;
+$navbar-dark-hover-color:           rgba($white, .75) !default;
+$navbar-dark-active-color:          $white !default;
+$navbar-dark-disabled-color:        rgba($white, .25) !default;
+$navbar-dark-toggler-icon-bg:       url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>") !default;
+$navbar-dark-toggler-border-color:  rgba($white, .1) !default;
+$navbar-light-color:                rgba($black, .55) !default;
+$navbar-light-hover-color:          rgba($black, .7) !default;
+$navbar-light-active-color:         rgba($black, .9) !default;
+$navbar-light-disabled-color:       rgba($black, .3) !default;
+$navbar-light-toggler-icon-bg:      url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke='#{$navbar-light-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>") !default;
+$navbar-light-toggler-border-color: rgba($black, .1) !default;
+$navbar-light-brand-color:                $navbar-light-active-color !default;
+$navbar-light-brand-hover-color:          $navbar-light-active-color !default;
+$navbar-dark-brand-color:                 $navbar-dark-active-color !default;
+$navbar-dark-brand-hover-color:           $navbar-dark-active-color !default;
+$dropdown-min-width:                10rem !default;
+$dropdown-padding-y:                .5rem !default;
+$dropdown-spacer:                   .125rem !default;
+$dropdown-font-size:                $font-size-base !default;
+$dropdown-color:                    $body-color !default;
+$dropdown-bg:                       $white !default;
+$dropdown-border-color:             rgba($black, .15) !default;
+$dropdown-border-radius:            $border-radius !default;
+$dropdown-border-width:             $border-width !default;
+$dropdown-inner-border-radius:      subtract($dropdown-border-radius, $dropdown-border-width) !default;
+$dropdown-divider-bg:               $gray-200 !default;
+$dropdown-divider-margin-y:         $spacer / 2 !default;
+$dropdown-box-shadow:               $box-shadow !default;
+$dropdown-link-color:               $gray-900 !default;
+$dropdown-link-hover-color:         darken($gray-900, 5%) !default;
+$dropdown-link-hover-bg:            $gray-100 !default;
+$dropdown-link-active-color:        $component-active-color !default;
+$dropdown-link-active-bg:           $component-active-bg !default;
+$dropdown-link-disabled-color:      $gray-600 !default;
+$dropdown-item-padding-y:           $spacer / 4 !default;
+$dropdown-item-padding-x:           $spacer !default;
+$dropdown-header-color:             $gray-600 !default;
+$dropdown-header-padding:           $dropdown-padding-y $dropdown-item-padding-x !default;
+$pagination-padding-y:              .375rem !default;
+$pagination-padding-x:              .75rem !default;
+$pagination-padding-y-sm:           .25rem !default;
+$pagination-padding-x-sm:           .5rem !default;
+$pagination-padding-y-lg:           .75rem !default;
+$pagination-padding-x-lg:           1.5rem !default;
+$pagination-color:                  $link-color !default;
+$pagination-bg:                     $white !default;
+$pagination-border-width:           $border-width !default;
+$pagination-border-radius:          $border-radius !default;
+$pagination-margin-left:            -$pagination-border-width !default;
+$pagination-border-color:           $gray-300 !default;
+$pagination-focus-box-shadow:       $input-btn-focus-box-shadow !default;
+$pagination-focus-outline:          0 !default;
+$pagination-hover-color:            $link-hover-color !default;
+$pagination-hover-bg:               $gray-200 !default;
+$pagination-hover-border-color:     $gray-300 !default;
+$pagination-active-color:           $component-active-color !default;
+$pagination-active-bg:              $component-active-bg !default;
+$pagination-active-border-color:    $pagination-active-bg !default;
+$pagination-disabled-color:         $gray-600 !default;
+$pagination-disabled-bg:            $white !default;
+$pagination-disabled-border-color:  $gray-300 !default;
+$card-spacer-y:                     $spacer !default;
+$card-spacer-x:                     $spacer !default;
+$card-title-spacer-y:               $spacer / 2 !default;
+$card-border-width:                 $border-width !default;
+$card-border-radius:                $border-radius !default;
+$card-border-color:                 rgba($black, .125) !default;
+$card-inner-border-radius:          subtract($card-border-radius, $card-border-width) !default;
+$card-cap-padding-y:                $card-spacer-y / 2 !default;
+$card-cap-padding-x:                $card-spacer-x !default;
+$card-cap-bg:                       rgba($black, .03) !default;
+$card-cap-color:                    null !default;
+$card-height:                       null !default;
+$card-color:                        null !default;
+$card-bg:                           $white !default;
+$card-img-overlay-padding:          $spacer !default;
+$card-group-margin:                 $grid-gutter-width / 2 !default;
+$tooltip-font-size:                 $font-size-sm !default;
+$tooltip-max-width:                 200px !default;
+$tooltip-color:                     $white !default;
+$tooltip-bg:                        $black !default;
+$tooltip-border-radius:             $border-radius !default;
+$tooltip-opacity:                   .9 !default;
+$tooltip-padding-y:                 $spacer / 4 !default;
+$tooltip-padding-x:                 $spacer / 2 !default;
+$tooltip-margin:                    0 !default;
+$tooltip-arrow-width:               .8rem !default;
+$tooltip-arrow-height:              .4rem !default;
+$tooltip-arrow-color:               $tooltip-bg !default;
+$form-feedback-tooltip-padding-y:     $tooltip-padding-y !default;
+$form-feedback-tooltip-padding-x:     $tooltip-padding-x !default;
+$form-feedback-tooltip-font-size:     $tooltip-font-size !default;
+$form-feedback-tooltip-line-height:   null !default;
+$form-feedback-tooltip-opacity:       $tooltip-opacity !default;
+$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;
+$popover-font-size:                 $font-size-sm !default;
+$popover-bg:                        $white !default;
+$popover-max-width:                 276px !default;
+$popover-border-width:              $border-width !default;
+$popover-border-color:              rgba($black, .2) !default;
+$popover-border-radius:             $border-radius-lg !default;
+$popover-inner-border-radius:       subtract($popover-border-radius, $popover-border-width) !default;
+$popover-box-shadow:                $box-shadow !default;
+$popover-header-bg:                 darken($popover-bg, 3%) !default;
+$popover-header-color:              $headings-color !default;
+$popover-header-padding-y:          .5rem !default;
+$popover-header-padding-x:          $spacer !default;
+$popover-body-color:                $body-color !default;
+$popover-body-padding-y:            $spacer !default;
+$popover-body-padding-x:            $spacer !default;
+$popover-arrow-width:               1rem !default;
+$popover-arrow-height:              .5rem !default;
+$popover-arrow-color:               $popover-bg !default;
+$popover-arrow-outer-color:         fade-in($popover-border-color, .05) !default;
+$toast-max-width:                   350px !default;
+$toast-padding-x:                   .75rem !default;
+$toast-padding-y:                   .25rem !default;
+$toast-font-size:                   .875rem !default;
+$toast-color:                       null !default;
+$toast-background-color:            rgba($white, .85) !default;
+$toast-border-width:                1px !default;
+$toast-border-color:                rgba(0, 0, 0, .1) !default;
+$toast-border-radius:               $border-radius !default;
+$toast-box-shadow:                  $box-shadow !default;
+$toast-header-color:                $gray-600 !default;
+$toast-header-background-color:     rgba($white, .85) !default;
+$toast-header-border-color:         rgba(0, 0, 0, .05) !default;
+$badge-font-size:                   .75em !default;
+$badge-font-weight:                 $font-weight-bold !default;
+$badge-color:                       $white !default;
+$badge-padding-y:                   .25em !default;
+$badge-padding-x:                   .5em !default;
+$badge-border-radius:               $border-radius !default;
+$modal-inner-padding:               $spacer !default;
+$modal-footer-margin-between:       .5rem !default;
+$modal-dialog-margin:               .5rem !default;
+$modal-dialog-margin-y-sm-up:       1.75rem !default;
+$modal-title-line-height:           $line-height-base !default;
+$modal-content-color:               null !default;
+$modal-content-bg:                  $white !default;
+$modal-content-border-color:        rgba($black, .2) !default;
+$modal-content-border-width:        $border-width !default;
+$modal-content-border-radius:       $border-radius-lg !default;
+$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;
+$modal-content-box-shadow-xs:       $box-shadow-sm !default;
+$modal-content-box-shadow-sm-up:    $box-shadow !default;
+$modal-backdrop-bg:                 $black !default;
+$modal-backdrop-opacity:            .5 !default;
+$modal-header-border-color:         $border-color !default;
+$modal-footer-border-color:         $modal-header-border-color !default;
+$modal-header-border-width:         $modal-content-border-width !default;
+$modal-footer-border-width:         $modal-header-border-width !default;
+$modal-header-padding-y:            $modal-inner-padding !default;
+$modal-header-padding-x:            $modal-inner-padding !default;
+$modal-header-padding:              $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility
+$modal-sm:                          300px !default;
+$modal-md:                          500px !default;
+$modal-lg:                          800px !default;
+$modal-xl:                          1140px !default;
+$modal-fade-transform:              translate(0, -50px) !default;
+$modal-show-transform:              none !default;
+$modal-transition:                  transform .3s ease-out !default;
+$modal-scale-transform:             scale(1.02) !default;
+$alert-padding-y:                   $spacer !default;
+$alert-padding-x:                   $spacer !default;
+$alert-margin-bottom:               1rem !default;
+$alert-border-radius:               $border-radius !default;
+$alert-link-font-weight:            $font-weight-bold !default;
+$alert-border-width:                $border-width !default;
+$alert-bg-level:                    -10 !default;
+$alert-border-level:                -9 !default;
+$alert-color-level:                 6 !default;
+$progress-height:                   1rem !default;
+$progress-font-size:                $font-size-base * .75 !default;
+$progress-bg:                       $gray-200 !default;
+$progress-border-radius:            $border-radius !default;
+$progress-box-shadow:               $box-shadow-inset !default;
+$progress-bar-color:                $white !default;
+$progress-bar-bg:                   $primary !default;
+$progress-bar-animation-timing:     1s linear infinite !default;
+$progress-bar-transition:           width .6s ease !default;
+$list-group-color:                  null !default;
+$list-group-bg:                     $white !default;
+$list-group-border-color:           rgba($black, .125) !default;
+$list-group-border-width:           $border-width !default;
+$list-group-border-radius:          $border-radius !default;
+$list-group-item-padding-y:         $spacer / 2 !default;
+$list-group-item-padding-x:         $spacer !default;
+$list-group-item-bg-level:          -9 !default;
+$list-group-item-color-level:       6 !default;
+$list-group-hover-bg:               $gray-100 !default;
+$list-group-active-color:           $component-active-color !default;
+$list-group-active-bg:              $component-active-bg !default;
+$list-group-active-border-color:    $list-group-active-bg !default;
+$list-group-disabled-color:         $gray-600 !default;
+$list-group-disabled-bg:            $list-group-bg !default;
+$list-group-action-color:           $gray-700 !default;
+$list-group-action-hover-color:     $list-group-action-color !default;
+$list-group-action-active-color:    $body-color !default;
+$list-group-action-active-bg:       $gray-200 !default;
+$thumbnail-padding:                 .25rem !default;
+$thumbnail-bg:                      $body-bg !default;
+$thumbnail-border-width:            $border-width !default;
+$thumbnail-border-color:            $gray-300 !default;
+$thumbnail-border-radius:           $border-radius !default;
+$thumbnail-box-shadow:              $box-shadow-sm !default;
+$figure-caption-font-size:          $small-font-size !default;
+$figure-caption-color:              $gray-600 !default;
+$breadcrumb-font-size:              null !default;
+$breadcrumb-padding-y:              $spacer / 2 !default;
+$breadcrumb-padding-x:              $spacer !default;
+$breadcrumb-item-padding-x:         .5rem !default;
+$breadcrumb-margin-bottom:          1rem !default;
+$breadcrumb-bg:                     $gray-200 !default;
+$breadcrumb-divider-color:          $gray-600 !default;
+$breadcrumb-active-color:           $gray-600 !default;
+$breadcrumb-divider:                quote("/") !default;
+$breadcrumb-border-radius:          $border-radius !default;
+$carousel-control-color:             $white !default;
+$carousel-control-width:             15% !default;
+$carousel-control-opacity:           .5 !default;
+$carousel-control-hover-opacity:     .9 !default;
+$carousel-control-transition:        opacity .15s ease !default;
+$carousel-indicator-width:           30px !default;
+$carousel-indicator-height:          3px !default;
+$carousel-indicator-hit-area-height: 10px !default;
+$carousel-indicator-spacer:          3px !default;
+$carousel-indicator-opacity:         .5 !default;
+$carousel-indicator-active-bg:       $white !default;
+$carousel-indicator-active-opacity:  1 !default;
+$carousel-indicator-transition:      opacity .6s ease !default;
+$carousel-caption-width:             70% !default;
+$carousel-caption-color:             $white !default;
+$carousel-caption-padding-y:         1.25rem !default;
+$carousel-caption-spacer:            1.25rem !default;
+$carousel-control-icon-width:        20px !default;
+$carousel-control-prev-icon-bg:      url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'><path d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/></svg>") !default;
+$carousel-control-next-icon-bg:      url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'><path d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/></svg>") !default;
+$carousel-transition-duration:       .6s !default;
+$carousel-transition:                transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)
+$spinner-width:           2rem !default;
+$spinner-height:          $spinner-width !default;
+$spinner-border-width:    .25em !default;
+$spinner-animation-speed: .75s !default;
+$spinner-width-sm:        1rem !default;
+$spinner-height-sm:       $spinner-width-sm !default;
+$spinner-border-width-sm: .2em !default;
+$close-font-size:                   $font-size-base * 1.5 !default;
+$close-font-weight:                 $font-weight-bold !default;
+$close-color:                       $black !default;
+$close-text-shadow:                 0 1px 0 $white !default;
+$code-font-size:                    $small-font-size !default;
+$code-color:                        $pink !default;
+$kbd-padding-y:                     .2rem !default;
+$kbd-padding-x:                     .4rem !default;
+$kbd-font-size:                     $code-font-size !default;
+$kbd-color:                         $white !default;
+$kbd-bg:                            $gray-900 !default;
+$pre-color:                         null !default;
diff --git a/tobago-core/src/main/resources/scss/datepicker-bs5.scss b/tobago-core/src/main/resources/scss/datepicker-bs5.scss
new file mode 100644
index 0000000..10ba24a
--- /dev/null
+++ b/tobago-core/src/main/resources/scss/datepicker-bs5.scss
@@ -0,0 +1,97 @@
+$dp-background-color: $white !default;
+$dp-border-color: $border-color !default;
+$dp-border-radius: $border-radius !default;
+$dp-border-radius-small: $border-radius-sm !default;
+$dp-line-height-base: 1.5 !default;
+$dp-font-size-normal: $font-size-base !default;
+$dp-font-size-small: $font-size-sm !default;
+$dp-font-weight-semibold: 600 !default;
+$dp-font-weight-bold: $font-weight-bold !default;
+$dp-dropdown-offset: 4px !default;
+$dp-dropdown-shadow: $dropdown-box-shadow !default;
+$dp-dropdown-z: $zindex-dropdown !default;
+
+$dp-title-background-color: $light !default;
+
+$dp-cell-size-base: 2.25rem !default;
+$dp-cell-focus-background-color: darken($dropdown-link-hover-bg, 2.5) !default;
+$dp-cell-prevnext-color: color('gray') !default;
+$dp-cell-disabled-color: $dropdown-link-disabled-color !default;
+$dp-cell-selected-background-color: $dropdown-link-active-bg !default;
+$dp-cell-selected-color: $dropdown-link-active-color !default;
+$dp-cell-selected-font-weight: 600 !default;
+$dp-cell-today-background-color: $teal !default;
+$dp-cell-today-color: $white !default;
+$dp-cell-highlighted-background-color: $gray-100 !default;
+$dp-range-start-end-background-color: $secondary !default;
+$dp-range-start-end-color: $dp-cell-selected-color !default;
+$dp-range-background-color: $gray-200 !default;
+$dp-range-today-background-color: $dp-cell-today-background-color !default;
+$dp-week-color: $gray-300 !default;
+
+$dp-footer-background-color: $light !default;
+
+$dp-input-in-edit-border-color: darken($input-focus-border-color, 5%) !default;
+$dp-input-in-edit-focus-box-shadow-size: 0 0 0.25em 0.25em !default;
+
+// XXX patched because of bs5 begin
+//@import 'mixins';
+@import "node_modules/vanillajs-datepicker/sass/mixins";
+// XXX patched because of bs5 end
+
+@mixin dp-button {
+  .btn {
+    // use custom version of .btn-light
+    $background: $light;
+    $border: $light;
+    $hover-background: darken($background, 7.5%);
+    $hover-border: darken($border, 10%);
+    $active-background: darken($background, 10%);
+    $active-border: darken($border, 12.5%);
+
+    border-color: $border;
+    background-color: $dp-background-color;
+
+    &:hover {
+      border-color: $hover-border;
+      background-color: $hover-background;
+      color: color-contrast($hover-background);
+    }
+
+    &:focus {
+      border-color: $hover-border;
+      box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-contrast($background), $border, 15%), 0.5);
+      background-color: $hover-background;
+      color: color-contrast($hover-background);
+    }
+
+    &:disabled {
+      border-color: $border;
+      background-color: $background;
+      color: color-contrast($background);
+    }
+
+    &:not(:disabled):active {
+      border-color: $active-border;
+      background-color: $active-background;
+      color: color-contrast($active-background);
+
+      &:focus {
+        box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-contrast($background), $border, 15%), 0.5);
+      }
+    }
+
+    .datepicker-header & {
+      @include dp-header-button-common;
+    }
+
+    .datepicker-footer & {
+      @include dp-footer-button-common;
+    }
+  }
+}
+
+// XXX patched because of bs5 begin
+//@import 'datepicker';
+@import "node_modules/vanillajs-datepicker/sass/datepicker";
+// XXX patched because of bs5 end
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/100-upload/File_Upload.xhtml b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/100-upload/File_Upload.xhtml
index eabd29b..04c5e49 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/100-upload/File_Upload.xhtml
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/100-upload/File_Upload.xhtml
@@ -42,17 +42,24 @@
     <tc:file placeholder="select a file" label="Upload" value="#{uploadController.fileBasic}"/>
     <tc:file label="Read Only" readonly="true" value="#{uploadController.fileBasic}"/>
     <tc:file label="Disabled" disabled="true" value="#{uploadController.fileBasic}"/>
-    <tc:button label="Submit" action="#{uploadController.uploadBasic}"/>
+    <tc:button label="Upload" action="#{uploadController.uploadBasic}"/>
   </tc:section>
 
   <tc:section id="s2" label="Content type">
     <p>You can filter files using the <code class="language-markup">&lt;tc:validateFileItem/></code> tag within
       the <code class="language-markup">&lt;tc:file/></code>.
       In the following example only images and PDF files are excepted.</p>
-    <tc:file label="Upload image" value="#{uploadController.fileContentType}">
+    <tc:file label="Upload image/PDF" value="#{uploadController.fileContentType}">
       <tc:validateFileItem contentType="image/*,application/pdf"/>
     </tc:file>
-    <tc:button label="Submit" action="#{uploadController.uploadContentType}"/>
+    <tc:button label="Upload" action="#{uploadController.uploadContentType}"/>
+  </tc:section>
+
+  <tc:section id="placeholder" label="Placeholder">
+    <p>Define a text with <code class="language-markup">placeholder</code> attribute</p>
+    <tc:file label="Upload image" value="#{uploadController.fileContentType}"
+    placeholder="Here you can upload your favourite images from your holiday!"/>
+    <tc:button label="Upload" action="#{uploadController.uploadContentType}"/>
   </tc:section>
 
   <tc:section id="upload-multi" label="Multiple files">
@@ -61,7 +68,7 @@
       Use the <code class="language-markup">multiple="true"</code> attribute.
     </p>
     <tc:file label="Multiple" value="#{uploadController.fileMulti}" multiple="true"/>
-    <tc:button label="Submit" action="#{uploadController.uploadMulti}"/>
+    <tc:button label="Upload" action="#{uploadController.uploadMulti}"/>
   </tc:section>
 
   <tc:section id="s3" label="Ajax">
diff --git a/tobago-theme/tobago-theme-charlotteville/src/main/npm/package-lock.json b/tobago-theme/tobago-theme-charlotteville/src/main/npm/package-lock.json
index fc08db8..dd1550e 100644
--- a/tobago-theme/tobago-theme-charlotteville/src/main/npm/package-lock.json
+++ b/tobago-theme/tobago-theme-charlotteville/src/main/npm/package-lock.json
@@ -319,9 +319,9 @@
       }
     },
     "bootstrap": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz",
-      "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==",
+      "version": "5.0.0-alpha1",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0-alpha1.tgz",
+      "integrity": "sha512-iwKneP2pLXl8lN0YpnOuOARiNPTzmh/4cw+Un86u4OqrMLuQpyMC7nO07hvivvcg0B/ektJPjuPnS1s+YmRK9A==",
       "dev": true
     },
     "brace-expansion": {
diff --git a/tobago-theme/tobago-theme-charlotteville/src/main/npm/package.json b/tobago-theme/tobago-theme-charlotteville/src/main/npm/package.json
index aa97da3..7bc67f8 100644
--- a/tobago-theme/tobago-theme-charlotteville/src/main/npm/package.json
+++ b/tobago-theme/tobago-theme-charlotteville/src/main/npm/package.json
@@ -9,7 +9,20 @@
     "url": "git+https://github.com/apache/myfaces-tobago.git"
   },
   "keywords": [
-    "jsf"
+    "jsf",
+    "apache",
+    "java",
+    "myfaces",
+    "css",
+    "sass",
+    "typescript",
+    "responsive",
+    "front-end",
+    "framework",
+    "html",
+    "web",
+    "bootstrap",
+    "theme"
   ],
   "author": "The MyFaces Team",
   "license": "Apache-2.0",
@@ -40,7 +53,7 @@
     "ajv": "^6.12.4",
     "ajv-keywords": "^3.5.2",
     "autoprefixer": "^9.8.6",
-    "bootstrap": "4.5.2",
+    "bootstrap": "5.0.0-alpha1",
     "clean-css-cli": "^4.3.0",
     "eslint": "^7.8.1",
     "eslint-plugin-compat": "^3.8.0",
diff --git a/tobago-theme/tobago-theme-charlotteville/src/main/scss/tobago-theme.scss b/tobago-theme/tobago-theme-charlotteville/src/main/scss/tobago-theme.scss
index b4893bc..b55639e 100644
--- a/tobago-theme/tobago-theme-charlotteville/src/main/scss/tobago-theme.scss
+++ b/tobago-theme/tobago-theme-charlotteville/src/main/scss/tobago-theme.scss
@@ -20,6 +20,9 @@
 
 @import "node_modules/bootstrap/scss/bootstrap";
 
-@import "node_modules/vanillajs-datepicker/sass/datepicker-bs4";
+// XXX patched because of bs5 (begin)
+//@import "node_modules/vanillajs-datepicker/sass/datepicker-bs4";
+@import "scss/datepicker-bs5";
+// XXX patched because of bs5 (end)
 
 @import "scss/_tobago";
diff --git a/tobago-theme/tobago-theme-roxborough/src/main/npm/package-lock.json b/tobago-theme/tobago-theme-roxborough/src/main/npm/package-lock.json
index 7f36f42..d61383e 100644
--- a/tobago-theme/tobago-theme-roxborough/src/main/npm/package-lock.json
+++ b/tobago-theme/tobago-theme-roxborough/src/main/npm/package-lock.json
@@ -319,9 +319,9 @@
       }
     },
     "bootstrap": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz",
-      "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==",
+      "version": "5.0.0-alpha1",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0-alpha1.tgz",
+      "integrity": "sha512-iwKneP2pLXl8lN0YpnOuOARiNPTzmh/4cw+Un86u4OqrMLuQpyMC7nO07hvivvcg0B/ektJPjuPnS1s+YmRK9A==",
       "dev": true
     },
     "brace-expansion": {
diff --git a/tobago-theme/tobago-theme-roxborough/src/main/npm/package.json b/tobago-theme/tobago-theme-roxborough/src/main/npm/package.json
index 4f013d8..0f60e15 100644
--- a/tobago-theme/tobago-theme-roxborough/src/main/npm/package.json
+++ b/tobago-theme/tobago-theme-roxborough/src/main/npm/package.json
@@ -9,7 +9,20 @@
     "url": "git+https://github.com/apache/myfaces-tobago.git"
   },
   "keywords": [
-    "jsf"
+    "jsf",
+    "apache",
+    "java",
+    "myfaces",
+    "css",
+    "sass",
+    "typescript",
+    "responsive",
+    "front-end",
+    "framework",
+    "html",
+    "web",
+    "bootstrap",
+    "theme"
   ],
   "author": "The MyFaces Team",
   "license": "Apache-2.0",
@@ -40,7 +53,7 @@
     "ajv": "^6.12.4",
     "ajv-keywords": "^3.5.2",
     "autoprefixer": "^9.8.6",
-    "bootstrap": "4.5.2",
+    "bootstrap": "5.0.0-alpha1",
     "clean-css-cli": "^4.3.0",
     "eslint": "^7.8.1",
     "eslint-plugin-compat": "^3.8.0",
diff --git a/tobago-theme/tobago-theme-roxborough/src/main/scss/tobago-theme.scss b/tobago-theme/tobago-theme-roxborough/src/main/scss/tobago-theme.scss
index b4893bc..b55639e 100644
--- a/tobago-theme/tobago-theme-roxborough/src/main/scss/tobago-theme.scss
+++ b/tobago-theme/tobago-theme-roxborough/src/main/scss/tobago-theme.scss
@@ -20,6 +20,9 @@
 
 @import "node_modules/bootstrap/scss/bootstrap";
 
-@import "node_modules/vanillajs-datepicker/sass/datepicker-bs4";
+// XXX patched because of bs5 (begin)
+//@import "node_modules/vanillajs-datepicker/sass/datepicker-bs4";
+@import "scss/datepicker-bs5";
+// XXX patched because of bs5 (end)
 
 @import "scss/_tobago";
diff --git a/tobago-theme/tobago-theme-scarborough/src/main/npm/package-lock.json b/tobago-theme/tobago-theme-scarborough/src/main/npm/package-lock.json
index 29a7c9b..7c54313 100644
--- a/tobago-theme/tobago-theme-scarborough/src/main/npm/package-lock.json
+++ b/tobago-theme/tobago-theme-scarborough/src/main/npm/package-lock.json
@@ -319,9 +319,9 @@
       }
     },
     "bootstrap": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz",
-      "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==",
+      "version": "5.0.0-alpha1",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0-alpha1.tgz",
+      "integrity": "sha512-iwKneP2pLXl8lN0YpnOuOARiNPTzmh/4cw+Un86u4OqrMLuQpyMC7nO07hvivvcg0B/ektJPjuPnS1s+YmRK9A==",
       "dev": true
     },
     "brace-expansion": {
diff --git a/tobago-theme/tobago-theme-scarborough/src/main/npm/package.json b/tobago-theme/tobago-theme-scarborough/src/main/npm/package.json
index 7e6a961..f63d002 100644
--- a/tobago-theme/tobago-theme-scarborough/src/main/npm/package.json
+++ b/tobago-theme/tobago-theme-scarborough/src/main/npm/package.json
@@ -9,7 +9,20 @@
     "url": "git+https://github.com/apache/myfaces-tobago.git"
   },
   "keywords": [
-    "jsf"
+    "jsf",
+    "apache",
+    "java",
+    "myfaces",
+    "css",
+    "sass",
+    "typescript",
+    "responsive",
+    "front-end",
+    "framework",
+    "html",
+    "web",
+    "bootstrap",
+    "theme"
   ],
   "author": "The MyFaces Team",
   "license": "Apache-2.0",
@@ -40,7 +53,7 @@
     "ajv": "^6.12.4",
     "ajv-keywords": "^3.5.2",
     "autoprefixer": "^9.8.6",
-    "bootstrap": "4.5.2",
+    "bootstrap": "5.0.0-alpha1",
     "clean-css-cli": "^4.3.0",
     "eslint": "^7.8.1",
     "eslint-plugin-compat": "^3.8.0",
diff --git a/tobago-theme/tobago-theme-scarborough/src/main/scss/tobago-theme.scss b/tobago-theme/tobago-theme-scarborough/src/main/scss/tobago-theme.scss
index e39db9b..b1a75ef 100644
--- a/tobago-theme/tobago-theme-scarborough/src/main/scss/tobago-theme.scss
+++ b/tobago-theme/tobago-theme-scarborough/src/main/scss/tobago-theme.scss
@@ -17,7 +17,10 @@
 
 @import "node_modules/bootstrap/scss/bootstrap";
 
-@import "node_modules/vanillajs-datepicker/sass/datepicker-bs4";
+// XXX patched because of bs5 (begin)
+//@import "node_modules/vanillajs-datepicker/sass/datepicker-bs4";
+@import "scss/datepicker-bs5";
+// XXX patched because of bs5 (end)
 
 .btn-secondary {
   @include button-variant($white, $gray-400);
diff --git a/tobago-theme/tobago-theme-speyside/src/main/npm/package-lock.json b/tobago-theme/tobago-theme-speyside/src/main/npm/package-lock.json
index e786afd..801b5e8 100644
--- a/tobago-theme/tobago-theme-speyside/src/main/npm/package-lock.json
+++ b/tobago-theme/tobago-theme-speyside/src/main/npm/package-lock.json
@@ -319,9 +319,9 @@
       }
     },
     "bootstrap": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz",
-      "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==",
+      "version": "5.0.0-alpha1",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0-alpha1.tgz",
+      "integrity": "sha512-iwKneP2pLXl8lN0YpnOuOARiNPTzmh/4cw+Un86u4OqrMLuQpyMC7nO07hvivvcg0B/ektJPjuPnS1s+YmRK9A==",
       "dev": true
     },
     "brace-expansion": {
diff --git a/tobago-theme/tobago-theme-speyside/src/main/npm/package.json b/tobago-theme/tobago-theme-speyside/src/main/npm/package.json
index 661b2d5..1b391c0 100644
--- a/tobago-theme/tobago-theme-speyside/src/main/npm/package.json
+++ b/tobago-theme/tobago-theme-speyside/src/main/npm/package.json
@@ -9,7 +9,20 @@
     "url": "git+https://github.com/apache/myfaces-tobago.git"
   },
   "keywords": [
-    "jsf"
+    "jsf",
+    "apache",
+    "java",
+    "myfaces",
+    "css",
+    "sass",
+    "typescript",
+    "responsive",
+    "front-end",
+    "framework",
+    "html",
+    "web",
+    "bootstrap",
+    "theme"
   ],
   "author": "The MyFaces Team",
   "license": "Apache-2.0",
@@ -40,7 +53,7 @@
     "ajv": "^6.12.4",
     "ajv-keywords": "^3.5.2",
     "autoprefixer": "^9.8.6",
-    "bootstrap": "4.5.2",
+    "bootstrap": "5.0.0-alpha1",
     "clean-css-cli": "^4.3.0",
     "eslint": "^7.8.1",
     "eslint-plugin-compat": "^3.8.0",
diff --git a/tobago-theme/tobago-theme-speyside/src/main/scss/tobago-theme.scss b/tobago-theme/tobago-theme-speyside/src/main/scss/tobago-theme.scss
index 2ab0339..0e05f6a 100644
--- a/tobago-theme/tobago-theme-speyside/src/main/scss/tobago-theme.scss
+++ b/tobago-theme/tobago-theme-speyside/src/main/scss/tobago-theme.scss
@@ -20,7 +20,10 @@
 
 @import "node_modules/bootstrap/scss/bootstrap";
 
-@import "node_modules/vanillajs-datepicker/sass/datepicker-bs4";
+// XXX patched because of bs5 (begin)
+//@import "node_modules/vanillajs-datepicker/sass/datepicker-bs4";
+@import "scss/datepicker-bs5";
+// XXX patched because of bs5 (end)
 
 @import "scss/_tobago";
 
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/package-lock.json b/tobago-theme/tobago-theme-standard/src/main/npm/package-lock.json
index b94d772..a6347e1 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/package-lock.json
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/package-lock.json
@@ -1578,9 +1578,9 @@
       }
     },
     "bootstrap": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz",
-      "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==",
+      "version": "5.0.0-alpha1",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0-alpha1.tgz",
+      "integrity": "sha512-iwKneP2pLXl8lN0YpnOuOARiNPTzmh/4cw+Un86u4OqrMLuQpyMC7nO07hvivvcg0B/ektJPjuPnS1s+YmRK9A==",
       "dev": true
     },
     "brace-expansion": {
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/package.json b/tobago-theme/tobago-theme-standard/src/main/npm/package.json
index 2a7b746..1e21323 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/package.json
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/package.json
@@ -9,7 +9,20 @@
     "url": "git+https://github.com/apache/myfaces-tobago.git"
   },
   "keywords": [
-    "jsf"
+    "jsf",
+    "apache",
+    "java",
+    "myfaces",
+    "css",
+    "sass",
+    "typescript",
+    "responsive",
+    "front-end",
+    "framework",
+    "html",
+    "web",
+    "bootstrap",
+    "theme"
   ],
   "author": "The MyFaces Team",
   "license": "Apache-2.0",
@@ -48,7 +61,7 @@
     "ajv": "^6.12.4",
     "ajv-keywords": "^3.5.2",
     "autoprefixer": "^9.8.6",
-    "bootstrap": "4.5.2",
+    "bootstrap": "5.0.0-alpha1",
     "clean-css-cli": "^4.3.0",
     "eslint": "^7.8.1",
     "eslint-plugin-compat": "^3.8.0",
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-file.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-file.ts
index a890973..25dbc79 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-file.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-file.ts
@@ -23,29 +23,31 @@ export class File extends HTMLElement {
 
   connectedCallback(): void {
     this.input.form.enctype = "multipart/form-data";
-
     this.input.addEventListener("change", this.select.bind(this));
+    this.text.textContent = this.placeholder;
+  }
+
+  get placeholder(): string {
+    return this.getAttribute("placeholder");
+  }
+
+  get multiFormat(): string {
+    return this.getAttribute("multi-format");
   }
 
   get input(): HTMLInputElement {
-    return this.querySelector(".custom-file-input");
+    return this.querySelector(".form-file-input");
   }
 
-  get label(): HTMLInputElement {
-    return this.querySelector(".custom-file-label");
+  get text(): HTMLInputElement {
+    return this.querySelector(".form-file-text");
   }
 
   select(event: MouseEvent): void {
-    if (this.input.value === "") {
-      this.label.classList.add("tobago-file-placeholder");
-      this.label.textContent = this.input.placeholder;
-    } else {
-      this.label.classList.remove("tobago-file-placeholder");
-
+    if (this.input.value) {
       let text: string;
       if (this.input.multiple) {
-        const format: string = this.input.dataset.tobagoFileMultiFormat;
-        text = format.replace("{}", String(this.input.files.length));
+        text = this.multiFormat.replace("{}", String(this.input.files.length));
       } else {
         text = this.input.value;
         // remove path, if any. Some old browsers set the path, others like webkit uses the prefix "C:\path\".
@@ -54,7 +56,9 @@ export class File extends HTMLElement {
           text = text.substr(pos + 1);
         }
       }
-      this.label.textContent = text;
+      this.text.textContent = text;
+    } else {
+      this.text.textContent = this.placeholder;
     }
   }
 }
diff --git a/tobago-theme/tobago-theme-standard/src/main/scss/tobago-theme.scss b/tobago-theme/tobago-theme-standard/src/main/scss/tobago-theme.scss
index 3c35e83..da83d92 100644
--- a/tobago-theme/tobago-theme-standard/src/main/scss/tobago-theme.scss
+++ b/tobago-theme/tobago-theme-standard/src/main/scss/tobago-theme.scss
@@ -17,6 +17,9 @@
 
 @import "node_modules/bootstrap/scss/bootstrap";
 
-@import "node_modules/vanillajs-datepicker/sass/datepicker-bs4";
+// XXX patched because of bs5 (begin)
+//@import "node_modules/vanillajs-datepicker/sass/datepicker-bs4";
+@import "scss/datepicker-bs5";
+// XXX patched because of bs5 (end)
 
 @import "scss/_tobago";


Mime
View raw message