fix theme: link
* add .btn class and .btn-link class to button.tobago-link HTML component
* fix cursor 'not-allowed' for disabled links (and buttons)
* refactor tobago-dropdown-submenu
* fix button.tobago-link inside titles (like h1, h2, ...)
* cleanup
* adjust tests
diff --git a/tobago-core/npm/scss/_tobago.scss b/tobago-core/npm/scss/_tobago.scss
index 09b9e50..b5a9a6a 100644
--- a/tobago-core/npm/scss/_tobago.scss
+++ b/tobago-core/npm/scss/_tobago.scss
@@ -40,6 +40,23 @@
$page-padding-top: 1rem;
/* main ---------------------------------------------------------- */
+@mixin buttonLinkDisabledCursor() {
+ &:disabled {
+ pointer-events: auto;
+
+ &:hover {
+ cursor: not-allowed;
+ }
+ }
+}
+
+@mixin dropdownMenuFormCheckComponents() {
+ .dropdown-menu .form-check {
+ /* move form-check components to the right, so checkbox/radio buttons are inside dropdown-menu */
+ padding-left: (($dropdown-item-padding-x ) + ($form-check-padding-left / 1em))
+ }
+}
+
@mixin linkWithoutUnderline() {
> .tobago-link {
text-decoration: none;
@@ -143,10 +160,11 @@
}
}
-tobago-links {
+/* button, link ------------------------------------------------------- */
+.tobago-button {
+ @include buttonLinkDisabledCursor();
}
-/* button, link ------------------------------------------------------- */
.tobago-button, .tobago-link {
> img + span {
margin-left: .4em;
@@ -401,63 +419,25 @@
h1, h2, h3, h4, h5, h6 {
button.tobago-link {
+ font-size: inherit;
font-weight: inherit;
}
}
button {
- &.tobago-link {
- color: $blue;
- border-width: 0;
+ &.tobago-link.btn {
+ @include buttonLinkDisabledCursor();
+
padding: 0;
- background-color: transparent;
- text-align: left;
+ vertical-align: baseline;
- &:focus, &:hover {
- color: $link-hover-color;
- cursor: pointer;
- outline: none;
- text-decoration: underline;
- }
-
- &:disabled {
- color: $nav-link-disabled-color;
-
- &:hover {
- cursor: not-allowed;
- text-decoration: none;
- }
-
- > img {
- opacity: .65;
- }
+ &:focus {
+ box-shadow: none;
}
}
&.tobago-link.dropdown-item {
- padding: $dropdown-item-padding-y $dropdown-item-padding-x;
- color: $dropdown-link-color;
- text-align: inherit;
- white-space: nowrap;
-
- &:active {
- color: $dropdown-link-active-color;
- }
-
- &:focus, &:hover {
- cursor: pointer;
- text-decoration: none;
- }
-
- &:disabled {
- color: $dropdown-link-disabled-color;
- }
- }
-
- &.tobago-link.dropdown-toggle {
- &:focus, &:hover {
- text-decoration: none;
- }
+ @include buttonLinkDisabledCursor();
}
&.nav-link { /* bootstrap don't know button.nav-link*/
@@ -470,12 +450,7 @@
padding-right: 0;
}
-span.dropdown {
- display: inline-block;
-}
-
-.dropdown > .btn.dropdown-toggle {
- width: 100%;
+tobago-links {
}
/* messages / help text ----------------------------------------------- */
@@ -553,13 +528,6 @@
/* nav ----------------------------------------------------------- */
-/* styles for drop down menu first level */
-.dropdown-toggle {
- &:focus, &:hover {
- text-decoration: none;
- }
-}
-
/* no bottom border in navtabs, if panel-body under it */
.nav-tabs {
border-bottom-width: 0;
@@ -581,103 +549,35 @@
/* dropdown ------------------------------------------------------- */
tobago-dropdown {
- display: inline-block;
-}
+ @include dropdownMenuFormCheckComponents();
-tobago-dropdown, .tobago-page-menuStore {
- .tobago-dropdown-selected {
- color: $dropdown-link-hover-color;
- text-decoration: none;
- @include gradient-bg($dropdown-link-hover-bg);
- }
-}
-
-ul > tobago-dropdown {
- display: list-item;
-}
-
-.dropdown-menu {
- .form-check {
- padding-left: 0;
-
- .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 - $spacer) / 2) + $dropdown-item-padding-y;
- left: $dropdown-item-padding-x;
- }
-
- &:after {
- 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;
- width: 100%;
-
- &:active {
- > button.tobago-link {
- color: $dropdown-link-active-color;
- }
- }
-
- > .dropdown-menu {
- top: 0;
- left: 100%;
- margin-top: -6px;
- margin-left: -1px;
- border-radius: 6px 6px 6px 6px;
- }
-
- > button:after {
- display: none;
- }
-
- > button.tobago-link {
- color: $dropdown-link-color;
-
- &:focus, &:hover {
- text-decoration: none;
- }
- }
-
- &:after {
- content: " ";
+ &.tobago-dropdown-submenu {
+ cursor: pointer;
+ position: relative;
+ width: 100%;
float: right;
- border-color: transparent;
- border-style: solid;
- border-width: 5px 0 5px 5px;
- border-left-color: #cccccc;
- margin-top: 7px;
- margin-right: -10px;
- }
- &:hover, &.tobago-dropdown-open {
- > .dropdown-menu {
- display: block;
+ &:hover {
+ background-color: $dropdown-link-hover-bg;
- > a:after {
- border-left-color: $dropdown-bg;
+ > .dropdown-menu {
+ display: block;
+ top: 0;
+ left: 100%;
+ margin-top: -0.5rem;
+ margin-left: -1px;
}
}
- }
- &.pull-left {
- float: none;
-
- > .dropdown-menu {
- left: -100%;
- margin-left: 10px;
- border-radius: 6px 0 6px 6px;
+ > .dropdown-item::after {
+ content: " ";
+ float: right;
+ border-color: transparent;
+ border-style: solid;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #cccccc;
+ margin-top: 7px;
+ margin-right: -10px;
}
}
}
@@ -1621,6 +1521,8 @@
/* menuStore -------------------------------------------------------- */
.tobago-page-menuStore {
+ @include dropdownMenuFormCheckComponents();
+
position: absolute;
top: 0;
left: 0;
@@ -1682,3 +1584,7 @@
custom styling is much more complicated. */
margin-bottom: 1rem;
}
+
+.tobago-dropdown-open, .tobago-dropdown-select {
+ // deprecated; must be added for test
+}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java
index 504ef87..5dd94b6 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/CommandRendererBase.java
@@ -115,7 +115,7 @@
getRendererCssClass(),
getRendererCssClass().createMarkup(component.getMarkup()),
getCssItems(facesContext, component),
- !parentOfCommands && dropdownSubmenu ? BootstrapClass.DROPDOWN_ITEM : null,
+ dropdownSubmenu ? BootstrapClass.DROPDOWN_ITEM : null,
parentOfCommands && !dropdownSubmenu ? BootstrapClass.DROPDOWN_TOGGLE : null,
component.getCustomClass(),
isInside(facesContext, HtmlElements.TOBAGO_LINKS) ? BootstrapClass.NAV_LINK : null);
@@ -228,9 +228,7 @@
writer.startElement(HtmlElements.TOBAGO_DROPDOWN);
writer.writeIdAttribute(clientId);
- writer.writeClassAttribute(
- dropdownSubmenu ? TobagoClass.DROPDOWN__SUBMENU : BootstrapClass.DROPDOWN,
- dropdownSubmenu ? BootstrapClass.DROPDOWN_ITEM : null);
+ writer.writeClassAttribute(dropdownSubmenu ? TobagoClass.DROPDOWN__SUBMENU : BootstrapClass.DROPDOWN);
}
}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkRenderer.java
index bc6a83d..3bc9903 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/LinkRenderer.java
@@ -24,6 +24,7 @@
import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
import org.apache.myfaces.tobago.renderkit.css.CssItem;
import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
+import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
import javax.faces.context.FacesContext;
@@ -36,9 +37,14 @@
@Override
protected CssItem[] getCssItems(final FacesContext facesContext, final T command) {
+ final boolean disabled = command.isDisabled();
+ final boolean anchor = (command.getLink() != null || command.getOutcome() != null) && !disabled;
+ final boolean dropdownSubmenu = isInside(facesContext, HtmlElements.COMMAND);
final Markup markup = command.getMarkup() != null ? command.getMarkup() : Markup.NULL;
return new CssItem[]{
+ !anchor && !dropdownSubmenu ? BootstrapClass.BTN : null,
+ !anchor && !dropdownSubmenu ? BootstrapClass.BTN_LINK : null,
BootstrapClass.textColor(markup),
BootstrapClass.fontStyle(markup)
};
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 42403f3..6921a94 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
@@ -125,7 +125,15 @@
COLLAPSED("tobago-collapsed"),
DATE("tobago-date"),
DATE__PICKER("tobago-date-picker"),
+ /**
+ * @deprecated since 5.0.0
+ */
+ @Deprecated
DROPDOWN__OPEN("tobago-dropdown-open"),
+ /**
+ * @deprecated since 5.0.0
+ */
+ @Deprecated
DROPDOWN__SELECTED("tobago-dropdown-selected"),
FILE("tobago-file"),
FIGURE("tobago-figure"),
diff --git a/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html b/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html
index a1a424d..3e2a0d0 100644
--- a/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html
+++ b/tobago-core/src/test/resources/renderer/link/booleanInsideLink.html
@@ -16,7 +16,7 @@
-->
<tobago-dropdown id='id' class='dropdown'>
- <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
+ <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link btn btn-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
<div class='dropdown-menu' aria-labelledby='id::command' name='id'>
<tobago-select-boolean-checkbox id='id' class='form-check dropdown-item'>
<input class='form-check-input' type='checkbox' value='true' name='id' id='id::field'>
diff --git a/tobago-core/src/test/resources/renderer/link/manyInsideLink.html b/tobago-core/src/test/resources/renderer/link/manyInsideLink.html
index 887b42e..9601fe6 100644
--- a/tobago-core/src/test/resources/renderer/link/manyInsideLink.html
+++ b/tobago-core/src/test/resources/renderer/link/manyInsideLink.html
@@ -16,7 +16,7 @@
-->
<tobago-dropdown id='id' class='dropdown'>
- <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
+ <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link btn btn-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
<div class='dropdown-menu' aria-labelledby='id::command' name='id'>
<tobago-select-many-checkbox>
<div class='form-check dropdown-item'>
diff --git a/tobago-core/src/test/resources/renderer/link/radioInsideLink.html b/tobago-core/src/test/resources/renderer/link/radioInsideLink.html
index f982168..f3e71c6 100644
--- a/tobago-core/src/test/resources/renderer/link/radioInsideLink.html
+++ b/tobago-core/src/test/resources/renderer/link/radioInsideLink.html
@@ -16,7 +16,7 @@
-->
<tobago-dropdown id='id' class='dropdown'>
- <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
+ <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link btn btn-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
<div class='dropdown-menu' aria-labelledby='id::command' name='id'>
<tobago-select-one-radio>
<div class='form-check dropdown-item'>
diff --git a/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html b/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html
index e21ff09..43674b2 100644
--- a/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html
+++ b/tobago-core/src/test/resources/renderer/link/separatorInsideLink.html
@@ -16,7 +16,7 @@
-->
<tobago-dropdown id='id' class='dropdown'>
- <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
+ <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link btn btn-link dropdown-toggle'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>dropdown</span></button>
<div class='dropdown-menu' aria-labelledby='id::command' name='id'>
<a id='link1' name='link1' href='https://www.apache.org/' class='tobago-link dropdown-item'><tobago-behavior event='click' client-id='link1' omit='omit'></tobago-behavior><span>Link 1</span></a>
<tobago-separator id='separator' class='dropdown-divider'>
diff --git a/tobago-core/src/test/resources/renderer/links/link-inside-links-sub.html b/tobago-core/src/test/resources/renderer/links/link-inside-links-sub.html
index 294ae20..9a04122 100644
--- a/tobago-core/src/test/resources/renderer/links/link-inside-links-sub.html
+++ b/tobago-core/src/test/resources/renderer/links/link-inside-links-sub.html
@@ -21,7 +21,7 @@
<ul class='nav'>
<li class='nav-item'>
<tobago-dropdown id='id' class='dropdown'>
- <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link dropdown-toggle nav-link'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>apache</span></button>
+ <button type='button' id='id::command' name='id' data-toggle='dropdown' class='tobago-link btn btn-link dropdown-toggle nav-link'><tobago-behavior event='click' client-id='id' field-id='id::command'></tobago-behavior><span>apache</span></button>
<div class='dropdown-menu' aria-labelledby='id::command' name='id'>
<a id='sub' name='sub' href='https://www.apache.org/' class='tobago-link dropdown-item nav-link'><tobago-behavior event='click' client-id='sub' omit='omit'></tobago-behavior><span>sub</span></a>
</div>