Let’s start from the top, without Sass, and continue from there. We’ll use the new setPrimaryStyleName() to do some things previously not possible.

    We’ll work on a small example with buttons that we want to customize:

    Java

    And our basic (mostly empty at this point) “sassy” theme, based on Reindeer, looks like this (assuming you’re using the recommended styles.scss+themename.scss structure as introduced in the previous tutorial):

    SCSS

    1. @mixin sassy {
    2. @include reindeer;
    3. // your styles go here
    4. }

    And the result is a basic Reindeer-looking button. We can change the color of the caption like this:

    SCSS

    1. .v-button-caption {
    2. color: red;
    3. }

    Java

    css:

    SCSS

    1. .important .v-button-caption {
    2. color: red;
    3. }

    Ok, this is all fine - but we realize our important button should actually not look at all like a Reindeer button.

    Since Reindeer adds quite a few styles, this requires quite a lot of customization with this approach. Enter setPrimaryStyleName():

    Java

    1. b = new Button("More important");
    2. b.setPrimaryStyleName("my-button");
    3. addComponent(b);

    Now everything that was previously .v-button in the browser DOM is all of a sudden .my-button, and we have a completely unstyled button, but with the DOM-structure and functionality of a regular button. We can easily style this without interference from theme styles:

    However, in our case we realize we still want it to look like a button, just not with so much decorations as a Reindeer button. Let’s apply Base styles:

    SCSS

    1. @include base-button($primaryStyleName: my-button);
    2. .my-button {
    3. color: red;
    4. }

    What? We now have a basic button with red text, but how?

    We have @included base-button and renamed it’s selectors to “my-button” (instead of the default “v-button”). This makes the rules match our button perfectly (we used setPrimaryStyleName() to rename it) - in effect we apply base-button to our “my-button”.

    Now we have a good starting-point. Note that this might not be such a big deal for small things, like buttons, but imagine something like Table witout any styles. Yikes.

    Here are the full sources (using distinct colors for each button for clarity):

    Java

    1. package com.example.sassy;
    2. import com.vaadin.annotations.Theme;
    3. import com.vaadin.ui.Button;
    4. import com.vaadin.ui.Layout;
    5. import com.vaadin.ui.UI;
    6. import com.vaadin.ui.VerticalLayout;
    7. @Theme("sassy")
    8. public class SassyUI extends UI {
    9. @Override
    10. public void init(VaadinRequest request) {
    11. Button b = new Button("Reindeer");
    12. Layout layout = new VerticalLayout();
    13. layout.addComponent(b);
    14. b = new Button("important");
    15. b.addStyleName("important");
    16. layout.addComponent(b);
    17. b = new Button("More important");
    18. b.setPrimaryStyleName("my-button");
    19. layout.addComponent(b);
    20. }
    21. }

    SCSS

    1. // sassy/sassy.scss
    2. @import "../reindeer/reindeer.scss";
    3. @mixin sassy {
    4. @include reindeer;
    5. .v-button-caption {
    6. color: red;
    7. }
    8. .important .v-button-caption {
    9. color: green;
    10. }
    11. @include base-button($name: my-button);
    12. .my-button {
    13. color: blue;
    14. }