Compiling Sass Themes

    The easiest way to develop Sass themes is to compile them at runtime, when the page is loaded. The Vaadin servlet does this automatically if a compiled theme CSS file is not found from the theme folder. You need to have the SCSS source files placed in the theme folder. The theme is compiled when the styles.css is first requested from the server. If you edit the Sass theme, it is recompiled the next time you reload the page.

    The on-the-fly compilation takes a bit time, so it is only available when the Vaadin servlet is in the development mode, as described in “Other Servlet Configuration Parameters”. Also, it requires the theme compiler and all its dependencies to be in the class path of the servlet. At least for production, you must compile the theme to CSS, as described next.

    If using Eclipse and the Vaadin Plugin for Eclipse, its project wizard creates a Sass theme. It includes Compile Theme command in the toolbar to compile the project theme to CSS. Another command compiles also the widget set.

    Compiling Sass Theme

    The WebContent/VAADIN/mytheme/styles.scss and any Sass sources included by it are compiled to styles.css.

    XML

    This is automatically included at least in the vaadin-archetype-application archetype for Vaadin applications. The actual theme compilation is most conveniently done by the Vaadin Maven Plugin with update-theme and compile-theme goals.

    XML

    1. <plugin>
    2. <groupId>com.vaadin</groupId>
    3. <artifactId>vaadin-maven-plugin</artifactId>
    4. ...
    5. <executions>
    6. <execution>
    7. ...
    8. <goals>
    9. <goal>clean</goal>
    10. <goal>resources</goal>
    11. <goal>update-theme</goal>
    12. <goal>update-widgetset</goal>
    13. <goal>compile-theme</goal>
    14. <goal>compile</goal>
    15. </goals>
    16. </execution>
    17. </executions>

    Once these are in place, the theme is compiled as part of relevant lifecycle phases, such as package.

    You can also compile just the theme with the compile-theme goal:

    1. mvn vaadin:compile-theme

    You can compile Sass style sheets to CSS either with the Vaadin Sass compiler or the standard one. The styles.css of a custom theme should be the compilation target. When compiled before deployment, the source files do not need to be in the theme folder.

    The -cp parameter should point to the class path where the Vaadin Sass Compiler and theme JARs are located. In the above example, they are assumed to be located in the WEB-INF/lib folder of the web application. If you have loaded the Vaadin libraries using Ivy, as is the case with projects created with the Vaadin Plugin for Eclipse, the Vaadin libraries are stored in Ivy’s local repository. Its folder hierarchy is somewhat scattered, so we recommend that you retrieve the libraries to a single folder. We recommend using an Ant script as is described next.

    With Apache Ant, you can easily resolve the dependencies with Ivy and compile the theme with the Theme Compiler included in Vaadin as follows. This build step can be conveniently included in a WAR build script.

    Start with the following configuration:

    XML

    1. <project xmlns:ivy="antlib:org.apache.ivy.ant"
    2. default="package-war">
    3. <target name="configure">
    4. <property name="src-location" value="src" />
    5. ... other project build definitions ...
    6. <!-- Name of the theme -->
    7. <property name="theme" value="book-examples"/>
    8. <!-- Compilation result directory -->
    9. <property name="result" value="build/result"/>
    10. </target>
    11. <!-- Initialize build -->
    12. <target name="init" depends="configure">
    13. <!-- Construct and check classpath -->
    14. <path id="compile.classpath">
    15. <!-- Source code to be compiled -->
    16. <pathelement path="${src-location}" />
    17. <!-- Vaadin libraries and dependencies -->
    18. <fileset dir="${result}/lib">
    19. <include name="*.jar"/>
    20. </path>
    21. <mkdir dir="${result}"/>
    22. </target>

    You should first resolve all Vaadin libraries to a single directory, which you can use for deployment, but also for theme compilation.

    Then, you can compile the theme as follows:

    1. <!-- Compile theme -->
    2. <target name="compile-theme"
    3. depends="init, resolve">
    4. <delete dir="${result}/VAADIN/themes/${theme}"/>
    5. <mkdir dir="${result}/VAADIN/themes/${theme}"/>
    6. <java classname="com.vaadin.sass.SassCompiler"
    7. fork="true">
    8. <classpath>
    9. <path refid="compile.classpath"/>
    10. </classpath>
    11. <arg value="WebContent/VAADIN/themes/${theme}/styles.scss"/>
    12. <arg value="${result}/VAADIN/themes/${theme}/styles.css"/>
    13. </java>
    14. <!-- Copy theme resources -->
    15. <copy todir="${result}/VAADIN/themes/${theme}">
    16. <fileset dir="WebContent/VAADIN/themes/${theme}">
    17. <exclude name="**/*.scss"/>
    18. </fileset>
    19. </copy>
    20. </project>