From fb38a06c3da3d5c031197ae2a995c3c7d23c011d Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 12 Oct 2017 16:40:38 +0200 Subject: [PATCH 01/12] bug4338 Added new widget for language selection purposes --- .../languageselect/LanguageSelector.java | 103 ++++++++++++++++++ .../languageselect/LanguageSelector.ui.xml | 42 +++++++ 2 files changed, 145 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.ui.xml diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.java new file mode 100644 index 00000000000..d5d7a450fa9 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.java @@ -0,0 +1,103 @@ +package com.sap.sailing.gwt.common.client.controls.languageselect; + +import java.util.List; +import java.util.Optional; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.http.client.UrlBuilder; +import com.google.gwt.i18n.client.LocaleInfo; +import com.google.gwt.text.shared.AbstractRenderer; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiConstructor; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.Window.Location; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.InlineLabel; +import com.google.gwt.user.client.ui.ValueListBox; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.common.Util; +import com.sap.sse.gwt.client.GWTLocaleUtil; + +/** + * {@link Widget} class which can be used to change the language of the application, based on the languages configured + * in the module's *.gwt.xml file. The widget behaves as follows: + * + */ +public class LanguageSelector extends Composite { + + private static LanguageSelectorUiBinder uiBinder = GWT.create(LanguageSelectorUiBinder.class); + + interface LanguageSelectorUiBinder extends UiBinder { + } + + @UiField + InlineLabel labelUi; + @UiField + Anchor languageSwitchLinkUi; + @UiField(provided = true) + ValueListBox languageSelectionUi; + + /** + * Creates a new {@link LanguageSelector} instance using the provided label text. + * + * @param labelText + * {@link String text} to show in front of the link / selection + */ + @UiConstructor + public LanguageSelector(String labelText) { + languageSelectionUi = new ValueListBox<>(new LanguageRenderer()); + initWidget(uiBinder.createAndBindUi(this)); + this.labelUi.setText(labelText); + this.initLanguages(LocaleInfo.getCurrentLocale()); + } + + private void initLanguages(final LocaleInfo currentLocale) { + final List availableLocales = Util.asList(GWTLocaleUtil.getAvailableLocales()); + if (availableLocales.size() <= 1) { // no other language available => remove widget + this.removeFromParent(); + } else if (availableLocales.size() == 2) { // only one other language available => show link + this.initLanguageSwitchLink(availableLocales, currentLocale); + } else { // multiple languages available => show selection + this.initLanguageSelection(availableLocales, currentLocale); + } + } + + private void initLanguageSwitchLink(final List available, final LocaleInfo current) { + this.languageSelectionUi.removeFromParent(); + final Optional other = available.stream().filter(l -> !current.getLocaleName().equals(l)).findFirst(); + other.ifPresent(name -> languageSwitchLinkUi.addClickHandler(e -> switchLanguage(name))); + } + + private void initLanguageSelection(final List available, final LocaleInfo current) { + this.languageSwitchLinkUi.removeFromParent(); + this.languageSelectionUi.setValue(current.getLocaleName()); + this.languageSelectionUi.setAcceptableValues(available); + this.languageSelectionUi.addValueChangeHandler(event -> { + if (!current.getLocaleName().equals(event.getValue())) { + this.switchLanguage(event.getValue()); + } + }); + } + + private void switchLanguage(String newLocaleName) { + final UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", newLocaleName); + Window.Location.replace(builder.buildString()); + } + + private static class LanguageRenderer extends AbstractRenderer { + + @Override + public String render(String object) { + final String displayName = LocaleInfo.getLocaleNativeDisplayName(object); + return displayName == null ? "" : displayName; + } + + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.ui.xml new file mode 100644 index 00000000000..5e5780c43b6 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/controls/languageselect/LanguageSelector.ui.xml @@ -0,0 +1,42 @@ + + + + .label { + margin-right: .25em; + } + .label:after { + content: ":"; + } + .languageSwichLink { + color: #efaa00; + cursor: pointer; + } + .languageSelection:-ms-expand { + display: none; + } + .languageSelection { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + appearance: none; + margin-top: 25px; + color: #efaa00; + line-height: 1.5em; + height: 1.5em; + display: inline-block; + border: transparent; + cursor: pointer; + padding-right: 1.2em; + background: #333; + cursor: pointer; + background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaGVpZ2h0PScxOHB4JyB3aWR0aD0nMTZweCc+PHRleHQgeD0nMCcgeT0nMTUnIGZpbGw9JyNlZmFhMDAnIGZvbnQtc2l6ZT0nMTYnPiYjOTY2MDs8L3RleHQ+PC9zdmc+"); + background-position: right center; + background-repeat: no-repeat; + } + + + + + + + \ No newline at end of file From ad1805915405be06e2d8f7c27e0f1d3442b94c15 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 12 Oct 2017 17:10:11 +0200 Subject: [PATCH 02/12] bug4338 Integrated language selection widget into Home.html footer on desktop --- .../home/desktop/partials/footer/Footer.gss | 6 -- .../home/desktop/partials/footer/Footer.java | 97 ------------------- .../desktop/partials/footer/Footer.ui.xml | 35 +------ .../partials/footer/FooterResources.java | 1 - 4 files changed, 3 insertions(+), 136 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.gss index bbb5545e440..88081595726 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.gss @@ -48,9 +48,3 @@ text-align: right; } } -.sitefooter_language_link { - color: #efaa00; - display: inline-block; - cursor: pointer; - margin-left: 0.666666666666667em; -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java index 02fc522ec7e..d56dd87fbc3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.java @@ -1,28 +1,13 @@ package com.sap.sailing.gwt.home.desktop.partials.footer; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; - import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.AnchorElement; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.logical.shared.ValueChangeEvent; -import com.google.gwt.http.client.UrlBuilder; -import com.google.gwt.i18n.client.LocaleInfo; -import com.google.gwt.text.shared.Renderer; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.Window.Location; -import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.ValueListBox; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.EventBus; import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator; @@ -30,9 +15,6 @@ import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace; import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace.WhatsNewNavigationTabs; import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; -import com.sap.sse.common.Util; -import com.sap.sse.common.Util.Pair; -import com.sap.sse.gwt.client.GWTLocaleUtil; public class Footer extends Composite { private static FooterPanelUiBinder uiBinder = GWT.create(FooterPanelUiBinder.class); @@ -40,32 +22,8 @@ public class Footer extends Composite { interface FooterPanelUiBinder extends UiBinder { } - @UiField Anchor changeLanguageLink; @UiField AnchorElement imprintAnchorLink; - @UiField DivElement languageSelectionDiv; - @UiField(provided = true) ValueListBox> changeLanguageList = new ValueListBox>(new Renderer>() { - @Override - public String render(Pair object) { - if(object == null) { - return ""; - } - if(object.getB() != null) { - return object.getB(); - } - return object.getA(); - } - - @Override - public void render(Pair object, Appendable appendable) throws IOException { - appendable.append(render(object)); - } - }); - @UiField AnchorElement mobileUi; - private String otherLanguage; - private final LocaleInfo currentLocale = LocaleInfo.getCurrentLocale(); - - @UiField(provided = true) final PlaceNavigation releaseNotesNavigation; @@ -76,7 +34,6 @@ public class Footer extends Composite { initWidget(uiBinder.createAndBindUi(this)); navigator.getImprintNavigation().configureAnchorElement(imprintAnchorLink); - updateUI(); DOM.sinkEvents(mobileUi, Event.ONCLICK); DOM.setEventListener(mobileUi, new EventListener() { @Override @@ -89,58 +46,4 @@ public class Footer extends Composite { }); } - - @UiHandler("changeLanguageLink") - public void changeLanguage(ClickEvent e) { - if(otherLanguage != null) { - UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", otherLanguage); - Window.Location.replace(builder.buildString()); - } - } - - @UiHandler("changeLanguageList") - void onListSelection(ValueChangeEvent> event) { - String selectedLocaleName = event.getValue().getA(); - if(!currentLocale.getLocaleName().equals(selectedLocaleName)) { - UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", selectedLocaleName); - Window.Location.replace(builder.buildString()); - } - } - - private void updateUI() { - final Iterable availableLocales = GWTLocaleUtil.getAvailableLocales(); - final int localeCount = Util.size(availableLocales); - - if (localeCount <= 1) { - // only current language (or removed default) available - changeLanguageLink.removeFromParent(); - changeLanguageList.removeFromParent(); - languageSelectionDiv.removeFromParent(); - return; - } - if (Util.size(availableLocales) == 2) { - changeLanguageList.removeFromParent(); - // current language + one we can switch to - for (String localeName : availableLocales) { - if (!currentLocale.getLocaleName().equals(localeName)) { - otherLanguage = localeName; - changeLanguageLink.setText(LocaleInfo.getLocaleNativeDisplayName(otherLanguage)); - return; - } - } - return; - } - changeLanguageLink.removeFromParent(); - Collection> values = new ArrayList<>(); - Pair selectedValue = null; - for (String localeName : availableLocales) { - Pair value = new Pair(localeName, LocaleInfo.getLocaleNativeDisplayName(localeName)); - values.add(value); - if (currentLocale.getLocaleName().equals(localeName)) { - selectedValue = value; - } - } - changeLanguageList.setValue(selectedValue); - changeLanguageList.setAcceptableValues(values); - } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml index a0bfd39be8e..dc3c9abe6b4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml @@ -1,37 +1,11 @@ - - .languageSelect::-ms-expand { - display: none; - } - .languageSelect { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - appearance: none; - - margin-top: 25px; - color: #efaa00; - line-height: 1.5em; - height: 1.5em; - display: inline-block; - border: transparent; - cursor: pointer; - padding-right: 1.2em; - background: #333; - cursor: pointer; - - background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaGVpZ2h0PScxOHB4JyB3aWR0aD0nMTZweCc+PHRleHQgeD0nMCcgeT0nMTUnIGZpbGw9JyNlZmFhMDAnIGZvbnQtc2l6ZT0nMTYnPiYjOTY2MDs8L3RleHQ+PC9zdmc+"); - background-position: right center; - background-repeat: no-repeat; - - } -
@@ -61,11 +35,8 @@
-
- : - - -
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/FooterResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/FooterResources.java index ce5aad9d4f1..7c73496fd50 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/FooterResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/FooterResources.java @@ -16,6 +16,5 @@ public interface FooterResources extends ClientBundle { String sitefooter_links(); String sitefooter_links_link(); String sitefooter_language(); - String sitefooter_language_link(); } } From b6b58c88a95a003d4863d4da874ca28a1c21d8c7 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 12 Oct 2017 17:27:56 +0200 Subject: [PATCH 03/12] bug4338 Integrated language selection widget into Home.html footer on mobile --- .../home/mobile/partials/footer/Footer.gss | 7 +- .../home/mobile/partials/footer/Footer.java | 93 +------------------ .../home/mobile/partials/footer/Footer.ui.xml | 67 +++---------- .../partials/footer/FooterResources.java | 2 - 4 files changed, 14 insertions(+), 155 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss index 70cd072f687..32b7a0e8c59 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss @@ -14,11 +14,8 @@ .sitefooter_language { display: block; } -a.sitefooter_language_link { - color: #fff; -} -a.sitefooter_language_linkactive { - color: #efaa00; +.sitefooter_language select { + font-size: 110%; } .sitefooter_links { font-weight: 600; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java index a07f9cbce7d..a7f75d1530c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.java @@ -1,34 +1,19 @@ package com.sap.sailing.gwt.home.mobile.partials.footer; -import java.io.IOException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.AnchorElement; -import com.google.gwt.dom.client.DivElement; import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.logical.shared.ValueChangeEvent; -import com.google.gwt.http.client.UrlBuilder; -import com.google.gwt.i18n.client.LocaleInfo; -import com.google.gwt.text.shared.Renderer; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.Window.Location; -import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.ValueListBox; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace; import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator; import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint; -import com.sap.sse.common.Util.Pair; /** * Mobile page footer with several links and the ability to switch the language. @@ -39,32 +24,10 @@ public class Footer extends Composite { interface FooterPanelUiBinder extends UiBinder { } - private String otherLanguage; - private final LocaleInfo currentLocale = LocaleInfo.getCurrentLocale(); - private MobilePlacesNavigator placeNavigator; - - @UiField Anchor changeLanguageLink; @UiField AnchorElement imprintAnchorLink; - @UiField DivElement languageSelectionDiv; @UiField AnchorElement desktopUi; - @UiField(provided = true) ValueListBox> changeLanguageList = new ValueListBox>(new Renderer>() { - @Override - public String render(Pair object) { - if(object == null) { - return ""; - } - if(object.getB() != null) { - return object.getB(); - } - return object.getA(); - } - - @Override - public void render(Pair object, Appendable appendable) throws IOException { - appendable.append(render(object)); - } - }); + private final MobilePlacesNavigator placeNavigator; public Footer(MobilePlacesNavigator placeNavigator) { this.placeNavigator = placeNavigator; @@ -73,7 +36,6 @@ public class Footer extends Composite { initWidget(uiBinder.createAndBindUi(this)); placeNavigator.getImprintNavigation().configureAnchorElement(imprintAnchorLink); - updateUI(); DOM.sinkEvents(desktopUi, Event.ONCLICK); DOM.setEventListener(desktopUi, new EventListener() { @Override @@ -86,62 +48,9 @@ public class Footer extends Composite { }); } - @UiHandler("changeLanguageLink") - public void changeLanguage(ClickEvent e) { - if(otherLanguage != null) { - UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", otherLanguage); - Window.Location.replace(builder.buildString()); - } - } - - @UiHandler("changeLanguageList") - void onListSelection(ValueChangeEvent> event) { - String selectedLocaleName = event.getValue().getA(); - if(!currentLocale.getLocaleName().equals(selectedLocaleName)) { - UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", selectedLocaleName); - Window.Location.replace(builder.buildString()); - } - } - @UiHandler("whatsNewLinkUi") void onWhatsNew(ClickEvent e) { placeNavigator.getWhatsNewNavigation(WhatsNewPlace.WhatsNewNavigationTabs.SailingAnalytics).goToPlace(); } - private void updateUI() { - Set availableLocales = new HashSet(Arrays.asList(LocaleInfo.getAvailableLocaleNames())); - availableLocales.remove("default"); - - if(availableLocales.size() <= 1) { - // only current language (or removed default) available - changeLanguageLink.removeFromParent(); - changeLanguageList.removeFromParent(); - languageSelectionDiv.removeFromParent(); - return; - } - if(availableLocales.size() == 2) { - changeLanguageList.removeFromParent(); - // current language + one we can switch to - for(String localeName : availableLocales) { - if(!currentLocale.getLocaleName().equals(localeName)) { - otherLanguage = localeName; - changeLanguageLink.setText(LocaleInfo.getLocaleNativeDisplayName(otherLanguage)); - return; - } - } - return; - } - changeLanguageLink.removeFromParent(); - Set> values = new HashSet<>(); - Pair selectedValue = null; - for(String localeName : availableLocales) { - Pair value = new Pair(localeName, LocaleInfo.getLocaleNativeDisplayName(localeName)); - values.add(value); - if(currentLocale.getLocaleName().equals(localeName)) { - selectedValue = value; - } - } - changeLanguageList.setValue(selectedValue); - changeLanguageList.setAcceptableValues(values); - } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml index 14bf6904283..6126c9463fd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml @@ -1,60 +1,17 @@ - - - - - - - .languageSelect::-ms-expand { - display: none; - } - - .languageSelect { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - appearance: none; - margin-top: 25px; - color: #efaa00; - line-height: 1.5em; - height: 1.5em; - display: inline-block; - border: transparent; - cursor: pointer; - padding-right: 1.2em; - background: #333; - cursor: pointer; - background-image: - url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaGVpZ2h0PScxOHB4JyB3aWR0aD0nMTZweCc+PHRleHQgeD0nMCcgeT0nMTUnIGZpbGw9JyNlZmFhMDAnIGZvbnQtc2l6ZT0nMTYnPiYjOTY2MDs8L3RleHQ+PC9zdmc+"); - background-position: right center; - background-repeat: no-repeat; - font-size: 110%; - } - + + + +