├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── build.gradle └── src ├── main ├── java │ └── com │ │ └── deswaef │ │ └── spring │ │ └── examples │ │ └── reactor │ │ ├── SpringReactorExample.java │ │ ├── configuration │ │ ├── ReactorConfiguration.java │ │ ├── ReactorLoggingConfiguration.java │ │ └── WebsocketConfig.java │ │ ├── exceptions │ │ └── ReactorExampleException.java │ │ ├── model │ │ ├── LogCategory.java │ │ └── LogMessage.java │ │ ├── mvc │ │ ├── WelcomeController.java │ │ └── dto │ │ │ └── LogMessagesWrapperDto.java │ │ ├── repository │ │ └── LogMessageRepository.java │ │ └── service │ │ └── LoggingService.java └── resources │ ├── application.properties │ ├── static │ ├── css │ │ ├── font │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ └── fontawesome-webfont.woff │ │ ├── ie7.css │ │ ├── ie8.css │ │ ├── images │ │ │ ├── bg.jpg │ │ │ ├── bgshadow.png │ │ │ └── mobileUI-site-nav-opener-bg.svg │ │ ├── skel-noscript.css │ │ ├── style-1000px.css │ │ ├── style-desktop.css │ │ ├── style-mobile.css │ │ └── style.css │ ├── images │ │ ├── charts.png │ │ ├── ghost.png │ │ ├── git.jpg │ │ ├── intellij.gif │ │ ├── java.jpg │ │ ├── me.jpg │ │ ├── pic01.jpg │ │ ├── pic02.jpg │ │ ├── pic03.jpg │ │ ├── pic04.jpg │ │ ├── pic05.jpg │ │ ├── pic06.jpg │ │ ├── pic07.jpg │ │ ├── spring-header.jpg │ │ ├── spring.jpg │ │ ├── thymeleaf.png │ │ ├── twitter.png │ │ └── wowlogo.png │ └── js │ │ ├── config.js │ │ ├── d3 │ │ ├── d3.js │ │ └── d3.layout.js │ │ ├── html5shiv.js │ │ ├── jquery.min.js │ │ ├── skel-panels.min.js │ │ ├── skel.min.js │ │ ├── sockjs-0.3.4.min.js │ │ └── stomp.js │ └── templates │ ├── fragments │ ├── footer.html │ └── header.html │ └── main.html └── test └── java └── com └── deswaef └── spring └── examples └── reactor ├── configuration └── ReactorLoggingConfigurationTest.java ├── repository ├── LogMessageRepositoryTest.java └── RepositoryIntegrationTest.java └── service └── LoggingServiceTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | spring-boot-reactor-examples.iml 3 | build/ 4 | .gradle/ 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | 3 | jdk: 4 | - oraclejdk8 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > Reactor, as the name suggests, is heavily influenced by the well-known [Reactor design pattern](http://en.wikipedia.org/wiki/Reactor_pattern). But it is also influenced by other event-driven design practices, as well as several awesome JVM-based solutions that have been developed over the years. Reactor's goal is to condense these ideas and patterns into a simple and reusable foundation for making event-driven programming much easier. 2 | 3 | ## About this blogpost 4 | This blogpost will try to teach you the basics of event driven programming using [spring boot](http://projects.spring.io/spring-boot/) and [reactor](https://github.com/reactor/reactor-quickstart). It won't cover every aspect of reactor, nor will one be able to use it as complete reference. I will, however, try to give as much examples as possible in my accompanying code. 5 | 6 | ## Accompanying code 7 | This small tutorial is accompanied by a [Github Repository](https://github.com/Qkyrie/spring-boot-reactor-example). Not all content of the code at the repository will be discussed here, so don't forget to check it out later! 8 | The code was compiled and tested using the JDK8, and will therefore require you to have Java 8 to test this application. 9 | 10 | If you find anything in the repository that is unclear, or you something you'd like to see a seperate blogpost of, feel free to file it as an issue in the repository. 11 | 12 | ### Running the example 13 | Simply download the code - either using git or plain archive downloading. Make sure you have gradle installed. 14 | 15 | gradle bootRun 16 | 17 | ## The Code 18 | In this section I'll go over the important components which wire up the example application. It's a full stack application, which means that it'll contain a model, repositories, services and controllers, as wel as a basic view, written in thymeleaf. The frontend won't be a subject of this article, however, feel free to check it out on Github! 19 | 20 | ### Some Jpa simple entity 21 | 22 | @Entity 23 | public class LogMessage { 24 | @Id 25 | @GeneratedValue 26 | private Long id; 27 | private String text; 28 | private Date logDate; 29 | @Enumerated(value = STRING) 30 | private LogCategory category; 31 | } 32 | 33 | public enum LogCategory { 34 | DEBUG, ERROR, INFO 35 | } 36 | 37 | What is described here, is a stripped-down version of an entity called **LogMessage**. A LogMessage will just be an entry in our database containing a basic String and some metadata, such as a logDate and an enumerated category. 38 | 39 | ### A Restful repository 40 | 41 | @RepositoryRestResource(collectionResourceRel = "logs", path = "logs") 42 | public interface LogMessageRepository extends JpaRepository { 43 | } 44 | 45 | With [Spring Data JPA](http://projects.spring.io/spring-data-jpa/) we can avoid all the boilerplate code which would normally fill our application. Just a simple interface is enough to expose the database in a modern fashion. We also added the **@RepositoryRestResource** annotation, which will later expose the entire repository as a REST-API. This is done by [Spring Data Rest](http://projects.spring.io/spring-data-rest/). 46 | 47 | ### The Reactor AutoConfiguration 48 | 49 | This configuration really speaks for itself. We don't need any special reactor implementation, and therefore, we can count on Spring Boot to provide us with an active Environment, as well as a ReactorAutoConfiguration. Simply Enable it using the **@EnableReactor** annotation. 50 | 51 | @Configuration 52 | @EnableReactor 53 | public class ReactorConfiguration { 54 | } 55 | 56 | ### Wiring up our components - The receiving part 57 | 58 | Event driven infrastructures always consist of at least the following two parts: A Sender and a Receiver that will somehow listen or register on a given endpoint. Let's start with some example code of the receiving part. 59 | 60 | We'll start with registering on 2 events. 61 | First of all, we'll register on an event that's triggered once *channel log.(trace|debug)* is being notified. As you'll see we use **reactor.event.selector.Selectors.R**, which is a selector we can use to match a certain [regular expression](http://en.wikipedia.org/wiki/Regular_expression). 62 | 63 | The second selector we'll be using, will be a class-selector. 64 | **reactor.event.selector.Selectors.T** will react on the notification of a class, in our case *ReactorExampleException*. 65 | 66 | We could also be using **reactor.event.selector.Selectors.$**, which is just a simple String-based selector. The syntax highly resembles the JQuery Selectors Syntax 67 | 68 | 69 | @Component 70 | public class ReactorLoggingConfiguration { 71 | 72 | @Autowired 73 | private Reactor r; 74 | 75 | @Autowired 76 | private LoggingService loggingService; 77 | 78 | @PostConstruct 79 | public void onStartUp() { 80 | r.on(R("log.(trace|debug)"), logForDebug()); 81 | r.on(T(ReactorExampleException.class), logForException()); 82 | } 83 | 84 | private Consumer> logForException() { 85 | return logException -> loggingService.log(LogCategory.ERROR, logException.getData().getMessage()); 86 | } 87 | 88 | 89 | private Consumer> logForDebug() { 90 | return logInfoEvent -> loggingService.log(LogCategory.INFO, logInfoEvent.getData()); 91 | } 92 | } 93 | 94 | Ahh, Java 8, isn't it a beauty? Because the callback for an event is wrapped in a Consumer, we can leverage the hassle of creating a Consumer implementation by writing a lambda expression. 95 | 96 | ### Wiring up the components - The sending part 97 | 98 | The sending part is fairly easy. All you have to do is used an Injected version of **Reactor** - called r here - and invoke the **notify(key, value)** 99 | 100 | @RequestMapping(method = GET) 101 | public String welcome() { 102 | r.notify("log.debug", Event.wrap("Wew, someone accessed our page!")); 103 | return "main"; 104 | } 105 | 106 | 107 | ### The result 108 | If we first start up our application, we'll quickly notice that we started with an empty database. By default, Spring boot looks for a DataSource implementation on the classpath. We just added a h2-database, so everyone can test this application without any 3d party necessities, such as a mysql database for example. 109 | 110 | Because we're using spring data rest on our **LogMessageRepository**, it is being fully exposed. Simply browse to the following url to consume the self-explanatory API. 111 | > http://localhost:8080/logs 112 | 113 | { 114 | "_links" : { 115 | "self" : { 116 | "href" : "http://localhost:8080/logs?sort=desc{&page,size}", 117 | "templated" : true 118 | } 119 | }, 120 | "page" : { 121 | "size" : 20, 122 | "totalElements" : 0, 123 | "totalPages" : 0, 124 | "number" : 0 125 | } 126 | } 127 | 128 | Of course, our database is still empty. 129 | Because we added an event that's being triggered once a user visits our homepage, we can trigger it ourselves by visiting the following url. 130 | 131 | > http://localhost:8080 132 | 133 | 134 | Upon visiting the rest api again, we can now see a populated database. 135 | 136 | { 137 | "_embedded" : { 138 | "logs" : [ { 139 | "text" : "Wew, someone accessed our page!", 140 | "logDate" : "2014-09-08T09:44:56.024+0000", 141 | "category" : "INFO", 142 | "_links" : { 143 | "self" : { 144 | "href" : "http://localhost:8080/logs/1" 145 | } 146 | } 147 | } ] 148 | } 149 | } 150 | 151 | ### What more can we find in the Github repo? 152 | In the repository, I also added a thymeleaf template which connects through websockets to the server. Everytime someone accesses the application by visiting the homepage, a small fragment of the homepage would be updated using JavaScript. 153 | 154 | This all is merely an example of how one would use Reactor in a project. If any bugs or questions arise, feel free to mark them as an issue in the repository. 155 | 156 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext { 3 | springBootVersion = '1.4.2.RELEASE' 4 | reactorVersion = '2.0.7.RELEASE' 5 | } 6 | repositories { 7 | // NOTE: You should declare only repositories that you need here 8 | mavenLocal() 9 | mavenCentral() 10 | maven { url "http://repo.spring.io/release" } 11 | } 12 | dependencies { 13 | classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 14 | } 15 | } 16 | 17 | apply plugin: 'java' 18 | apply plugin: 'idea' 19 | apply plugin: 'spring-boot' 20 | 21 | jar { 22 | baseName = 'spring-boot-reactor-example' 23 | version = '1.3.0' 24 | } 25 | 26 | repositories { 27 | // NOTE: You should declare only repositories that you need here 28 | mavenLocal() 29 | mavenCentral() 30 | maven { url "http://repo.spring.io/release" } 31 | } 32 | 33 | dependencies { 34 | compile("org.springframework.boot:spring-boot-starter") 35 | compile("org.springframework.boot:spring-boot-starter-data-jpa") 36 | compile("org.springframework.boot:spring-boot-starter-data-rest") 37 | compile 'io.projectreactor.spring:reactor-spring-core:2.0.7.RELEASE' 38 | compile 'io.projectreactor.spring:reactor-spring-context:2.0.7.RELEASE' 39 | compile 'io.projectreactor.spring:reactor-spring-messaging:2.0.7.RELEASE' 40 | compile 'io.projectreactor:reactor-bus:2.0.7.RELEASE' 41 | 42 | compile("org.springframework.boot:spring-boot-starter-thymeleaf") 43 | compile("org.springframework.boot:spring-boot-starter-websocket") 44 | compile("org.springframework:spring-messaging") 45 | compile("org.apache.commons:commons-lang3:3.0") 46 | compile("com.h2database:h2") 47 | testCompile("junit:junit") 48 | testCompile("org.springframework.boot:spring-boot-starter-test") 49 | testCompile('org.easytesting:fest-assert:1.4') 50 | } 51 | 52 | task "forceTest" { 53 | dependsOn "cleanTest", "test" 54 | } 55 | 56 | task "fullBuild" { 57 | dependsOn "cleanTest", "test", "check", "build" 58 | } 59 | 60 | task wrapper(type: Wrapper) { 61 | gradleVersion = '1.11' 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/SpringReactorExample.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.deswaef.spring.examples.reactor; 18 | 19 | import org.springframework.boot.SpringApplication; 20 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 21 | import org.springframework.context.annotation.ComponentScan; 22 | import org.springframework.context.annotation.Configuration; 23 | import org.springframework.context.annotation.Import; 24 | import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 25 | import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration; 26 | 27 | @Configuration 28 | @EnableAutoConfiguration 29 | @ComponentScan 30 | @EnableJpaRepositories 31 | @Import(RepositoryRestMvcConfiguration.class) 32 | public class SpringReactorExample { 33 | public static void main(String[] args) throws Exception { 34 | SpringApplication.run(SpringReactorExample.class); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/configuration/ReactorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.configuration; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import reactor.spring.context.config.EnableReactor; 5 | 6 | /** 7 | * User: Quinten 8 | * Date: 8-9-2014 9 | * Time: 10:41 10 | * 11 | * @author Quinten De Swaef 12 | */ 13 | @Configuration 14 | @EnableReactor 15 | public class ReactorConfiguration { 16 | 17 | } -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/configuration/ReactorLoggingConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.configuration; 2 | 3 | import com.deswaef.spring.examples.reactor.exceptions.ReactorExampleException; 4 | import com.deswaef.spring.examples.reactor.model.LogCategory; 5 | import com.deswaef.spring.examples.reactor.service.LoggingService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Component; 8 | import reactor.bus.Event; 9 | import reactor.bus.EventBus; 10 | import reactor.fn.Consumer; 11 | 12 | import javax.annotation.PostConstruct; 13 | 14 | import static reactor.bus.selector.Selectors.R; 15 | import static reactor.bus.selector.Selectors.T; 16 | 17 | /** 18 | * User: Quinten 19 | * Date: 6-9-2014 20 | * Time: 01:43 21 | * 22 | * @author Quinten De Swaef 23 | */ 24 | @Component 25 | public class ReactorLoggingConfiguration { 26 | 27 | @Autowired 28 | private EventBus r; 29 | 30 | @Autowired 31 | private LoggingService loggingService; 32 | 33 | @PostConstruct 34 | public void onStartUp() { 35 | r.on(R("log.(trace|debug)"), logForDebug()); 36 | r.on(T(ReactorExampleException.class), logForException()); 37 | } 38 | 39 | private Consumer> logForException() { 40 | return logException -> loggingService.log(LogCategory.ERROR, logException.getData().toString()); 41 | } 42 | 43 | 44 | private Consumer> logForDebug() { 45 | return logInfoEvent -> loggingService.log(LogCategory.INFO, logInfoEvent.getData()); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/configuration/WebsocketConfig.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.configuration; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.messaging.simp.config.MessageBrokerRegistry; 5 | import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; 6 | import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; 7 | import org.springframework.web.socket.config.annotation.StompEndpointRegistry; 8 | 9 | /** 10 | * User: Quinten 11 | * Date: 8-9-2014 12 | * Time: 12:32 13 | * 14 | * @author Quinten De Swaef 15 | */ 16 | @Configuration 17 | @EnableWebSocketMessageBroker 18 | public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 19 | @Override 20 | public void configureMessageBroker(MessageBrokerRegistry config) { 21 | config.enableSimpleBroker("/topic"); 22 | config.setApplicationDestinationPrefixes("/app"); 23 | } 24 | 25 | @Override 26 | public void registerStompEndpoints(StompEndpointRegistry registry) { 27 | registry.addEndpoint("/loggingchecker").withSockJS(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/exceptions/ReactorExampleException.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.exceptions; 2 | 3 | /** 4 | * User: Quinten 5 | * Date: 8-9-2014 6 | * Time: 10:55 7 | * 8 | * @author Quinten De Swaef 9 | */ 10 | public class ReactorExampleException extends Exception { 11 | public ReactorExampleException() { 12 | super(); 13 | } 14 | 15 | public ReactorExampleException(String message) { 16 | super(message); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/model/LogCategory.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.model; 2 | 3 | /** 4 | * User: Quinten 5 | * Date: 6-9-2014 6 | * Time: 01:39 7 | * 8 | * @author Quinten De Swaef 9 | */ 10 | public enum LogCategory { 11 | DEBUG, ERROR, INFO 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/model/LogMessage.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.model; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.EnumType; 5 | import javax.persistence.Enumerated; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | import java.util.Date; 9 | 10 | import static javax.persistence.EnumType.STRING; 11 | 12 | /** 13 | * User: Quinten 14 | * Date: 6-9-2014 15 | * Time: 00:28 16 | * 17 | * @author Quinten De Swaef 18 | */ 19 | @Entity 20 | public class LogMessage { 21 | @Id 22 | @GeneratedValue 23 | private Long id; 24 | private String text; 25 | private Date logDate; 26 | @Enumerated(value = STRING) 27 | private LogCategory category; 28 | 29 | 30 | public Long getId() { 31 | return id; 32 | } 33 | 34 | public LogMessage setId(Long id) { 35 | this.id = id; 36 | return this; 37 | } 38 | 39 | public String getText() { 40 | return text; 41 | } 42 | 43 | public LogMessage setText(String text) { 44 | this.text = text; 45 | return this; 46 | } 47 | 48 | public Date getLogDate() { 49 | return logDate; 50 | } 51 | 52 | public LogMessage setLogDate(Date logDate) { 53 | this.logDate = logDate; 54 | return this; 55 | } 56 | 57 | public LogCategory getCategory() { 58 | return category; 59 | } 60 | 61 | public LogMessage setCategory(LogCategory category) { 62 | this.category = category; 63 | return this; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/mvc/WelcomeController.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.mvc; 2 | 3 | import com.deswaef.spring.examples.reactor.model.LogMessage; 4 | import com.deswaef.spring.examples.reactor.mvc.dto.LogMessagesWrapperDto; 5 | import com.deswaef.spring.examples.reactor.service.LoggingService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.messaging.simp.SimpMessagingTemplate; 8 | import org.springframework.stereotype.Controller; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import reactor.bus.Event; 11 | import reactor.bus.EventBus; 12 | import reactor.fn.Consumer; 13 | 14 | import javax.annotation.PostConstruct; 15 | import java.util.List; 16 | 17 | import static org.springframework.web.bind.annotation.RequestMethod.GET; 18 | import static reactor.bus.selector.Selectors.$; 19 | 20 | /** 21 | * User: Quinten 22 | * Date: 8-9-2014 23 | * Time: 11:34 24 | * 25 | * @author Quinten De Swaef 26 | */ 27 | @Controller 28 | @RequestMapping(value = "/") 29 | public class WelcomeController { 30 | 31 | @Autowired 32 | private EventBus r; 33 | @Autowired 34 | private SimpMessagingTemplate template; 35 | 36 | @Autowired 37 | private LoggingService loggingService; 38 | 39 | @PostConstruct 40 | public void init() { 41 | r.on($("log.created"), reactOnLogging()); 42 | } 43 | 44 | private Consumer> reactOnLogging() { 45 | return logMessage -> { 46 | List all = loggingService 47 | .findAll(); 48 | LogMessagesWrapperDto logMessagesWrapperDto = new LogMessagesWrapperDto() 49 | .setAmount(all.stream().count()) 50 | .setLastEvent(all.stream() 51 | .reduce((previous, current) -> current) 52 | .get().getText()); 53 | template.convertAndSend("/topic/newlogs", logMessagesWrapperDto); 54 | }; 55 | } 56 | 57 | 58 | @RequestMapping(method = GET) 59 | public String welcome() { 60 | r.notify("log.debug", Event.wrap("Wew, someone accessed our page!")); 61 | return "main"; 62 | } 63 | 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/mvc/dto/LogMessagesWrapperDto.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.mvc.dto; 2 | 3 | /** 4 | * User: Quinten 5 | * Date: 8-9-2014 6 | * Time: 17:14 7 | * 8 | * @author Quinten De Swaef 9 | */ 10 | public class LogMessagesWrapperDto { 11 | private Long amount; 12 | private String lastEvent; 13 | 14 | public Long getAmount() { 15 | return amount; 16 | } 17 | 18 | public LogMessagesWrapperDto setAmount(Long amount) { 19 | this.amount = amount; 20 | return this; 21 | } 22 | 23 | public String getLastEvent() { 24 | return lastEvent; 25 | } 26 | 27 | public LogMessagesWrapperDto setLastEvent(String lastEvent) { 28 | this.lastEvent = lastEvent; 29 | return this; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/repository/LogMessageRepository.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.repository; 2 | 3 | import com.deswaef.spring.examples.reactor.model.LogMessage; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.repository.CrudRepository; 6 | import org.springframework.data.rest.core.annotation.RepositoryRestResource; 7 | 8 | /** 9 | * User: Quinten 10 | * Date: 6-9-2014 11 | * Time: 01:02 12 | * 13 | * @author Quinten De Swaef 14 | */ 15 | @RepositoryRestResource(collectionResourceRel = "logs", path = "logs") 16 | public interface LogMessageRepository extends JpaRepository { 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/deswaef/spring/examples/reactor/service/LoggingService.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.service; 2 | 3 | import com.deswaef.spring.examples.reactor.model.LogCategory; 4 | import com.deswaef.spring.examples.reactor.model.LogMessage; 5 | import com.deswaef.spring.examples.reactor.repository.LogMessageRepository; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | import org.springframework.transaction.annotation.Transactional; 9 | import reactor.bus.Event; 10 | import reactor.bus.EventBus; 11 | 12 | import java.util.Date; 13 | import java.util.List; 14 | 15 | /** 16 | * User: Quinten 17 | * Date: 6-9-2014 18 | * Time: 01:43 19 | * 20 | * @author Quinten De Swaef 21 | */ 22 | @Service 23 | public class LoggingService { 24 | 25 | @Autowired 26 | private LogMessageRepository logMessageRepository; 27 | 28 | @Autowired 29 | private EventBus r; 30 | 31 | @Transactional(readOnly = true) 32 | public List findAll() { 33 | return logMessageRepository.findAll(); 34 | } 35 | @Transactional 36 | public void log(LogCategory category, String message) { 37 | LogMessage save = logMessageRepository.save( 38 | new LogMessage() 39 | .setLogDate(new Date()) 40 | .setText(message) 41 | .setCategory(category) 42 | ); 43 | r.notify("log.created", Event.wrap(save)); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | debug=true 2 | spring.thymeleaf.cache=false 3 | error.whitelabel.enabled=false 4 | 5 | info.app.name=Spring Reactor Example 6 | info.app.description=An example on how to use Spring Reactor with Spring Boot 7 | info.app.version=1.0.0 -------------------------------------------------------------------------------- /src/main/resources/static/css/font/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/css/font/FontAwesome.otf -------------------------------------------------------------------------------- /src/main/resources/static/css/font/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/css/font/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/css/font/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/css/font/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/css/font/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/css/font/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/css/ie7.css: -------------------------------------------------------------------------------- 1 | /* 2 | Verti 2.5 by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /*********************************************************************************/ 8 | /* Basic */ 9 | /*********************************************************************************/ 10 | 11 | .image-left img 12 | { 13 | display: inline; 14 | width: auto; 15 | } 16 | 17 | /*********************************************************************************/ 18 | /* Logo */ 19 | /*********************************************************************************/ 20 | 21 | #logo 22 | { 23 | } 24 | 25 | #logo a 26 | { 27 | color: #fff; 28 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/ie8.css: -------------------------------------------------------------------------------- 1 | /* 2 | Verti 2.5 by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /*********************************************************************************/ 8 | /* Basic */ 9 | /*********************************************************************************/ 10 | 11 | body 12 | { 13 | background: none; 14 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/images/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/css/images/bg.jpg -------------------------------------------------------------------------------- /src/main/resources/static/css/images/bgshadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/css/images/bgshadow.png -------------------------------------------------------------------------------- /src/main/resources/static/css/images/mobileUI-site-nav-opener-bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/main/resources/static/css/skel-noscript.css: -------------------------------------------------------------------------------- 1 | /* Resets (http://meyerweb.com/eric/tools/css/reset/ | v2.0 | 20110126 | License: none (public domain)) */ 2 | 3 | html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}table{border-collapse:collapse;border-spacing:0;}body{-webkit-text-size-adjust:none} 4 | 5 | /* Box Model */ 6 | 7 | *, *:before, *:after { 8 | -moz-box-sizing: border-box; 9 | -webkit-box-sizing: border-box; 10 | -o-box-sizing: border-box; 11 | -ms-box-sizing: border-box; 12 | box-sizing: border-box; 13 | } 14 | 15 | /* Container */ 16 | 17 | body { 18 | min-width: 1200px; 19 | } 20 | 21 | .container { 22 | width: 1200px; 23 | margin-left: auto; 24 | margin-right: auto; 25 | } 26 | 27 | /* Modifiers */ 28 | 29 | .container.small { 30 | width: 900px; 31 | } 32 | 33 | .container.big { 34 | width: 100%; 35 | max-width: 1500px; 36 | min-width: 1200px; 37 | } 38 | 39 | /* Grid */ 40 | 41 | /* Cells */ 42 | 43 | .\31 2u { width: 100% } 44 | .\31 1u { width: 91.6666666667% } 45 | .\31 0u { width: 83.3333333333% } 46 | .\39 u { width: 75% } 47 | .\38 u { width: 66.6666666667% } 48 | .\37 u { width: 58.3333333333% } 49 | .\36 u { width: 50% } 50 | .\35 u { width: 41.6666666667% } 51 | .\34 u { width: 33.3333333333% } 52 | .\33 u { width: 25% } 53 | .\32 u { width: 16.6666666667% } 54 | .\31 u { width: 8.3333333333% } 55 | .\-11u { margin-left: 91.6666666667% } 56 | .\-10u { margin-left: 83.3333333333% } 57 | .\-9u { margin-left: 75% } 58 | .\-8u { margin-left: 66.6666666667% } 59 | .\-7u { margin-left: 58.3333333333% } 60 | .\-6u { margin-left: 50% } 61 | .\-5u { margin-left: 41.6666666667% } 62 | .\-4u { margin-left: 33.3333333333% } 63 | .\-3u { margin-left: 25% } 64 | .\-2u { margin-left: 16.6666666667% } 65 | .\-1u { margin-left: 8.3333333333% } 66 | 67 | .row > * { 68 | padding: 40px 0 0 40px; 69 | float: left; 70 | -moz-box-sizing: border-box; 71 | -webkit-box-sizing: border-box; 72 | -o-box-sizing: border-box; 73 | -ms-box-sizing: border-box; 74 | box-sizing: border-box; 75 | } 76 | 77 | .row + .row > * { 78 | padding-top: 40px; 79 | } 80 | 81 | .row { 82 | margin-left: -40px; 83 | } 84 | 85 | /* Rows */ 86 | 87 | .row:after { 88 | content: ''; 89 | display: block; 90 | clear: both; 91 | height: 0; 92 | } 93 | 94 | .row:first-child > * { 95 | padding-top: 0; 96 | } 97 | 98 | .row > * { 99 | padding-top: 0; 100 | } 101 | 102 | /* Modifiers */ 103 | 104 | /* Flush */ 105 | 106 | .row.flush { 107 | margin-left: 0; 108 | } 109 | 110 | .row.flush > * { 111 | padding: 0 !important; 112 | } 113 | 114 | /* Quarter */ 115 | 116 | .row.quarter > * { 117 | padding: 10px 0 0 10px; 118 | } 119 | 120 | .row.quarter + .row.quarter > * { 121 | padding-top: 10px; 122 | } 123 | 124 | .row.quarter { 125 | margin-left: -10px; 126 | } 127 | 128 | /* Half */ 129 | 130 | .row.half > * { 131 | padding: 20px 0 0 20px; 132 | } 133 | 134 | .row.half + .row.half > * { 135 | padding-top: 20px; 136 | } 137 | 138 | .row.half { 139 | margin-left: -20px; 140 | } 141 | 142 | /* One and (a) Half */ 143 | 144 | .row.oneandhalf > * { 145 | padding: 60px 0 0 60px; 146 | } 147 | 148 | .row.oneandhalf + .row.oneandhalf > * { 149 | padding-top: 60px; 150 | } 151 | 152 | .row.oneandhalf { 153 | margin-left: -60px; 154 | } 155 | 156 | /* Double */ 157 | 158 | .row.double > * { 159 | padding: 80px 0 0 80px; 160 | } 161 | 162 | .row.double + .row.double > * { 163 | padding-top: 80px; 164 | } 165 | 166 | .row.double { 167 | margin-left: -80px; 168 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/style-1000px.css: -------------------------------------------------------------------------------- 1 | /* 2 | Verti 2.5 by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /*********************************************************************************/ 8 | /* Basic */ 9 | /*********************************************************************************/ 10 | 11 | body 12 | { 13 | line-height: 1.75em; 14 | font-size: 10.75pt; 15 | min-width: 960px; 16 | } 17 | 18 | ul.style2 19 | { 20 | } 21 | 22 | ul.style2 li 23 | { 24 | line-height: 2.25em; 25 | } 26 | 27 | .button 28 | { 29 | padding: 1em 1.5em 1em 1.5em; 30 | } 31 | 32 | .button.big 33 | { 34 | font-size: 2.25em; 35 | padding: 0.85em 1em 0.85em 1em; 36 | } 37 | 38 | /*********************************************************************************/ 39 | /* Wrappers */ 40 | /*********************************************************************************/ 41 | 42 | #header-wrapper 43 | { 44 | padding: 2em 0 0 0; 45 | } 46 | 47 | #features-wrapper 48 | { 49 | padding: 1.75em 0 1.75em 0; 50 | } 51 | 52 | #main-wrapper 53 | { 54 | padding: 4em 0 4em 0; 55 | } 56 | 57 | #footer-wrapper 58 | { 59 | padding: 4em 0 6em 0; 60 | } 61 | 62 | /*********************************************************************************/ 63 | /* Logo */ 64 | /*********************************************************************************/ 65 | 66 | #logo 67 | { 68 | } 69 | 70 | #logo h1 71 | { 72 | margin-top: 0.15em; 73 | } 74 | 75 | /*********************************************************************************/ 76 | /* Banner */ 77 | /*********************************************************************************/ 78 | 79 | #banner 80 | { 81 | } 82 | 83 | #banner h2 84 | { 85 | font-size: 3.4em; 86 | margin: 0.2em 0 0.5em 0; 87 | } 88 | 89 | #banner p 90 | { 91 | font-size: 2.25em; 92 | } 93 | 94 | /*********************************************************************************/ 95 | /* Footer */ 96 | /*********************************************************************************/ 97 | 98 | #copyright 99 | { 100 | padding: 2em 0 0 0; 101 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/style-desktop.css: -------------------------------------------------------------------------------- 1 | /* 2 | Verti 2.5 by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /*********************************************************************************/ 8 | /* Basic */ 9 | /*********************************************************************************/ 10 | 11 | body 12 | { 13 | min-width: 1200px; 14 | line-height: 2.25em; 15 | min-height: 100%; 16 | } 17 | 18 | h1, h2, h3, h4, h5, h6 19 | { 20 | color: #444; 21 | font-weight: 800; 22 | } 23 | 24 | h2 25 | { 26 | font-size: 2.25em; 27 | margin: 0 0 1.1em 0; 28 | line-height: 1em; 29 | } 30 | 31 | h3 32 | { 33 | font-size: 1.35em; 34 | margin: 0 0 2.25em 0; 35 | } 36 | 37 | .pad-right 38 | { 39 | margin-right: 1.5em; 40 | } 41 | 42 | .pad-left 43 | { 44 | margin-left: 1.5em; 45 | } 46 | 47 | body.left-sidebar, 48 | body.homepage 49 | { 50 | } 51 | 52 | body.left-sidebar #content, 53 | body.homepage #content 54 | { 55 | padding-left: 1.75em; 56 | } 57 | 58 | body.right-sidebar 59 | { 60 | } 61 | 62 | body.right-sidebar #content 63 | { 64 | padding-right: 1.75em; 65 | } 66 | 67 | .button 68 | { 69 | font-size: 1.35em; 70 | padding: 0.8em 1.5em 0.8em 1.5em; 71 | } 72 | 73 | .button.big 74 | { 75 | font-size: 2.25em; 76 | padding: 0.8em 0.9em 0.8em 0.9em; 77 | } 78 | 79 | .button.fa 80 | { 81 | } 82 | 83 | .button.fa:before 84 | { 85 | margin-right: 0.5em; 86 | top: 0.05em; 87 | } 88 | 89 | .box 90 | { 91 | padding: 2em; 92 | } 93 | 94 | .box-feature 95 | { 96 | padding: 0; 97 | } 98 | 99 | .box-feature .inner 100 | { 101 | padding: 4em 2em 3em 2em; 102 | } 103 | 104 | .box-feature h2 105 | { 106 | font-size: 1.35em; 107 | } 108 | 109 | .box-feature p 110 | { 111 | margin: 0; 112 | } 113 | 114 | .box-feature .image 115 | { 116 | position: relative; 117 | margin: 0; 118 | } 119 | 120 | .box-feature .image img 121 | { 122 | border-bottom-left-radius: 0; 123 | border-bottom-right-radius: 0; 124 | } 125 | 126 | /*********************************************************************************/ 127 | /* Widgets */ 128 | /*********************************************************************************/ 129 | 130 | .widget-thumbnails 131 | { 132 | } 133 | 134 | .widget-thumbnails .grid 135 | { 136 | margin: 0 0 3em 0; 137 | } 138 | 139 | .widget-thumbnails .image 140 | { 141 | margin: 0; 142 | } 143 | 144 | /*********************************************************************************/ 145 | /* Wrappers */ 146 | /*********************************************************************************/ 147 | 148 | #header-wrapper 149 | { 150 | padding: 4.5em 0 1em 0; 151 | } 152 | 153 | #features-wrapper 154 | { 155 | padding: 3em 0 3em 0; 156 | } 157 | 158 | #main-wrapper 159 | { 160 | padding: 5em 0 5em 0; 161 | } 162 | 163 | #footer-wrapper 164 | { 165 | padding: 6em 0 8em 0; 166 | } 167 | 168 | /*********************************************************************************/ 169 | /* Logo */ 170 | /*********************************************************************************/ 171 | 172 | #logo 173 | { 174 | } 175 | 176 | #logo h1 177 | { 178 | float: left; 179 | margin: 0 0.35em 0 0; 180 | padding: 0.25em 0.2em 0.25em 0.2em; 181 | font-size: 3.25em; 182 | letter-spacing: 0.05em; 183 | } 184 | 185 | #logo span 186 | { 187 | line-height: 4.5em; 188 | letter-spacing: 0.025em; 189 | font-size: 0.9em; 190 | } 191 | 192 | /*********************************************************************************/ 193 | /* Nav */ 194 | /*********************************************************************************/ 195 | 196 | #nav 197 | { 198 | position: absolute; 199 | right: 0; 200 | top: 0; 201 | font-size: 0.9em; 202 | } 203 | 204 | #nav ul 205 | { 206 | } 207 | 208 | #nav ul li 209 | { 210 | float: left; 211 | line-height: 4.5em; 212 | padding-left: 1.5em; 213 | } 214 | 215 | #nav ul li a 216 | { 217 | font-weight: 800; 218 | letter-spacing: 0.025em; 219 | color: #696969; 220 | text-decoration: none; 221 | border-radius: 6px; 222 | padding: 0.5em 1em 0.5em 1em; 223 | -moz-transition: background-color .25s ease-in-out; 224 | -webkit-transition: background-color .25s ease-in-out; 225 | -o-transition: background-color .25s ease-in-out; 226 | -ms-transition: background-color .25s ease-in-out; 227 | transition: background-color .25s ease-in-out; 228 | } 229 | 230 | #nav ul li:hover 231 | { 232 | } 233 | 234 | #nav ul li:hover a 235 | { 236 | background: rgba(255,255,255,0.5); 237 | } 238 | 239 | #nav ul li.current_page_item 240 | { 241 | } 242 | 243 | #nav ul li.current_page_item a 244 | { 245 | background: #444; 246 | color: #fff; 247 | } 248 | 249 | /*********************************************************************************/ 250 | /* Banner */ 251 | /*********************************************************************************/ 252 | 253 | #banner 254 | { 255 | padding: 6.25% 6.25% 3.5% 6.25%; 256 | } 257 | 258 | #banner h2 259 | { 260 | font-size: 3.5em; 261 | margin: 0.1em 0 0.35em 0; 262 | } 263 | 264 | #banner p 265 | { 266 | font-size: 2.75em; 267 | line-height: 1.35em; 268 | margin: 0; 269 | } 270 | 271 | #banner .button 272 | { 273 | width: 100%; 274 | margin-bottom: 0.5em; 275 | } 276 | 277 | #banner .button.fa:before 278 | { 279 | position: absolute; 280 | right: 0.15em; 281 | top: 50%; 282 | margin-top: -0.5em; 283 | } 284 | 285 | #banner .button.alt 286 | { 287 | margin-bottom: 0; 288 | } 289 | 290 | #banner ul 291 | { 292 | margin-left: 2em; 293 | } 294 | 295 | /*********************************************************************************/ 296 | /* Content */ 297 | /*********************************************************************************/ 298 | 299 | #content 300 | { 301 | } 302 | 303 | #content h3 304 | { 305 | margin-top: 2.25em; 306 | } 307 | 308 | /*********************************************************************************/ 309 | /* Footer */ 310 | /*********************************************************************************/ 311 | 312 | #footer 313 | { 314 | } 315 | 316 | #footer h2 317 | { 318 | font-size: 1.35em; 319 | } 320 | 321 | #copyright 322 | { 323 | padding: 4em 0 0 0; 324 | text-align: center; 325 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/style-mobile.css: -------------------------------------------------------------------------------- 1 | /* 2 | Verti 2.5 by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /*********************************************************************************/ 8 | /* Basic */ 9 | /*********************************************************************************/ 10 | 11 | body 12 | { 13 | line-height: 1.75em; 14 | font-size: 10pt; 15 | letter-spacing: 0; 16 | min-width: 320px; 17 | } 18 | 19 | h2, h3, h4, h5, h6 20 | { 21 | font-size: 13pt; 22 | margin: 0 0 1em 0; 23 | } 24 | 25 | section, 26 | article 27 | { 28 | clear: both; 29 | margin-bottom: 3em !important; 30 | } 31 | 32 | section.last, 33 | article.last 34 | { 35 | margin-bottom: 0 !important; 36 | } 37 | 38 | .image-left 39 | { 40 | width: 25%; 41 | margin-bottom: 2em !important; 42 | } 43 | 44 | .button 45 | { 46 | width: 100%; 47 | text-align: center; 48 | font-size: 1.35em; 49 | padding: 1.1em 0 1.1em 0 !important; 50 | } 51 | 52 | .button.fa 53 | { 54 | padding-right: 0.75em !important; 55 | } 56 | 57 | .button.fa:before 58 | { 59 | margin-right: 0.5em; 60 | top: 0.05em; 61 | } 62 | 63 | .box 64 | { 65 | padding: 15px 15px 15px 15px; 66 | margin: 0; 67 | } 68 | 69 | .box-feature 70 | { 71 | margin: 20px 0 0 0 !important; 72 | padding: 0; 73 | } 74 | 75 | .box-feature .inner 76 | { 77 | padding: 30px 15px 30px 15px; 78 | } 79 | 80 | .box-feature p 81 | { 82 | margin: 0; 83 | } 84 | 85 | .box-feature .image 86 | { 87 | position: relative; 88 | margin: 0; 89 | } 90 | 91 | .box-feature .image img 92 | { 93 | border-bottom-left-radius: 0; 94 | border-bottom-right-radius: 0; 95 | } 96 | 97 | /*********************************************************************************/ 98 | /* Widgets */ 99 | /*********************************************************************************/ 100 | 101 | .widget-thumbnails 102 | { 103 | } 104 | 105 | .widget-thumbnails .image 106 | { 107 | margin: 0; 108 | } 109 | 110 | .widget-thumbnails .x 111 | { 112 | padding: 1em 0.5em 0 0; 113 | } 114 | 115 | .widget-thumbnails .y 116 | { 117 | padding: 1em 0 0 0.5em; 118 | } 119 | 120 | .widget-thumbnails .row:first-child .x, 121 | .widget-thumbnails .row:first-child .y 122 | { 123 | padding-top: 0; 124 | } 125 | 126 | /*********************************************************************************/ 127 | /* Mobile UI */ 128 | /*********************************************************************************/ 129 | 130 | #titleBar 131 | { 132 | } 133 | 134 | #titleBar .title 135 | { 136 | display: none; 137 | } 138 | 139 | #titleBar .toggle 140 | { 141 | text-indent: -9999px; 142 | width: 70px; 143 | height: 50px; 144 | opacity: 0.35; 145 | } 146 | 147 | #titleBar .toggle:before 148 | { 149 | content: ''; 150 | position: absolute; 151 | left: 6px; 152 | top: 6px; 153 | background: rgba(0,0,0,0.5); 154 | width: 58px; 155 | height: 38px; 156 | border-radius: 6px; 157 | } 158 | 159 | #titleBar .toggle:after 160 | { 161 | content: ''; 162 | position: absolute; 163 | left: 21px; 164 | top: 20px; 165 | width: 44px; 166 | height: 44px; 167 | background: url('images/mobileUI-site-nav-opener-bg.svg') 0 0 no-repeat; 168 | } 169 | 170 | #titleBar .toggle:active 171 | { 172 | opacity: 0.75; 173 | } 174 | 175 | #navPanel 176 | { 177 | background: #fff; 178 | box-shadow: inset -3px 0px 0px 0px #dfdfdf; 179 | padding: 0 23px 0 20px; 180 | } 181 | 182 | #navPanel .link 183 | { 184 | display: block; 185 | text-decoration: none; 186 | height: 54px; 187 | line-height: 54px; 188 | border-top: solid 1px #e8e8e8; 189 | font-weight: 800; 190 | } 191 | 192 | #navPanel .link:first-child 193 | { 194 | border-top: 0; 195 | } 196 | 197 | /*********************************************************************************/ 198 | /* Wrappers */ 199 | /*********************************************************************************/ 200 | 201 | #header-wrapper 202 | { 203 | padding: 44px 0 0px 0; 204 | } 205 | 206 | #banner-wrapper 207 | { 208 | padding: 0 15px 0 15px; 209 | } 210 | 211 | #features-wrapper 212 | { 213 | padding: 0 15px 40px 15px; 214 | } 215 | 216 | #main-wrapper 217 | { 218 | padding: 40px 30px 40px 30px; 219 | } 220 | 221 | #footer-wrapper 222 | { 223 | padding: 40px 30px 40px 30px; 224 | } 225 | 226 | /*********************************************************************************/ 227 | /* Logo */ 228 | /*********************************************************************************/ 229 | 230 | #logo 231 | { 232 | text-align: center; 233 | } 234 | 235 | #logo h1 236 | { 237 | display: inline-block; 238 | margin: 0 0 0.2em 0; 239 | padding: 0.25em 0.2em 0.25em 0.2em; 240 | font-size: 3.25em; 241 | letter-spacing: 0.05em; 242 | } 243 | 244 | #logo span 245 | { 246 | display: block; 247 | letter-spacing: 0.025em; 248 | font-size: 0.9em; 249 | margin: 0; 250 | } 251 | 252 | /*********************************************************************************/ 253 | /* Nav */ 254 | /*********************************************************************************/ 255 | 256 | #nav 257 | { 258 | display: none; 259 | } 260 | 261 | /*********************************************************************************/ 262 | /* Banner */ 263 | /*********************************************************************************/ 264 | 265 | #banner 266 | { 267 | text-align: center; 268 | } 269 | 270 | #banner h2 271 | { 272 | font-size: 2em; 273 | margin: 0.75em 0 0.5em 0; 274 | } 275 | 276 | #banner p 277 | { 278 | font-size: 1.5em; 279 | line-height: 1.5em; 280 | margin: 0; 281 | } 282 | 283 | #banner ul 284 | { 285 | margin: 0; 286 | } 287 | 288 | #banner .button 289 | { 290 | margin: 1em 0 0 0; 291 | } 292 | 293 | /*********************************************************************************/ 294 | /* Content */ 295 | /*********************************************************************************/ 296 | 297 | #content 298 | { 299 | } 300 | 301 | body.left-sidebar #content, 302 | body.right-sidebar #content 303 | { 304 | border-bottom: solid 1px #e8e8e8; 305 | padding-bottom: 3em; 306 | margin-bottom: 3em !important; 307 | } 308 | 309 | /*********************************************************************************/ 310 | /* Footer */ 311 | /*********************************************************************************/ 312 | 313 | #footer 314 | { 315 | } 316 | 317 | #footer section 318 | { 319 | border-bottom: solid 1px #ccc; 320 | padding-bottom: 2em; 321 | margin-bottom: 2em !important; 322 | } 323 | 324 | #footer section.last 325 | { 326 | padding-bottom: 0; 327 | border-bottom: 0; 328 | margin-bottom: 0 !important; 329 | } 330 | 331 | #copyright 332 | { 333 | padding: 2em 0 0 0; 334 | border-top: solid 1px #ccc; 335 | margin: 4em 0 0 0; 336 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/style.css: -------------------------------------------------------------------------------- 1 | @charset 'UTF-8'; 2 | 3 | @font-face{font-family:'FontAwesome';src:url('font/fontawesome-webfont.eot?v=4.0.1');src:url('font/fontawesome-webfont.eot?#iefix&v=4.0.1') format('embedded-opentype'),url('font/fontawesome-webfont.woff?v=4.0.1') format('woff'),url('font/fontawesome-webfont.ttf?v=4.0.1') format('truetype'),url('font/fontawesome-webfont.svg?v=4.0.1#fontawesomeregular') format('svg');font-weight:normal;font-style:normal} 4 | 5 | /* 6 | Verti 2.5 by HTML5 UP 7 | html5up.net | @n33co 8 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 9 | */ 10 | 11 | /*********************************************************************************/ 12 | /* Basic */ 13 | /*********************************************************************************/ 14 | 15 | * 16 | { 17 | -moz-box-sizing: border-box; 18 | -webkit-box-sizing: border-box; 19 | -o-box-sizing: border-box; 20 | -ms-box-sizing: border-box; 21 | box-sizing: border-box; 22 | } 23 | 24 | html 25 | { 26 | background: #f7f7f7 url('images/bg.jpg'); 27 | height: 100%; 28 | } 29 | 30 | body 31 | { 32 | font-family: 'Open Sans', sans-serif; 33 | font-size: 12pt; 34 | color: #696969; 35 | font-weight: 300; 36 | background: url('images/bgshadow.png') top left no-repeat; 37 | background-size: 100% 100%; 38 | } 39 | 40 | a 41 | { 42 | color: #0090c5; 43 | text-decoration: underline; 44 | } 45 | 46 | a:hover 47 | { 48 | text-decoration: none; 49 | } 50 | 51 | h1, h2, h3, h4, h5, h6 52 | { 53 | color: #444; 54 | font-weight: 800; 55 | } 56 | 57 | h1 a, h2 a, h3 a, h4 a, h5 a, h6 a 58 | { 59 | color: inherit; 60 | text-decoration: none; 61 | outline: 0; 62 | } 63 | 64 | strong 65 | { 66 | } 67 | 68 | form 69 | { 70 | } 71 | 72 | form input, 73 | form select, 74 | form textarea 75 | { 76 | -webkit-appearance: none; 77 | } 78 | 79 | br.clear 80 | { 81 | clear: both; 82 | } 83 | 84 | p, ul, ol, dl, table 85 | { 86 | margin-bottom: 2em; 87 | } 88 | 89 | section, 90 | article 91 | { 92 | margin-bottom: 5em; 93 | } 94 | 95 | section > :last-child, 96 | article > :last-child 97 | { 98 | margin-bottom: 0; 99 | } 100 | 101 | section:last-child, 102 | article:last-child 103 | { 104 | margin-bottom: 0; 105 | } 106 | 107 | .image 108 | { 109 | display: inline-block; 110 | outline: 0; 111 | } 112 | 113 | .image img 114 | { 115 | display: block; 116 | width: 100%; 117 | border-radius: 8px; 118 | } 119 | 120 | .image-full 121 | { 122 | display: block; 123 | width: 100%; 124 | margin: 0 0 2.5em 0; 125 | } 126 | 127 | .image-left 128 | { 129 | float: left; 130 | margin: 0 2em 2em 0; 131 | } 132 | 133 | .image-centered 134 | { 135 | display: block; 136 | margin: 0 0 2.5em 0; 137 | } 138 | 139 | .image-centered img 140 | { 141 | margin: 0 auto; 142 | width: auto; 143 | } 144 | 145 | .button 146 | { 147 | position: relative; 148 | display: inline-block; 149 | background: #0090c5; 150 | color: #fff; 151 | text-decoration: none; 152 | border-radius: 6px; 153 | font-weight: 800; 154 | outline: 0; 155 | -moz-transition: background-color .25s ease-in-out; 156 | -webkit-transition: background-color .25s ease-in-out; 157 | -o-transition: background-color .25s ease-in-out; 158 | -ms-transition: background-color .25s ease-in-out; 159 | transition: background-color .25s ease-in-out; 160 | } 161 | 162 | .button:hover 163 | { 164 | background: #10a0d5; 165 | } 166 | 167 | .button:active 168 | { 169 | background: #20b0e5; 170 | } 171 | 172 | .button.fa 173 | { 174 | } 175 | 176 | .button.fa:before 177 | { 178 | position: relative; 179 | } 180 | 181 | .button.alt 182 | { 183 | background: #f1f1f1; 184 | color: #444; 185 | } 186 | 187 | .button.alt:hover 188 | { 189 | background: #e8e8e8; 190 | } 191 | 192 | .button.alt:active 193 | { 194 | background: #e4e4e4; 195 | } 196 | 197 | ul.style1 198 | { 199 | } 200 | 201 | ul.style2 202 | { 203 | } 204 | 205 | ul.style2 li 206 | { 207 | } 208 | 209 | ol.style1 210 | { 211 | } 212 | 213 | .byline 214 | { 215 | display: block; 216 | } 217 | 218 | header 219 | { 220 | margin: 0 0 2em 0; 221 | } 222 | 223 | header h2, header h3 224 | { 225 | margin: 0 0 0.25em 0; 226 | } 227 | 228 | header .byline 229 | { 230 | margin: 0; 231 | } 232 | 233 | footer 234 | { 235 | margin: 2.5em 0 0 0; 236 | } 237 | 238 | .box 239 | { 240 | background: #fff; 241 | border-radius: 6px; 242 | box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.015); 243 | box-shadow: 0px 3px 0px 0px rgba(0,0,0,0.05); 244 | } 245 | 246 | /*********************************************************************************/ 247 | /* Icons */ 248 | /* Powered by Font Awesome by Dave Gandy | http://fontawesome.io */ 249 | /* Licensed under the SIL OFL 1.1 (font), MIT (CSS) */ 250 | /*********************************************************************************/ 251 | 252 | .fa 253 | { 254 | text-decoration: none; 255 | } 256 | 257 | .fa.solo 258 | { 259 | } 260 | 261 | .fa.solo span 262 | { 263 | display: none; 264 | } 265 | 266 | .fa:before 267 | { 268 | display:inline-block; 269 | font-family: FontAwesome; 270 | font-size: 1.25em; 271 | text-decoration: none; 272 | font-style: normal; 273 | font-weight: normal; 274 | line-height: 1; 275 | -webkit-font-smoothing:antialiased; 276 | -moz-osx-font-smoothing:grayscale; 277 | } 278 | 279 | .fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%} 280 | .fa-2x{font-size:2em} 281 | .fa-3x{font-size:3em} 282 | .fa-4x{font-size:4em} 283 | .fa-5x{font-size:5em} 284 | .fa-fw{width:1.2857142857142858em;text-align:center} 285 | .fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative} 286 | .fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em} 287 | .fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em} 288 | .pull-right{float:right} 289 | .pull-left{float:left} 290 | .fa.pull-left{margin-right:.3em} 291 | .fa.pull-right{margin-left:.3em} 292 | .fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear} 293 | @-moz-keyframes spin{0%{-moz-transform:rotate(0deg)} 100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)} 100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)} 100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)} 100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)} 100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)} 294 | .fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)} 295 | .fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)} 296 | .fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)} 297 | .fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)} 298 | .fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle} 299 | .fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center} 300 | .fa-stack-1x{line-height:inherit} 301 | .fa-stack-2x{font-size:2em} 302 | .fa-inverse{color:#fff} 303 | .fa-glass:before{content:"\f000"} 304 | .fa-music:before{content:"\f001"} 305 | .fa-search:before{content:"\f002"} 306 | .fa-envelope-o:before{content:"\f003"} 307 | .fa-heart:before{content:"\f004"} 308 | .fa-star:before{content:"\f005"} 309 | .fa-star-o:before{content:"\f006"} 310 | .fa-user:before{content:"\f007"} 311 | .fa-film:before{content:"\f008"} 312 | .fa-th-large:before{content:"\f009"} 313 | .fa-th:before{content:"\f00a"} 314 | .fa-th-list:before{content:"\f00b"} 315 | .fa-check:before{content:"\f00c"} 316 | .fa-times:before{content:"\f00d"} 317 | .fa-search-plus:before{content:"\f00e"} 318 | .fa-search-minus:before{content:"\f010"} 319 | .fa-power-off:before{content:"\f011"} 320 | .fa-signal:before{content:"\f012"} 321 | .fa-gear:before,.fa-cog:before{content:"\f013"} 322 | .fa-trash-o:before{content:"\f014"} 323 | .fa-home:before{content:"\f015"} 324 | .fa-file-o:before{content:"\f016"} 325 | .fa-clock-o:before{content:"\f017"} 326 | .fa-road:before{content:"\f018"} 327 | .fa-download:before{content:"\f019"} 328 | .fa-arrow-circle-o-down:before{content:"\f01a"} 329 | .fa-arrow-circle-o-up:before{content:"\f01b"} 330 | .fa-inbox:before{content:"\f01c"} 331 | .fa-play-circle-o:before{content:"\f01d"} 332 | .fa-rotate-right:before,.fa-repeat:before{content:"\f01e"} 333 | .fa-refresh:before{content:"\f021"} 334 | .fa-list-alt:before{content:"\f022"} 335 | .fa-lock:before{content:"\f023"} 336 | .fa-flag:before{content:"\f024"} 337 | .fa-headphones:before{content:"\f025"} 338 | .fa-volume-off:before{content:"\f026"} 339 | .fa-volume-down:before{content:"\f027"} 340 | .fa-volume-up:before{content:"\f028"} 341 | .fa-qrcode:before{content:"\f029"} 342 | .fa-barcode:before{content:"\f02a"} 343 | .fa-tag:before{content:"\f02b"} 344 | .fa-tags:before{content:"\f02c"} 345 | .fa-book:before{content:"\f02d"} 346 | .fa-bookmark:before{content:"\f02e"} 347 | .fa-print:before{content:"\f02f"} 348 | .fa-camera:before{content:"\f030"} 349 | .fa-font:before{content:"\f031"} 350 | .fa-bold:before{content:"\f032"} 351 | .fa-italic:before{content:"\f033"} 352 | .fa-text-height:before{content:"\f034"} 353 | .fa-text-width:before{content:"\f035"} 354 | .fa-align-left:before{content:"\f036"} 355 | .fa-align-center:before{content:"\f037"} 356 | .fa-align-right:before{content:"\f038"} 357 | .fa-align-justify:before{content:"\f039"} 358 | .fa-list:before{content:"\f03a"} 359 | .fa-dedent:before,.fa-outdent:before{content:"\f03b"} 360 | .fa-indent:before{content:"\f03c"} 361 | .fa-video-camera:before{content:"\f03d"} 362 | .fa-picture-o:before{content:"\f03e"} 363 | .fa-pencil:before{content:"\f040"} 364 | .fa-map-marker:before{content:"\f041"} 365 | .fa-adjust:before{content:"\f042"} 366 | .fa-tint:before{content:"\f043"} 367 | .fa-edit:before,.fa-pencil-square-o:before{content:"\f044"} 368 | .fa-share-square-o:before{content:"\f045"} 369 | .fa-check-square-o:before{content:"\f046"} 370 | .fa-move:before{content:"\f047"} 371 | .fa-step-backward:before{content:"\f048"} 372 | .fa-fast-backward:before{content:"\f049"} 373 | .fa-backward:before{content:"\f04a"} 374 | .fa-play:before{content:"\f04b"} 375 | .fa-pause:before{content:"\f04c"} 376 | .fa-stop:before{content:"\f04d"} 377 | .fa-forward:before{content:"\f04e"} 378 | .fa-fast-forward:before{content:"\f050"} 379 | .fa-step-forward:before{content:"\f051"} 380 | .fa-eject:before{content:"\f052"} 381 | .fa-chevron-left:before{content:"\f053"} 382 | .fa-chevron-right:before{content:"\f054"} 383 | .fa-plus-circle:before{content:"\f055"} 384 | .fa-minus-circle:before{content:"\f056"} 385 | .fa-times-circle:before{content:"\f057"} 386 | .fa-check-circle:before{content:"\f058"} 387 | .fa-question-circle:before{content:"\f059"} 388 | .fa-info-circle:before{content:"\f05a"} 389 | .fa-crosshairs:before{content:"\f05b"} 390 | .fa-times-circle-o:before{content:"\f05c"} 391 | .fa-check-circle-o:before{content:"\f05d"} 392 | .fa-ban:before{content:"\f05e"} 393 | .fa-arrow-left:before{content:"\f060"} 394 | .fa-arrow-right:before{content:"\f061"} 395 | .fa-arrow-up:before{content:"\f062"} 396 | .fa-arrow-down:before{content:"\f063"} 397 | .fa-mail-forward:before,.fa-share:before{content:"\f064"} 398 | .fa-resize-full:before{content:"\f065"} 399 | .fa-resize-small:before{content:"\f066"} 400 | .fa-plus:before{content:"\f067"} 401 | .fa-minus:before{content:"\f068"} 402 | .fa-asterisk:before{content:"\f069"} 403 | .fa-exclamation-circle:before{content:"\f06a"} 404 | .fa-gift:before{content:"\f06b"} 405 | .fa-leaf:before{content:"\f06c"} 406 | .fa-fire:before{content:"\f06d"} 407 | .fa-eye:before{content:"\f06e"} 408 | .fa-eye-slash:before{content:"\f070"} 409 | .fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"} 410 | .fa-plane:before{content:"\f072"} 411 | .fa-calendar:before{content:"\f073"} 412 | .fa-random:before{content:"\f074"} 413 | .fa-comment:before{content:"\f075"} 414 | .fa-magnet:before{content:"\f076"} 415 | .fa-chevron-up:before{content:"\f077"} 416 | .fa-chevron-down:before{content:"\f078"} 417 | .fa-retweet:before{content:"\f079"} 418 | .fa-shopping-cart:before{content:"\f07a"} 419 | .fa-folder:before{content:"\f07b"} 420 | .fa-folder-open:before{content:"\f07c"} 421 | .fa-resize-vertical:before{content:"\f07d"} 422 | .fa-resize-horizontal:before{content:"\f07e"} 423 | .fa-bar-chart-o:before{content:"\f080"} 424 | .fa-twitter-square:before{content:"\f081"} 425 | .fa-facebook-square:before{content:"\f082"} 426 | .fa-camera-retro:before{content:"\f083"} 427 | .fa-key:before{content:"\f084"} 428 | .fa-gears:before,.fa-cogs:before{content:"\f085"} 429 | .fa-comments:before{content:"\f086"} 430 | .fa-thumbs-o-up:before{content:"\f087"} 431 | .fa-thumbs-o-down:before{content:"\f088"} 432 | .fa-star-half:before{content:"\f089"} 433 | .fa-heart-o:before{content:"\f08a"} 434 | .fa-sign-out:before{content:"\f08b"} 435 | .fa-linkedin-square:before{content:"\f08c"} 436 | .fa-thumb-tack:before{content:"\f08d"} 437 | .fa-external-link:before{content:"\f08e"} 438 | .fa-sign-in:before{content:"\f090"} 439 | .fa-trophy:before{content:"\f091"} 440 | .fa-github-square:before{content:"\f092"} 441 | .fa-upload:before{content:"\f093"} 442 | .fa-lemon-o:before{content:"\f094"} 443 | .fa-phone:before{content:"\f095"} 444 | .fa-square-o:before{content:"\f096"} 445 | .fa-bookmark-o:before{content:"\f097"} 446 | .fa-phone-square:before{content:"\f098"} 447 | .fa-twitter:before{content:"\f099"} 448 | .fa-facebook:before{content:"\f09a"} 449 | .fa-github:before{content:"\f09b"} 450 | .fa-unlock:before{content:"\f09c"} 451 | .fa-credit-card:before{content:"\f09d"} 452 | .fa-rss:before{content:"\f09e"} 453 | .fa-hdd-o:before{content:"\f0a0"} 454 | .fa-bullhorn:before{content:"\f0a1"} 455 | .fa-bell:before{content:"\f0f3"} 456 | .fa-certificate:before{content:"\f0a3"} 457 | .fa-hand-o-right:before{content:"\f0a4"} 458 | .fa-hand-o-left:before{content:"\f0a5"} 459 | .fa-hand-o-up:before{content:"\f0a6"} 460 | .fa-hand-o-down:before{content:"\f0a7"} 461 | .fa-arrow-circle-left:before{content:"\f0a8"} 462 | .fa-arrow-circle-right:before{content:"\f0a9"} 463 | .fa-arrow-circle-up:before{content:"\f0aa"} 464 | .fa-arrow-circle-down:before{content:"\f0ab"} 465 | .fa-globe:before{content:"\f0ac"} 466 | .fa-wrench:before{content:"\f0ad"} 467 | .fa-tasks:before{content:"\f0ae"} 468 | .fa-filter:before{content:"\f0b0"} 469 | .fa-briefcase:before{content:"\f0b1"} 470 | .fa-fullscreen:before{content:"\f0b2"} 471 | .fa-group:before{content:"\f0c0"} 472 | .fa-chain:before,.fa-link:before{content:"\f0c1"} 473 | .fa-cloud:before{content:"\f0c2"} 474 | .fa-flask:before{content:"\f0c3"} 475 | .fa-cut:before,.fa-scissors:before{content:"\f0c4"} 476 | .fa-copy:before,.fa-files-o:before{content:"\f0c5"} 477 | .fa-paperclip:before{content:"\f0c6"} 478 | .fa-save:before,.fa-floppy-o:before{content:"\f0c7"} 479 | .fa-square:before{content:"\f0c8"} 480 | .fa-reorder:before{content:"\f0c9"} 481 | .fa-list-ul:before{content:"\f0ca"} 482 | .fa-list-ol:before{content:"\f0cb"} 483 | .fa-strikethrough:before{content:"\f0cc"} 484 | .fa-underline:before{content:"\f0cd"} 485 | .fa-table:before{content:"\f0ce"} 486 | .fa-magic:before{content:"\f0d0"} 487 | .fa-truck:before{content:"\f0d1"} 488 | .fa-pinterest:before{content:"\f0d2"} 489 | .fa-pinterest-square:before{content:"\f0d3"} 490 | .fa-google-plus-square:before{content:"\f0d4"} 491 | .fa-google-plus:before{content:"\f0d5"} 492 | .fa-money:before{content:"\f0d6"} 493 | .fa-caret-down:before{content:"\f0d7"} 494 | .fa-caret-up:before{content:"\f0d8"} 495 | .fa-caret-left:before{content:"\f0d9"} 496 | .fa-caret-right:before{content:"\f0da"} 497 | .fa-columns:before{content:"\f0db"} 498 | .fa-unsorted:before,.fa-sort:before{content:"\f0dc"} 499 | .fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"} 500 | .fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"} 501 | .fa-envelope:before{content:"\f0e0"} 502 | .fa-linkedin:before{content:"\f0e1"} 503 | .fa-rotate-left:before,.fa-undo:before{content:"\f0e2"} 504 | .fa-legal:before,.fa-gavel:before{content:"\f0e3"} 505 | .fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"} 506 | .fa-comment-o:before{content:"\f0e5"} 507 | .fa-comments-o:before{content:"\f0e6"} 508 | .fa-flash:before,.fa-bolt:before{content:"\f0e7"} 509 | .fa-sitemap:before{content:"\f0e8"} 510 | .fa-umbrella:before{content:"\f0e9"} 511 | .fa-paste:before,.fa-clipboard:before{content:"\f0ea"} 512 | .fa-lightbulb-o:before{content:"\f0eb"} 513 | .fa-exchange:before{content:"\f0ec"} 514 | .fa-cloud-download:before{content:"\f0ed"} 515 | .fa-cloud-upload:before{content:"\f0ee"} 516 | .fa-user-md:before{content:"\f0f0"} 517 | .fa-stethoscope:before{content:"\f0f1"} 518 | .fa-suitcase:before{content:"\f0f2"} 519 | .fa-bell-o:before{content:"\f0a2"} 520 | .fa-coffee:before{content:"\f0f4"} 521 | .fa-cutlery:before{content:"\f0f5"} 522 | .fa-file-text-o:before{content:"\f0f6"} 523 | .fa-building:before{content:"\f0f7"} 524 | .fa-hospital:before{content:"\f0f8"} 525 | .fa-ambulance:before{content:"\f0f9"} 526 | .fa-medkit:before{content:"\f0fa"} 527 | .fa-fighter-jet:before{content:"\f0fb"} 528 | .fa-beer:before{content:"\f0fc"} 529 | .fa-h-square:before{content:"\f0fd"} 530 | .fa-plus-square:before{content:"\f0fe"} 531 | .fa-angle-double-left:before{content:"\f100"} 532 | .fa-angle-double-right:before{content:"\f101"} 533 | .fa-angle-double-up:before{content:"\f102"} 534 | .fa-angle-double-down:before{content:"\f103"} 535 | .fa-angle-left:before{content:"\f104"} 536 | .fa-angle-right:before{content:"\f105"} 537 | .fa-angle-up:before{content:"\f106"} 538 | .fa-angle-down:before{content:"\f107"} 539 | .fa-desktop:before{content:"\f108"} 540 | .fa-laptop:before{content:"\f109"} 541 | .fa-tablet:before{content:"\f10a"} 542 | .fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"} 543 | .fa-circle-o:before{content:"\f10c"} 544 | .fa-quote-left:before{content:"\f10d"} 545 | .fa-quote-right:before{content:"\f10e"} 546 | .fa-spinner:before{content:"\f110"} 547 | .fa-circle:before{content:"\f111"} 548 | .fa-mail-reply:before,.fa-reply:before{content:"\f112"} 549 | .fa-github-alt:before{content:"\f113"} 550 | .fa-folder-o:before{content:"\f114"} 551 | .fa-folder-open-o:before{content:"\f115"} 552 | .fa-expand-o:before{content:"\f116"} 553 | .fa-collapse-o:before{content:"\f117"} 554 | .fa-smile-o:before{content:"\f118"} 555 | .fa-frown-o:before{content:"\f119"} 556 | .fa-meh-o:before{content:"\f11a"} 557 | .fa-gamepad:before{content:"\f11b"} 558 | .fa-keyboard-o:before{content:"\f11c"} 559 | .fa-flag-o:before{content:"\f11d"} 560 | .fa-flag-checkered:before{content:"\f11e"} 561 | .fa-terminal:before{content:"\f120"} 562 | .fa-code:before{content:"\f121"} 563 | .fa-reply-all:before{content:"\f122"} 564 | .fa-mail-reply-all:before{content:"\f122"} 565 | .fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"} 566 | .fa-location-arrow:before{content:"\f124"} 567 | .fa-crop:before{content:"\f125"} 568 | .fa-code-fork:before{content:"\f126"} 569 | .fa-unlink:before,.fa-chain-broken:before{content:"\f127"} 570 | .fa-question:before{content:"\f128"} 571 | .fa-info:before{content:"\f129"} 572 | .fa-exclamation:before{content:"\f12a"} 573 | .fa-superscript:before{content:"\f12b"} 574 | .fa-subscript:before{content:"\f12c"} 575 | .fa-eraser:before{content:"\f12d"} 576 | .fa-puzzle-piece:before{content:"\f12e"} 577 | .fa-microphone:before{content:"\f130"} 578 | .fa-microphone-slash:before{content:"\f131"} 579 | .fa-shield:before{content:"\f132"} 580 | .fa-calendar-o:before{content:"\f133"} 581 | .fa-fire-extinguisher:before{content:"\f134"} 582 | .fa-rocket:before{content:"\f135"} 583 | .fa-maxcdn:before{content:"\f136"} 584 | .fa-chevron-circle-left:before{content:"\f137"} 585 | .fa-chevron-circle-right:before{content:"\f138"} 586 | .fa-chevron-circle-up:before{content:"\f139"} 587 | .fa-chevron-circle-down:before{content:"\f13a"} 588 | .fa-html5:before{content:"\f13b"} 589 | .fa-css3:before{content:"\f13c"} 590 | .fa-anchor:before{content:"\f13d"} 591 | .fa-unlock-o:before{content:"\f13e"} 592 | .fa-bullseye:before{content:"\f140"} 593 | .fa-ellipsis-horizontal:before{content:"\f141"} 594 | .fa-ellipsis-vertical:before{content:"\f142"} 595 | .fa-rss-square:before{content:"\f143"} 596 | .fa-play-circle:before{content:"\f144"} 597 | .fa-ticket:before{content:"\f145"} 598 | .fa-minus-square:before{content:"\f146"} 599 | .fa-minus-square-o:before{content:"\f147"} 600 | .fa-level-up:before{content:"\f148"} 601 | .fa-level-down:before{content:"\f149"} 602 | .fa-check-square:before{content:"\f14a"} 603 | .fa-pencil-square:before{content:"\f14b"} 604 | .fa-external-link-square:before{content:"\f14c"} 605 | .fa-share-square:before{content:"\f14d"} 606 | .fa-compass:before{content:"\f14e"} 607 | .fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"} 608 | .fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"} 609 | .fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"} 610 | .fa-euro:before,.fa-eur:before{content:"\f153"} 611 | .fa-gbp:before{content:"\f154"} 612 | .fa-dollar:before,.fa-usd:before{content:"\f155"} 613 | .fa-rupee:before,.fa-inr:before{content:"\f156"} 614 | .fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"} 615 | .fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"} 616 | .fa-won:before,.fa-krw:before{content:"\f159"} 617 | .fa-bitcoin:before,.fa-btc:before{content:"\f15a"} 618 | .fa-file:before{content:"\f15b"} 619 | .fa-file-text:before{content:"\f15c"} 620 | .fa-sort-alpha-asc:before{content:"\f15d"} 621 | .fa-sort-alpha-desc:before{content:"\f15e"} 622 | .fa-sort-amount-asc:before{content:"\f160"} 623 | .fa-sort-amount-desc:before{content:"\f161"} 624 | .fa-sort-numeric-asc:before{content:"\f162"} 625 | .fa-sort-numeric-desc:before{content:"\f163"} 626 | .fa-thumbs-up:before{content:"\f164"} 627 | .fa-thumbs-down:before{content:"\f165"} 628 | .fa-youtube-square:before{content:"\f166"} 629 | .fa-youtube:before{content:"\f167"} 630 | .fa-xing:before{content:"\f168"} 631 | .fa-xing-square:before{content:"\f169"} 632 | .fa-youtube-play:before{content:"\f16a"} 633 | .fa-dropbox:before{content:"\f16b"} 634 | .fa-stack-overflow:before{content:"\f16c"} 635 | .fa-instagram:before{content:"\f16d"} 636 | .fa-flickr:before{content:"\f16e"} 637 | .fa-adn:before{content:"\f170"} 638 | .fa-bitbucket:before{content:"\f171"} 639 | .fa-bitbucket-square:before{content:"\f172"} 640 | .fa-tumblr:before{content:"\f173"} 641 | .fa-tumblr-square:before{content:"\f174"} 642 | .fa-long-arrow-down:before{content:"\f175"} 643 | .fa-long-arrow-up:before{content:"\f176"} 644 | .fa-long-arrow-left:before{content:"\f177"} 645 | .fa-long-arrow-right:before{content:"\f178"} 646 | .fa-apple:before{content:"\f179"} 647 | .fa-windows:before{content:"\f17a"} 648 | .fa-android:before{content:"\f17b"} 649 | .fa-linux:before{content:"\f17c"} 650 | .fa-dribbble:before{content:"\f17d"} 651 | .fa-skype:before{content:"\f17e"} 652 | .fa-foursquare:before{content:"\f180"} 653 | .fa-trello:before{content:"\f181"} 654 | .fa-female:before{content:"\f182"} 655 | .fa-male:before{content:"\f183"} 656 | .fa-gittip:before{content:"\f184"} 657 | .fa-sun-o:before{content:"\f185"} 658 | .fa-moon-o:before{content:"\f186"} 659 | .fa-archive:before{content:"\f187"} 660 | .fa-bug:before{content:"\f188"} 661 | .fa-vk:before{content:"\f189"} 662 | .fa-weibo:before{content:"\f18a"} 663 | .fa-renren:before{content:"\f18b"} 664 | .fa-pagelines:before{content:"\f18c"} 665 | .fa-stack-exchange:before{content:"\f18d"} 666 | .fa-arrow-circle-o-right:before{content:"\f18e"} 667 | .fa-arrow-circle-o-left:before{content:"\f190"} 668 | .fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"} 669 | .fa-dot-circle-o:before{content:"\f192"} 670 | .fa-wheelchair:before{content:"\f193"} 671 | .fa-vimeo-square:before{content:"\f194"} 672 | .fa-turkish-lira:before,.fa-try:before{content:"\f195"} 673 | 674 | /*********************************************************************************/ 675 | /* Widgets */ 676 | /*********************************************************************************/ 677 | 678 | .widget-links 679 | { 680 | } 681 | 682 | .widget-thumbnails 683 | { 684 | } 685 | 686 | .widget-thumbnails .grid 687 | { 688 | margin-bottom: 2.5em; 689 | } 690 | 691 | .widget-contact 692 | { 693 | } 694 | 695 | .widget-contact ul 696 | { 697 | overflow: hidden; 698 | position: relative; 699 | left: -4px; 700 | top: 4px; 701 | margin-bottom: 1.5em; 702 | } 703 | 704 | .widget-contact ul li 705 | { 706 | display: inline-block; 707 | margin-right: 0.25em; 708 | } 709 | 710 | .widget-contact ul li a 711 | { 712 | display: inline-block; 713 | width: 2.5em; 714 | height: 2.5em; 715 | text-align: center; 716 | line-height: 2.5em; 717 | border-radius: 0.35em; 718 | outline: 0; 719 | opacity: 0.75; 720 | -moz-transition: background-color .25s ease-in-out; 721 | -webkit-transition: background-color .25s ease-in-out; 722 | -o-transition: background-color .25s ease-in-out; 723 | -ms-transition: background-color .25s ease-in-out; 724 | transition: background-color .25s ease-in-out; 725 | background: #555; 726 | } 727 | 728 | .widget-contact ul li a:before 729 | { 730 | color: #f3f3f3; 731 | font-size: 1.75em; 732 | line-height: 1.5em; 733 | } 734 | 735 | .widget-contact ul li a:hover 736 | { 737 | background: #333; 738 | } 739 | 740 | /*********************************************************************************/ 741 | /* Wrappers */ 742 | /*********************************************************************************/ 743 | 744 | #header-wrapper 745 | { 746 | } 747 | 748 | #banner-wrapper 749 | { 750 | } 751 | 752 | #main-wrapper 753 | { 754 | background: #fff; 755 | box-shadow: 0px 3px 0px 0px rgba(0,0,0,0.05); 756 | } 757 | 758 | #footer-wrapper 759 | { 760 | } 761 | 762 | /*********************************************************************************/ 763 | /* Header */ 764 | /*********************************************************************************/ 765 | 766 | #header 767 | { 768 | position: relative; 769 | } 770 | 771 | /*********************************************************************************/ 772 | /* Logo */ 773 | /*********************************************************************************/ 774 | 775 | #logo 776 | { 777 | overflow: hidden; 778 | } 779 | 780 | #logo h1 781 | { 782 | background: #ff4486; 783 | color: #fff; 784 | border-radius: 6px; 785 | font-family: 'Oleo Script', serif; 786 | font-weight: 400; 787 | } 788 | 789 | #logo span 790 | { 791 | font-weight: 800; 792 | } 793 | 794 | /*********************************************************************************/ 795 | /* Banner */ 796 | /*********************************************************************************/ 797 | 798 | #banner 799 | { 800 | position: relative; 801 | } 802 | 803 | /*********************************************************************************/ 804 | /* Footer */ 805 | /*********************************************************************************/ 806 | 807 | #footer 808 | { 809 | } 810 | 811 | #footer a 812 | { 813 | color: inherit; 814 | } 815 | 816 | #copyright 817 | { 818 | color: #aaa; 819 | } 820 | 821 | #copyright a 822 | { 823 | color: inherit; 824 | } -------------------------------------------------------------------------------- /src/main/resources/static/images/charts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/charts.png -------------------------------------------------------------------------------- /src/main/resources/static/images/ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/ghost.png -------------------------------------------------------------------------------- /src/main/resources/static/images/git.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/git.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/intellij.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/intellij.gif -------------------------------------------------------------------------------- /src/main/resources/static/images/java.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/java.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/me.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/me.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/pic01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/pic01.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/pic02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/pic02.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/pic03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/pic03.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/pic04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/pic04.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/pic05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/pic05.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/pic06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/pic06.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/pic07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/pic07.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/spring-header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/spring-header.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/spring.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/spring.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/thymeleaf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/thymeleaf.png -------------------------------------------------------------------------------- /src/main/resources/static/images/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/twitter.png -------------------------------------------------------------------------------- /src/main/resources/static/images/wowlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qkyrie/spring-boot-reactor-example/7383605369e28ef19a21c093e459596211f9afda/src/main/resources/static/images/wowlogo.png -------------------------------------------------------------------------------- /src/main/resources/static/js/config.js: -------------------------------------------------------------------------------- 1 | /* 2 | Verti 2.5 by HTML5 UP 3 | html5up.net | @n33co 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | window._skel_config = { 8 | preset: 'standard', 9 | prefix: '/css/style', 10 | resetCSS: true, 11 | breakpoints: { 12 | '1000px': { 13 | grid: { 14 | gutters: 25 15 | } 16 | } 17 | } 18 | }; 19 | 20 | window._skel_panels_config = { 21 | preset: 'standard' 22 | }; 23 | 24 | jQuery(function() { 25 | 26 | jQuery.fn.n33_formerize=function(){var _fakes=new Array(),_form = jQuery(this);_form.find('input[type=text],textarea').each(function() { var e = jQuery(this); if (e.val() == '' || e.val() == e.attr('placeholder')) { e.addClass('formerize-placeholder'); e.val(e.attr('placeholder')); } }).blur(function() { var e = jQuery(this); if (e.attr('name').match(/_fakeformerizefield$/)) return; if (e.val() == '') { e.addClass('formerize-placeholder'); e.val(e.attr('placeholder')); } }).focus(function() { var e = jQuery(this); if (e.attr('name').match(/_fakeformerizefield$/)) return; if (e.val() == e.attr('placeholder')) { e.removeClass('formerize-placeholder'); e.val(''); } }); _form.find('input[type=password]').each(function() { var e = jQuery(this); var x = jQuery(jQuery('
').append(e.clone()).remove().html().replace(/type="password"/i, 'type="text"').replace(/type=password/i, 'type=text')); if (e.attr('id') != '') x.attr('id', e.attr('id') + '_fakeformerizefield'); if (e.attr('name') != '') x.attr('name', e.attr('name') + '_fakeformerizefield'); x.addClass('formerize-placeholder').val(x.attr('placeholder')).insertAfter(e); if (e.val() == '') e.hide(); else x.hide(); e.blur(function(event) { event.preventDefault(); var e = jQuery(this); var x = e.parent().find('input[name=' + e.attr('name') + '_fakeformerizefield]'); if (e.val() == '') { e.hide(); x.show(); } }); x.focus(function(event) { event.preventDefault(); var x = jQuery(this); var e = x.parent().find('input[name=' + x.attr('name').replace('_fakeformerizefield', '') + ']'); x.hide(); e.show().focus(); }); x.keypress(function(event) { event.preventDefault(); x.val(''); }); }); _form.submit(function() { jQuery(this).find('input[type=text],input[type=password],textarea').each(function(event) { var e = jQuery(this); if (e.attr('name').match(/_fakeformerizefield$/)) e.attr('name', ''); if (e.val() == e.attr('placeholder')) { e.removeClass('formerize-placeholder'); e.val(''); } }); }).bind("reset", function(event) { event.preventDefault(); jQuery(this).find('select').val(jQuery('option:first').val()); jQuery(this).find('input,textarea').each(function() { var e = jQuery(this); var x; e.removeClass('formerize-placeholder'); switch (this.type) { case 'submit': case 'reset': break; case 'password': e.val(e.attr('defaultValue')); x = e.parent().find('input[name=' + e.attr('name') + '_fakeformerizefield]'); if (e.val() == '') { e.hide(); x.show(); } else { e.show(); x.hide(); } break; case 'checkbox': case 'radio': e.attr('checked', e.attr('defaultValue')); break; case 'text': case 'textarea': e.val(e.attr('defaultValue')); if (e.val() == '') { e.addClass('formerize-placeholder'); e.val(e.attr('placeholder')); } break; default: e.val(e.attr('defaultValue')); break; } }); window.setTimeout(function() { for (x in _fakes) _fakes[x].trigger('formerize_sync'); }, 10); }); return _form; }; 27 | jQuery.browser={};(function(){jQuery.browser.msie=false;jQuery.browser.version=0;if(navigator.userAgent.match(/MSIE ([0-9]+)\./)){jQuery.browser.msie=true;jQuery.browser.version=RegExp.$1;}})(); 28 | 29 | // Forms (IE <= 9 only) 30 | if (jQuery.browser.msie && jQuery.browser.version <= 9) 31 | jQuery('form').n33_formerize(); 32 | 33 | }); -------------------------------------------------------------------------------- /src/main/resources/static/js/d3/d3.layout.js: -------------------------------------------------------------------------------- 1 | // Word cloud layout by Jason Davies, http://www.jasondavies.com/word-cloud/ 2 | // Algorithm due to Jonathan Feinberg, http://static.mrfeinberg.com/bv_ch03.pdf 3 | (function() { 4 | function cloud() { 5 | var size = [256, 256], 6 | text = cloudText, 7 | font = cloudFont, 8 | fontSize = cloudFontSize, 9 | fontStyle = cloudFontNormal, 10 | fontWeight = cloudFontNormal, 11 | rotate = cloudRotate, 12 | padding = cloudPadding, 13 | spiral = archimedeanSpiral, 14 | words = [], 15 | timeInterval = Infinity, 16 | event = d3.dispatch("word", "end"), 17 | timer = null, 18 | cloud = {}; 19 | 20 | cloud.start = function() { 21 | var board = zeroArray((size[0] >> 5) * size[1]), 22 | bounds = null, 23 | n = words.length, 24 | i = -1, 25 | tags = [], 26 | data = words.map(function(d, i) { 27 | d.text = text.call(this, d, i); 28 | d.font = font.call(this, d, i); 29 | d.style = fontStyle.call(this, d, i); 30 | d.weight = fontWeight.call(this, d, i); 31 | d.rotate = rotate.call(this, d, i); 32 | d.size = ~~fontSize.call(this, d, i); 33 | d.padding = padding.call(this, d, i); 34 | return d; 35 | }).sort(function(a, b) { return b.size - a.size; }); 36 | 37 | if (timer) clearInterval(timer); 38 | timer = setInterval(step, 0); 39 | step(); 40 | 41 | return cloud; 42 | 43 | function step() { 44 | var start = +new Date, 45 | d; 46 | while (+new Date - start < timeInterval && ++i < n && timer) { 47 | d = data[i]; 48 | d.x = (size[0] * (Math.random() + .5)) >> 1; 49 | d.y = (size[1] * (Math.random() + .5)) >> 1; 50 | cloudSprite(d, data, i); 51 | if (d.hasText && place(board, d, bounds)) { 52 | tags.push(d); 53 | event.word(d); 54 | if (bounds) cloudBounds(bounds, d); 55 | else bounds = [{x: d.x + d.x0, y: d.y + d.y0}, {x: d.x + d.x1, y: d.y + d.y1}]; 56 | // Temporary hack 57 | d.x -= size[0] >> 1; 58 | d.y -= size[1] >> 1; 59 | } 60 | } 61 | if (i >= n) { 62 | cloud.stop(); 63 | event.end(tags, bounds); 64 | } 65 | } 66 | } 67 | 68 | cloud.stop = function() { 69 | if (timer) { 70 | clearInterval(timer); 71 | timer = null; 72 | } 73 | return cloud; 74 | }; 75 | 76 | cloud.timeInterval = function(x) { 77 | if (!arguments.length) return timeInterval; 78 | timeInterval = x == null ? Infinity : x; 79 | return cloud; 80 | }; 81 | 82 | function place(board, tag, bounds) { 83 | var perimeter = [{x: 0, y: 0}, {x: size[0], y: size[1]}], 84 | startX = tag.x, 85 | startY = tag.y, 86 | maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]), 87 | s = spiral(size), 88 | dt = Math.random() < .5 ? 1 : -1, 89 | t = -dt, 90 | dxdy, 91 | dx, 92 | dy; 93 | 94 | while (dxdy = s(t += dt)) { 95 | dx = ~~dxdy[0]; 96 | dy = ~~dxdy[1]; 97 | 98 | if (Math.min(dx, dy) > maxDelta) break; 99 | 100 | tag.x = startX + dx; 101 | tag.y = startY + dy; 102 | 103 | if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 || 104 | tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue; 105 | // TODO only check for collisions within current bounds. 106 | if (!bounds || !cloudCollide(tag, board, size[0])) { 107 | if (!bounds || collideRects(tag, bounds)) { 108 | var sprite = tag.sprite, 109 | w = tag.width >> 5, 110 | sw = size[0] >> 5, 111 | lx = tag.x - (w << 4), 112 | sx = lx & 0x7f, 113 | msx = 32 - sx, 114 | h = tag.y1 - tag.y0, 115 | x = (tag.y + tag.y0) * sw + (lx >> 5), 116 | last; 117 | for (var j = 0; j < h; j++) { 118 | last = 0; 119 | for (var i = 0; i <= w; i++) { 120 | board[x + i] |= (last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0); 121 | } 122 | x += sw; 123 | } 124 | delete tag.sprite; 125 | return true; 126 | } 127 | } 128 | } 129 | return false; 130 | } 131 | 132 | cloud.words = function(x) { 133 | if (!arguments.length) return words; 134 | words = x; 135 | return cloud; 136 | }; 137 | 138 | cloud.size = function(x) { 139 | if (!arguments.length) return size; 140 | size = [+x[0], +x[1]]; 141 | return cloud; 142 | }; 143 | 144 | cloud.font = function(x) { 145 | if (!arguments.length) return font; 146 | font = d3.functor(x); 147 | return cloud; 148 | }; 149 | 150 | cloud.fontStyle = function(x) { 151 | if (!arguments.length) return fontStyle; 152 | fontStyle = d3.functor(x); 153 | return cloud; 154 | }; 155 | 156 | cloud.fontWeight = function(x) { 157 | if (!arguments.length) return fontWeight; 158 | fontWeight = d3.functor(x); 159 | return cloud; 160 | }; 161 | 162 | cloud.rotate = function(x) { 163 | if (!arguments.length) return rotate; 164 | rotate = d3.functor(x); 165 | return cloud; 166 | }; 167 | 168 | cloud.text = function(x) { 169 | if (!arguments.length) return text; 170 | text = d3.functor(x); 171 | return cloud; 172 | }; 173 | 174 | cloud.spiral = function(x) { 175 | if (!arguments.length) return spiral; 176 | spiral = spirals[x + ""] || x; 177 | return cloud; 178 | }; 179 | 180 | cloud.fontSize = function(x) { 181 | if (!arguments.length) return fontSize; 182 | fontSize = d3.functor(x); 183 | return cloud; 184 | }; 185 | 186 | cloud.padding = function(x) { 187 | if (!arguments.length) return padding; 188 | padding = d3.functor(x); 189 | return cloud; 190 | }; 191 | 192 | return d3.rebind(cloud, event, "on"); 193 | } 194 | 195 | function cloudText(d) { 196 | return d.text; 197 | } 198 | 199 | function cloudFont() { 200 | return "serif"; 201 | } 202 | 203 | function cloudFontNormal() { 204 | return "normal"; 205 | } 206 | 207 | function cloudFontSize(d) { 208 | return Math.sqrt(d.value); 209 | } 210 | 211 | function cloudRotate() { 212 | return (~~(Math.random() * 6) - 3) * 30; 213 | } 214 | 215 | function cloudPadding() { 216 | return 1; 217 | } 218 | 219 | // Fetches a monochrome sprite bitmap for the specified text. 220 | // Load in batches for speed. 221 | function cloudSprite(d, data, di) { 222 | if (d.sprite) return; 223 | c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio); 224 | var x = 0, 225 | y = 0, 226 | maxh = 0, 227 | n = data.length; 228 | --di; 229 | while (++di < n) { 230 | d = data[di]; 231 | c.save(); 232 | c.font = d.style + " " + d.weight + " " + ~~((d.size + 1) / ratio) + "px " + d.font; 233 | var w = c.measureText(d.text + "m").width * ratio, 234 | h = d.size << 1; 235 | if (d.rotate) { 236 | var sr = Math.sin(d.rotate * cloudRadians), 237 | cr = Math.cos(d.rotate * cloudRadians), 238 | wcr = w * cr, 239 | wsr = w * sr, 240 | hcr = h * cr, 241 | hsr = h * sr; 242 | w = (Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 0x1f) >> 5 << 5; 243 | h = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr)); 244 | } else { 245 | w = (w + 0x1f) >> 5 << 5; 246 | } 247 | if (h > maxh) maxh = h; 248 | if (x + w >= (cw << 5)) { 249 | x = 0; 250 | y += maxh; 251 | maxh = 0; 252 | } 253 | if (y + h >= ch) break; 254 | c.translate((x + (w >> 1)) / ratio, (y + (h >> 1)) / ratio); 255 | if (d.rotate) c.rotate(d.rotate * cloudRadians); 256 | c.fillText(d.text, 0, 0); 257 | if (d.padding) c.lineWidth = 2 * d.padding, c.strokeText(d.text, 0, 0); 258 | c.restore(); 259 | d.width = w; 260 | d.height = h; 261 | d.xoff = x; 262 | d.yoff = y; 263 | d.x1 = w >> 1; 264 | d.y1 = h >> 1; 265 | d.x0 = -d.x1; 266 | d.y0 = -d.y1; 267 | d.hasText = true; 268 | x += w; 269 | } 270 | var pixels = c.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data, 271 | sprite = []; 272 | while (--di >= 0) { 273 | d = data[di]; 274 | if (!d.hasText) continue; 275 | var w = d.width, 276 | w32 = w >> 5, 277 | h = d.y1 - d.y0; 278 | // Zero the buffer 279 | for (var i = 0; i < h * w32; i++) sprite[i] = 0; 280 | x = d.xoff; 281 | if (x == null) return; 282 | y = d.yoff; 283 | var seen = 0, 284 | seenRow = -1; 285 | for (var j = 0; j < h; j++) { 286 | for (var i = 0; i < w; i++) { 287 | var k = w32 * j + (i >> 5), 288 | m = pixels[((y + j) * (cw << 5) + (x + i)) << 2] ? 1 << (31 - (i % 32)) : 0; 289 | sprite[k] |= m; 290 | seen |= m; 291 | } 292 | if (seen) seenRow = j; 293 | else { 294 | d.y0++; 295 | h--; 296 | j--; 297 | y++; 298 | } 299 | } 300 | d.y1 = d.y0 + seenRow; 301 | d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32); 302 | } 303 | } 304 | 305 | // Use mask-based collision detection. 306 | function cloudCollide(tag, board, sw) { 307 | sw >>= 5; 308 | var sprite = tag.sprite, 309 | w = tag.width >> 5, 310 | lx = tag.x - (w << 4), 311 | sx = lx & 0x7f, 312 | msx = 32 - sx, 313 | h = tag.y1 - tag.y0, 314 | x = (tag.y + tag.y0) * sw + (lx >> 5), 315 | last; 316 | for (var j = 0; j < h; j++) { 317 | last = 0; 318 | for (var i = 0; i <= w; i++) { 319 | if (((last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0)) 320 | & board[x + i]) return true; 321 | } 322 | x += sw; 323 | } 324 | return false; 325 | } 326 | 327 | function cloudBounds(bounds, d) { 328 | var b0 = bounds[0], 329 | b1 = bounds[1]; 330 | if (d.x + d.x0 < b0.x) b0.x = d.x + d.x0; 331 | if (d.y + d.y0 < b0.y) b0.y = d.y + d.y0; 332 | if (d.x + d.x1 > b1.x) b1.x = d.x + d.x1; 333 | if (d.y + d.y1 > b1.y) b1.y = d.y + d.y1; 334 | } 335 | 336 | function collideRects(a, b) { 337 | return a.x + a.x1 > b[0].x && a.x + a.x0 < b[1].x && a.y + a.y1 > b[0].y && a.y + a.y0 < b[1].y; 338 | } 339 | 340 | function archimedeanSpiral(size) { 341 | var e = size[0] / size[1]; 342 | return function(t) { 343 | return [e * (t *= .1) * Math.cos(t), t * Math.sin(t)]; 344 | }; 345 | } 346 | 347 | function rectangularSpiral(size) { 348 | var dy = 4, 349 | dx = dy * size[0] / size[1], 350 | x = 0, 351 | y = 0; 352 | return function(t) { 353 | var sign = t < 0 ? -1 : 1; 354 | // See triangular numbers: T_n = n * (n + 1) / 2. 355 | switch ((Math.sqrt(1 + 4 * sign * t) - sign) & 3) { 356 | case 0: x += dx; break; 357 | case 1: y += dy; break; 358 | case 2: x -= dx; break; 359 | default: y -= dy; break; 360 | } 361 | return [x, y]; 362 | }; 363 | } 364 | 365 | // TODO reuse arrays? 366 | function zeroArray(n) { 367 | var a = [], 368 | i = -1; 369 | while (++i < n) a[i] = 0; 370 | return a; 371 | } 372 | 373 | var cloudRadians = Math.PI / 180, 374 | cw = 1 << 11 >> 5, 375 | ch = 1 << 11, 376 | canvas, 377 | ratio = 1; 378 | 379 | if (typeof document !== "undefined") { 380 | canvas = document.createElement("canvas"); 381 | canvas.width = 1; 382 | canvas.height = 1; 383 | ratio = Math.sqrt(canvas.getContext("2d").getImageData(0, 0, 1, 1).data.length >> 2); 384 | canvas.width = (cw << 5) / ratio; 385 | canvas.height = ch / ratio; 386 | } else { 387 | // Attempt to use node-canvas. 388 | canvas = new Canvas(cw << 5, ch); 389 | } 390 | 391 | var c = canvas.getContext("2d"), 392 | spirals = { 393 | archimedean: archimedeanSpiral, 394 | rectangular: rectangularSpiral 395 | }; 396 | c.fillStyle = c.strokeStyle = "red"; 397 | c.textAlign = "center"; 398 | 399 | if (typeof module === "object" && module.exports) module.exports = cloud; 400 | else (d3.layout || (d3.layout = {})).cloud = cloud; 401 | })(); -------------------------------------------------------------------------------- /src/main/resources/static/js/html5shiv.js: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); 5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); 8 | for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d
'}},overlays:{titleBar:{breakpoints:"mobile",position:Dt,width:Y,height:44,html:''}}}},defaults:{config:{panel:{breakpoints:"",position:L,style:L,size:"80%",html:"",resetScroll:St,resetForms:St,swipeToClose:St},overlay:{breakpoints:"",position:L,width:0,height:0,html:""}}},recalcW:function(e){var t=parseInt(e);return typeof e==vt&&e.charAt(e[K]-1)=="%"&&(t=Math.floor(jQuery(window)[c]()*(t/100))),t},recalcH:function(e){var t=parseInt(e);return typeof e==vt&&e.charAt(e[K]-1)=="%"&&(t=Math.floor(jQuery(window)[T]()*(t/100))),t},getHalf:function(e){var t=parseInt(e);return typeof e==vt&&e.charAt(e[K]-1)=="%"?Math.floor(t/2)+"%":Math.floor(t/2)+"px"},parseSuspend:function(e){var t=e.get(0);t[p]&&t[p]()},parseResume:function(e){var t=e.get(0);t[o]&&t[o]()},parseInit:function(r){var i,s,u=r.get(0),a=r[it]("data-action"),f=r[it]("data-args"),l,d;a&&f&&(f=f.split(","));switch(a){case"togglePanel":case"panelToggle":r[h](H,gt)[h]("cursor",Rt),i=function(r){r[w](),r[g]();if(rn[e][t])return rn[e][t][n](),Z;var i=jQuery(this),s=rn[e].panels[f[0]];s.is(":visible")?s[n]():s[N]()},rn._[q][A]==en||rn._[q][A]=="wp"?r[Kt](Ct,i):r[Kt](rn.eventType,i);break;case"navList":l=jQuery(nn+f[0]),i=l[tn]("a"),s=[],i.each(function(){var e=jQuery(this),t;t=Math.max(0,e.parents("li")[K]-1),s[xt](''+e.text()+"")}),s[K]>0&&r.html(""),r[tn](".link")[h]("cursor",Rt)[h]("display","block");break;case"copyText":l=jQuery(nn+f[0]),r.html(l.text());break;case"copyHTML":l=jQuery(nn+f[0]),r.html(l.html());break;case"moveElementContents":l=jQuery(nn+f[0]),u[o]=function(){l[k]().each(function(){r.append(jQuery(this))})},u[p]=function(){r[k]().each(function(){l.append(jQuery(this))})},u[o]();break;case"moveElement":l=jQuery(nn+f[0]),u[o]=function(){jQuery(z+l[it]("id")+'" />').insertBefore(l),r.append(l)},u[p]=function(){jQuery(ht+l[it]("id")).replaceWith(l)},u[o]();break;case"moveCell":l=jQuery(nn+f[0]),d=jQuery(nn+f[1]),u[o]=function(){jQuery(z+l[it]("id")+'" />').insertBefore(l),r.append(l),l[h](c,mt),d&&d[ct]()},u[p]=function(){jQuery(ht+l[it]("id")).replaceWith(l),l[h](c,""),d&&d[h](c,"")},u[o]();break;default:}},lockView:function(i){rn[e][C][dt]=rn[e][C][u](),rn._[q][nt]&&rn[e][Vt][h](Wt+i,Mt),rn[e][r][Kt](bt,function(r){r[w](),r[g](),rn[e][t]&&rn[e][t][n]()}),rn[e][r][Kt](qt,function(r){r[w](),r[g](),rn[e][t]&&rn[e][t][n]()}),rn[e][r][Kt](D,function(r){r[w](),r[g](),rn[e][t]&&rn[e][t][n]()}),rn[e][C][Kt](et,function(r){rn[e][t]&&rn[e][t][n]()}),rn._[q][nt]||(rn[e][C][Kt](Ft,function(r){rn[e][t]&&rn[e][t][n]()}),rn[e][C][Kt](D,function(r){rn[e][t]&&rn[e][t][n]()}))},unlockView:function(t){rn._[q][nt]&&rn[e][Vt][h](Wt+t,Nt),rn[e][r][At](bt),rn[e][r][At](qt),rn[e][r][At](D),rn[e][C][At](et),rn._[q][nt]||(rn[e][C][At](Ft),rn[e][C][At](D))},resumeElement:function(t){var n=rn[e][t.type+"s"][t.id];n[tn]("*").each(function(){rn.parseResume(jQuery(this))})},suspendElement:function(t){var n=rn[e][t.type+"s"][t.id];n[i](),n[tn]("*").each(function(){rn.parseSuspend(jQuery(this))})},initElement:function(o){var a=o[v],p=jQuery(o.object),D;rn[e][o.type+"s"][o.id]=p,p[O](),p[tn]("*").each(function(){rn.parseInit(jQuery(this))});switch(o.type){case"panel":p[ft]("skel-panels-panel")[h](I,rn[v][Bt])[h](s,"fixed").hide(),p[tn]("a")[h](H,gt)[Kt]("click.skel-panels",function(r){var i=jQuery(this);if(rn[e][t]&&!i.hasClass("skel-panels-ignore")){r[w](),r[g]();var s=i[it]("href"),o=i[it]("target");rn[e][t][n](),i.hasClass("skel-panels-ignoreHref")||window[b](function(){o=="_blank"&&rn._[q][A]!="wp"?window.open(s):window.location.href=s},rn[v][at]+10)}}),rn._[q][A]=="ios"&&p[tn]("input,select,textarea").focus(function(n){var r=jQuery(this);n[w](),n[g](),window[b](function(){var n=rn[e][C][dt],i=rn[e][C][u]()-n;rn[e][C][u](n),rn[e][t][u](rn[e][t][u]()+i),r.hide(),window[b](function(){r.show()},0)},100)});switch(a[s]){case M:case Q:var F=a[s]==Q?"-":"";p[ft](ut+a[s]).data(S,a[s])[h](T,rn[pt](a.size))[u](0),rn._[q][nt]?p[h](B,"scroll")[h](ot,V)[h](R,"touch")[Kt](It,function(e){p._posY=e[d][X][0].pageY,p._posX=e[d][X][0].pageX})[Kt](Ut,function(e){var t=p._posX-e[d][X][0].pageX,n=p._posY-e[d][X][0].pageY,r=p.outerHeight(),i=p.get(0).scrollHeight-p[u]();if(p[u]()==0&&n<0||i>r-2&&i0)return Z}):p[h](B,mt);switch(a.style){case"reveal":case xt:default:p[N]=function(){p[m]()[u](0)[h](x,Jt)[h](a[s],"-"+rn[pt](a.size)+"px")[h](T,rn[pt](a.size))[h](c,Y).show(),a[kt]&&p[u](0),a[Pt]&&p[E](),rn[Yt]("y"),window[b](function(){p.add(rn[e][l][k]()).add(rn[e][r])[f](0,F+rn[pt](a.size)),rn[e][t]=p},100)},p[n]=function(){p[tn]("*").blur(),p.add(rn[e][r]).add(rn[e][l][k]())[i](),window[b](function(){rn[Ht]("y"),p[y]().hide(),rn[e][t]=L},rn[v][at]+50)}}break;case x:case P:var F=a[s]==P?"-":"";p[ft](ut+a[s]).data(S,a[s])[h](c,rn[W](a.size))[u](0),rn._[q][nt]?p[h](B,"scroll")[h](ot,V)[h](R,"touch")[Kt](It,function(e){p._posY=e[d][X][0].pageY,p._posX=e[d][X][0].pageX})[Kt](Ut,function(e){var t=p._posX-e[d][X][0].pageX,r=p._posY-e[d][X][0].pageY,i=p.outerHeight(),o=p.get(0).scrollHeight-p[u]();if(a.swipeToClose&&r<20&&r>-20&&(a[s]==x&&t>50||a[s]==P&&t<-50))return p[n](),Z;if(p[u]()==0&&r<0||o>i-2&&o0)return Z}):p[h](B,mt);switch(a.style){case xt:default:p[N]=function(){p[m]()[u](0)[h](M,Jt)[h](a[s],"-"+rn[W](a.size)+"px")[h](c,rn[W](a.size))[h](T,Y).show(),a[kt]&&p[u](0),a[Pt]&&p[E](),rn[Yt]("x"),window[b](function(){p.add(rn[e][l][k]()).add(rn[e][r])[f](F+rn[W](a.size),0),rn[e][t]=p},100)},p[n]=function(){p[tn]("*").blur(),p.add(rn[e][l][k]()).add(rn[e][r])[i](),window[b](function(){rn[Ht]("x"),p[y]().hide(),rn[e][t]=L},rn[v][at]+50)};break;case"reveal":p[N]=function(){rn[e][l][m](2),rn[e][r][m](1),p[u](0)[h](M,Jt)[h](a[s],Jt)[h](c,rn[W](a.size))[h](T,Y).show(),a[kt]&&p[u](0),a[Pt]&&p[E](),rn[Yt]("x"),window[b](function(){rn[e][r].add(rn[e][l][k]())[f](F+rn[W](a.size),0),rn[e][t]=p},100)},p[n]=function(){p[tn]("*").blur(),rn[e][r].add(rn[e][l][k]())[i](),window[b](function(){rn[Ht]("x"),p.hide(),rn[e][r][y](),rn[e][r][y](),rn[e][t]=L},rn[v][at]+50)}}break;default:}break;case Et:p[h](I,rn[v][Bt])[h](s,"fixed")[ft]("skel-panels-overlay"),p[h](c,a[c])[h](T,a[T]),(D=rn[wt][Zt][a[s]])||(a[s]=Dt,D=rn[wt][Zt][a[s]]),p[ft]("skel-panels-overlay-"+a[s]).data(j,a[s]),rn._[lt](D,function(e){p[h](e,D[e]),D[e]==_&&(e==M?p[h]("margin-top","-"+rn.getHalf(a[T])):e==x&&p[h]("margin-left","-"+rn.getHalf(a[c])))});break;default:}},initElements:function(e){var t,n,r,i,s=[],o;rn._[lt](rn[v][e+"s"],function(n){t={},rn._.extend(t,rn.defaults[v][e]),rn._.extend(t,rn[v][e+"s"][n]),rn[v][e+"s"][n]=t,r=rn._.newDiv(t.html),r.id=n,r.className="skel-panels-"+e,t.html||(s[n]=r),t.breakpoints?i=t.breakpoints.split(","):i=rn._.breakpointList,rn._[lt](i,function(s){var o=rn._.cacheBreakpointElement(i[s],n,r,e==Et?J:U,2);o[v]=t,o[Lt]=Z,o.type=e,o.onAttach=function(){this[Lt]?rn.resumeElement(this):(rn.initElement(this),this[Lt]=St)},o.onDetach=function(){rn.suspendElement(this)}})}),rn._[Gt](function(){var e,t,n;rn._[lt](s,function(n){e=jQuery(nn+n),t=jQuery(s[n]),e[k]()[_t](t),e.remove()})})},initJQueryUtilityFuncs:function(){jQuery.fn[m]=function(e){return this[Xt]=this[h](I),this[h](I,rn[v][Bt]+(e?e:1)),this},jQuery.fn[y]=function(){return this[Xt]&&(this[h](I,this[Xt]),this[Xt]=L),this},jQuery.fn._skel_panels_xcssValue=function(e,t){return jQuery(this)[h](e,t)[h](e,yt+t)[h](e,$+t)[h](e,$t+t)[h](e,Ot+t)},jQuery.fn._skel_panels_xcssProperty=function(e,t){return jQuery(this)[h](e,t)[h](yt+e,t)[h]($+e,t)[h]($t+e,t)[h](Ot+e,t)},jQuery.fn[jt]=function(e,t){return jQuery(this)[h](e,t)[h](yt+e,yt+t)[h]($+e,$+t)[h]($t+e,$t+t)[h](Ot+e,Ot+t)},jQuery.fn[E]=function(){var e=jQuery(this);return jQuery(this)[tn]("form").each(function(){this.reset()}),e},jQuery.fn[tt]=function(){var e=jQuery(this);e[it]("class").match(/(\s+|^)([0-9]+)u(\s+|$)/)&&e.data(zt,parseInt(RegExp.$2))},jQuery.fn[ct]=function(){var e=jQuery(this),t=e.parent(),n=12;t[k]().each(function(){var e=jQuery(this),t=e[it]("class");t&&t.match(/(\s+|^)([0-9]+)u(\s+|$)/)&&(n-=parseInt(RegExp.$2))}),n>0&&(e[tt](),e[h](c,(e.data(zt)+n)/12*100+"%"))};if(rn[v].useTransform&&rn._[q].IEVersion>=10&&(!rn[v][Tt]||rn._.hasActive(rn[v][Tt].split(","))))jQuery.fn[i]=function(){return jQuery(this)[f](0,0)},jQuery.fn[f]=function(e,t){return jQuery(this)[h]("transform","translate("+e+"px, "+t+"px)")},jQuery.fn[O]=function(){return jQuery(this)[h]("backface-visibility",Mt)[h]("perspective","500")[jt]("transition","transform "+rn[v][at]/1e3+"s ease-in-out")};else{var t,n=[];rn[e][C].resize(function(){if(rn[v][at]!=0){var e=rn[v][at];rn[v][at]=0,window[b](function(){rn[v][at]=e,n=[]},e)}}),jQuery.fn[i]=function(){for(var t=0;t'),rn[e][r]=jQuery("#skel-panels-pageWrapper"),rn[e][r][h](s,Qt)[h](x,"0")[h](P,"0")[h](M,"0")[O](),rn[e][st]=jQuery('
')[_t](rn[e][Vt]),rn[e][st][h](T,Y),rn[e][l]=jQuery('
')[_t](rn[e][Vt]),rn[e][l][h](s,Qt),jQuery(".skel-panels-fixed")[_t](rn[e][l]),rn._[G](U,rn[e][st][0]),rn._[G](J,rn[e][l][0]),rn._[G]("skel_panels_pageWrapper",rn[e][r][0]),jQuery("[autofocus]").focus()})},initIncludes:function(){rn._[Gt](function(){jQuery(".skel-panels-include").each(function(){rn.parseInit(jQuery(this))})})},init:function(){rn.eventType=rn._[q][nt]?"touchend":Ct;if(rn._[q][A]==en&&rn._[q].deviceVersion<4||rn._[q][A]=="wp")rn[v].useTransform=Z;rn.initObjects(),rn.initJQueryUtilityFuncs(),rn.initElements(Et),rn.initElements("panel"),rn.initIncludes(),rn._.updateState()}};return rn}()); -------------------------------------------------------------------------------- /src/main/resources/static/js/skel.min.js: -------------------------------------------------------------------------------- 1 | /* skelJS v0.4.9 | (c) n33 | skeljs.org | MIT licensed */ 2 | var skel=function(){var _={config:{prefix:null,preloadStyleSheets:!1,pollOnce:!1,resetCSS:!1,normalizeCSS:!1,boxModel:null,useOrientation:!1,useRTL:!1,pollOnLock:!1,usePerpetualLock:!0,useDomainLock:!0,containers:960,grid:{collapse:!1,gutters:40},breakpoints:{all:{range:"*",hasStyleSheet:!1}},events:{}},isConfigured:!1,isInit:!1,lockState:null,stateId:"",me:null,breakpoints:[],breakpointList:[],events:[],plugins:{},cache:{elements:{},states:{}},locations:{html:null,head:null,body:null},vars:{},lsc:"_skel_lock",sd:" ",css:{r:"html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}body{-webkit-text-size-adjust:none}",n:'article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{background:#fff;color:#000;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"C" "D" "8" "9"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}'},presets:{"default":{},standard:{breakpoints:{mobile:{range:"-480",lockViewport:!0,containers:"fluid",grid:{collapse:1,gutters:10}},desktop:{range:"481-",containers:1200},"1000px":{range:"481-1200",containers:960}}}},defaults:{breakpoint:{test:null,config:null,elements:null},config_breakpoint:{range:"",containers:960,lockViewport:!1,viewportWidth:!1,viewport:"",hasStyleSheet:!0,grid:{}}},DOMReady:null,getElementsByClassName:null,indexOf:null,iterate:null,extend:function(e,t){var n="object",r;_.iterate(t,function(r){typeof t[r]==n?(typeof e[r]!=n&&(e[r]={}),_.extend(e[r],t[r])):e[r]=t[r]})},parseMeasurement:function(e){var t,n;if(typeof e!="string")t=[e,"px"];else if(e=="fluid")t=[100,"%"];else{var n;n=e.match(/([0-9\.]+)([^\s]*)/),n.length<3||!n[2]?t=[parseFloat(e),"px"]:t=[parseFloat(n[1]),n[2]]}return t},getDevicePixelRatio:function(){var e="deviceType",t="devicePixelRatio",n="matchMedia",r=navigator.userAgent;if(_.vars[e]=="ios"||_.vars[e]=="mac"||_.vars[e]=="windows"||_.vars[e]=="android"&&r.match(/Safari\/([0-9]+)/)&&parseInt(RegExp.$1)>=537)return 1;if(window[t]!==undefined&&!r.match(/(Firefox; Mobile)/))return window[t];if(window[n]){if(window[n]("(-webkit-min-device-pixel-ratio: 2),(min--moz-device-pixel-ratio: 2),(-o-min-device-pixel-ratio: 2/1),(min-resolution: 2dppx)").matches)return 2;if(window[n]("(-webkit-min-device-pixel-ratio: 1.5),(min--moz-device-pixel-ratio: 1.5),(-o-min-device-pixel-ratio: 3/2),(min-resolution: 1.5dppx)").matches)return 1.5}return 1},getLevel:function(e){return typeof e=="boolean"?e?1:0:parseInt(e)},getViewportWidth:function(){var e="orientation",t="width",n="height",r,i,s;return r=document.documentElement.clientWidth,i=window[e]!==undefined?Math.abs(window[e]):!1,s=_.getDevicePixelRatio(),screen[t]0&&i.className.match(/\bno-collapse-([0-9])\b/)&&parseInt(RegExp.$1)>=e)return;var s=i.children,o;for(o=1;o0&&_.DOMReady(function(){_[t](o,function(e){a=_.locations[o[e].location],a&&(a[r](o[e].object),o[e][i]&&o[e][i]())})})},poll:function(){var e="breakpoints",t="stateId",n="className",r="locations",i,s,o="";_.lockState?s=_.lockState:s=_.getViewportWidth(),_.vars.viewportWidth=s,_.vars.devicePixelRatio=_.getDevicePixelRatio(),_.iterate(_[e],function(t){_[e][t].test(s)&&(o+=_.sd+t)}),o===""&&(o=_.sd),o!==_[t]&&(_[r].html[n]=_[r].html[n].replace(_[t],""),_.changeState(o),_[r].html[n]=_[r].html[n]+_[t])},updateState:function(){var e="elements",t,n,r,i=[],s=_.stateId.substring(1).split(_.sd);_.iterate(s,function(n){t=_.breakpoints[s[n]];if(t[e].length==0)return;_.iterate(t[e],function(n){_.cache.states[_.stateId][e].push(t[e][n]),i.push(t[e][n])})}),i.length>0&&_.attachElements(i)},changeState:function(e){var t="vars",n="stateId",r="states",i="cache",s="config",o="iterate",u="breakpoints",a="getCachedElement",f="cacheElement",l="newInline",c="head",h="push",p="elements",d="prefix",v="newStyleSheet",m=".css",g="viewport",y="viewportWidth",b=",",w="lockViewport",E="parseMeasurement",S="containers",x="}",T="gutters",N="grid",C=" 0 0 ",k="collapse",L=".row",A="length",O="{display:none!important}",M="parentNode",D="hasOwnProperty",P=!1,H="insertBefore",B,j,F,I,q,R,U,z;_[t].lastStateId=_[n],_[n]=e;if(!_[i][r][_[n]]){_[i][r][_[n]]={config:{},elements:[],values:{}},F=_[i][r][_[n]],_[n]===_.sd?B=[]:B=_[n].substring(1).split(_.sd),_.extend(F[s],_.defaults.config_breakpoint),_[o](B,function(e){_.extend(F[s],_[u][B[e]][s])}),_[s].boxModel&&(R="iBM",(q=_[a](R))||(q=_[f](R,_[l]("*,*:before,*:after{-moz-@;-webkit-@;@}".replace(/@/g,"box-sizing:"+_[s].boxModel+"-box")),c,3)),F[p][h](q)),_[s].resetCSS?(R="iR",(q=_[a](R))||(q=_[f](R,_[l](_.css.r),c,2)),F[p][h](q)):_[s].normalizeCSS&&(R="iN",(q=_[a](R))||(q=_[f](R,_[l](_.css.n),c,2)),F[p][h](q)),_[s][d]&&(R="ssB",(q=_[a](R))||(q=_[f](R,_[v](_[s][d]+m),c,4)),F[p][h](q)),U=F[s][g],F[s][y]?U+=(U!=""?b:"")+"width="+F[s][y]:F[s][w]&&(U+=(U!=""?b:"")+"width=device-width"),F[s][w]&&(U+=(U!=""?b:"")+"initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0"),U!=""&&(R="mV"+_[n],(q=_[a](R))||(q=_[f](R,_.newMeta(g,U),c,1)),F[p][h](q)),_[t].IEVersion>=10&&(R="mVIE"+_[n],(q=_[a](R))||(q=_[f](R,_[l]("@-ms-viewport{width: device-width}"),c,2)),F[p][h](q));var W,X;I=_[E](F[s][S]),W=I[0],X=I[1],F.values[S]=W+X,R="iC"+W+X;if(!(q=_[a](R))){var V,$,J;V=W*.75+X,$=W+X,J=W*1.25+X,q=_[f](R,_[l]("body{min-width:"+$+x+".container{margin-left:auto;margin-right:auto;width:"+$+x+".container.small{width:"+V+x+".container.big{width:100%;max-width:"+J+";min-width:"+$+x),c,3)}F[p][h](q),R="iG",(q=_[a](R))||(q=_[f](R,_[l](".\\31 2u{width:100%}.\\31 1u{width:91.6666666667%}.\\31 0u{width:83.3333333333%}.\\39 u{width:75%}.\\38 u{width:66.6666666667%}.\\37 u{width:58.3333333333%}.\\36 u{width:50%}.\\35 u{width:41.6666666667%}.\\34 u{width:33.3333333333%}.\\33 u{width:25%}.\\32 u{width:16.6666666667%}.\\31 u{width:8.3333333333%}.\\-11u{margin-left:91.6666666667%}.\\-10u{margin-left:83.3333333333%}.\\-9u{margin-left:75%}.\\-8u{margin-left:66.6666666667%}.\\-7u{margin-left:58.3333333333%}.\\-6u{margin-left:50%}.\\-5u{margin-left:41.6666666667%}.\\-4u{margin-left:33.3333333333%}.\\-3u{margin-left:25%}.\\-2u{margin-left:16.6666666667%}.\\-1u{margin-left:8.3333333333%}"),c,3)),F[p][h](q),R="iGR",(q=_[a](R))||(q=_[f](R,_[l](".row>*{float:left;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.row:after{content:'';display:block;clear:both;height:0}.row:first-child>*{padding-top:0!important}"),c,3)),F[p][h](q),R="iGG"+F[s][N][T];if(!(q=_[a](R))){var K,Q,G,Y,Z,et,tt;I=_[E](F[s][N][T]),K=I[0],Q=I[1],G=K+Q,Y=K/2+Q,Z=K/4+Q,et=K*1.5+Q,tt=K*2+Q,q=_[f]("iGG"+F[s][N][T],_[l](".row.flush{margin-left:0}.row.flush>*{padding:0!important}.row>*{padding-left:"+G+x+".row+.row>*{padding:"+G+C+G+x+".row{margin-left:-"+G+x+".row.half>*{padding-left:"+Y+x+".row+.row.half>*{padding:"+Y+C+Y+x+".row.half{margin-left:-"+Y+x+".row.quarter>*{padding-left:"+Z+x+".row+.row.quarter>*{padding:"+Z+C+Z+x+".row.quarter{margin-left:-"+Z+x+".row.oneandhalf>*{padding-left:"+et+x+".row+.row.oneandhalf>*{padding:"+et+C+et+x+".row.oneandhalf{margin-left:-"+et+x+".row.double>*{padding-left:"+tt+x+".row+.row.double>*{padding:"+tt+C+tt+x+".row.double{margin-left:-"+tt+x),c,3)}F[p][h](q);if(F[s][N][k]){var nt=_.getLevel(F[s][N][k]);R="iGC"+nt;if(!(q=_[a](R))){U=":not(.no-collapse)";switch(nt){case 4:break;case 3:U+=":not(.no-collapse-3)";break;case 2:U+=":not(.no-collapse-2):not(.no-collapse-3)";break;case 1:default:U+=":not(.no-collapse-1):not(.no-collapse-2):not(.no-collapse-3)"}I=_[E](F[s][N][T]),z=I[0]/2+I[1],q=_[f](R,_[l](L+U+"{margin-left:0}"+L+U+">*{float:none!important;width:100%!important;margin-left:0!important}"+".row:not(.flush)"+U+">*{padding:"+z+" 0 "+z+" 0!important;}"+".container{max-width:none!important;min-width:0!important;width:"+F.values[S]+"!important}"),c,3)}F[p][h](q)}R="iCd"+_[n];if(!(q=_[a](R))){U=[],z=[],_[o](_[u],function(e){_.indexOf(B,e)!==-1?U[h](".not-"+e):z[h](".only-"+e)});var rt=(U[A]>0?U.join(b)+O:"")+(z[A]>0?z.join(b)+O:"");q=_[f](R,_[l](rt.replace(/\.([0-9])/,".\\3$1 ")),c,3),F[p][h](q)}_[o](B,function(e){_[u][B[e]][s].hasStyleSheet&&_[s][d]&&(R="ss"+B[e],(q=_[a](R))||(q=_[f](R,_[v](_[s][d]+"-"+B[e]+m),c,5)),F[p][h](q)),_[u][B[e]][p][A]>0&&_[o](_[u][B[e]][p],function(t){F[p][h](_[u][B[e]][p][t])})})}else F=_[i][r][_[n]];_.detachAllElements(),_.attachElements(F[p]),_.DOMReady(function(){var e,n,r,i=_.getLevel(F[s][N][k]);_[s].useRTL&&(_.unreverseRows(),i>0&&_.reverseRows(i)),_[t].IEVersion>8&&(n="_skel_cell_important_placeholder",e=_.getElementsByClassName("skel-cell-important"),e&&e[A]>0&&_[o](e,function(t){if(t===A)return;var r=e[t],s=r[M],o;if(!s)return;s.className.match(/no-collapse-([0-9])/)?o=parseInt(RegExp.$1):s.className.match(/no-collapse/)?o=100:o=0;if(o'+e+""):(n=document[t]("style"),n.type="text/css",n.innerHTML=e),n},newDiv:function(e){var t=document.createElement("div");return t.innerHTML=e,t},registerPlugin:function(e,t){_.plugins[e]=t,t._=this,_.isConfigured&&(_.initPluginConfig(e,_.plugins[e]),t.init())},initPluginConfig:function(id,o){var s,k="_skel_"+id+"_config";window[k]?s=window[k]:(s=document.getElementsByTagName("script"),s=s[s.length-1].innerHTML.replace(/^\s+|\s+$/g,""),s&&(s=eval("("+s+")"))),typeof s=="object"&&(s.preset&&o.presets[s.preset]?(_.extend(o.config,o.presets[s.preset]),_.extend(o.config,s)):_.extend(o.config,s))},initConfig:function(){function buildTest(e,t){var n="-",r;return typeof t!="string"&&(r=function(e){return!1}),t=="*"?r=function(e){return!0}:t.charAt(0)==n?(fArgs[e]=parseInt(t.substring(1)),r=function(t){return t<=fArgs[e]}):t.charAt(t.length-1)==n?(fArgs[e]=parseInt(t.substring(0,t.length-1)),r=function(t){return t>=fArgs[e]}):_.indexOf(t,n)!=-1?(t=t.split(n),fArgs[e]=[parseInt(t[0]),parseInt(t[1])],r=function(t){return t>=fArgs[e][0]&&t<=fArgs[e][1]}):(fArgs[e]=parseInt(t),r=function(t){return t==fArgs[e]}),r}var c,b,s,f,fArgs=[],preloads=[];window._skel_config?s=window._skel_config:(s=_.me.innerHTML.replace(/^\s+|\s+$/g,""),s&&(s=eval("("+s+")"))),function(){var e="object",t="preset",n="breakpoints",r="config",i="extend",o="config_breakpoint",u="defaults",a="containers";typeof s==e&&(s[t]&&_.presets[s[t]]?(_[r][n]={},_[i](_[r],_.presets[s[t]]),_[i](_[r],s)):(s[n]&&(_[r][n]={}),_[i](_[r],s))),_[i](_[u][o].grid,_[r].grid),_[u][o][a]=_[r][a],_.iterate(_[r][n],function(t){typeof _[r][n][t]!=e&&(_[r][n][t]={range:_[r][n][t]}),c={},_[i](c,_[u][o]),_[i](c,_[r][n][t]),_[r][n][t]=c,b={},_[i](b,_[u].breakpoint),b[r]=_[r][n][t],b.test=buildTest(t,b[r].range),b.elements=[],_[n][t]=b,_[r].preloadStyleSheets&&b[r].hasStyleSheet&&preloads.push(_[r].prefix+"-"+t+".css"),_.breakpointList.push(t)}),_.iterate(_[r].events,function(e){_.bind(e,_[r].events[e])})}(),preloads.length>0&&window.location.protocol!="file:"&&_.DOMReady(function(){var e,t=document.getElementsByTagName("head")[0],n=new XMLHttpRequest;_.iterate(preloads,function(e){n.open("GET",preloads[e],!1),n.send("")})})},initEvents:function(){var e;_.config.pollOnce||(window.onresize=function(){_.poll()},_.config.useOrientation&&(window.onorientationchange=function(){_.poll()}))},initUtilityMethods:function(){var e="addEventListener",t="domready",n="DOMContentLoaded",r="readyState",i="removeEventListener",s="getElementsByClassName",o="querySelectorAll",u="indexOf";document[e]?!function(e,t){_.DOMReady=t()}(t,function(){function t(e){f=1;while(e=s.shift())e()}var s=[],o,u=document,a=n,f=/^loaded|^c/.test(u[r]);return u[e](a,o=function(){u[i](a,o),t()}),function(e){f?e():s.push(e)}}):!function(e,t){_.DOMReady=t()}(t,function(t){function s(e){E=1;while(e=o.shift())e()}var o=[],u,a=!1,f=document,l=f.documentElement,c=l.doScroll,h=n,p=e,d="onreadystatechange",m=r,b=c?/^loaded|^c/:/^loaded|c/,E=b.test(f[m]);return f[p]&&f[p](h,u=function(){f[i](h,u,a),s()},a),c&&f.attachEvent(d,u=function(){/^c/.test(f[m])&&(f.detachEvent(d,u),s())}),t=c?function(e){self!=top?E?e():o.push(e):function(){try{l.doScroll("left")}catch(n){return setTimeout(function(){t(e)},50)}e()}()}:function(e){E?e():o.push(e)}}),document[s]?_[s]=function(e){return document[s](e)}:_[s]=function(e){var t=document;return t[o]?t[o](("."+e.replace(" "," .")).replace(/\.([0-9])/,".\\3$1 ")):[]},Array.prototype[u]?_[u]=function(e,t){return e[u](t)}:_[u]=function(e,t){if(typeof e=="string")return e[u](t);var n,r=t?t:0,i;if(!this)throw new TypeError;i=this.length;if(i===0||r>=i)return-1;r<0&&(r=i-Math.abs(r));for(n=r;n0:"ontouchstart"in window,s=document.cookie.split(";"),_.iterate(s,function(e){var t=s[e].split("=");if(t[0][r](/^\s+|\s+$/g,"")==_.lsc){_.lockState=t[1];return}})},init:function(e,t){var n="registerLocation",r="html",i="getElementsByTagName",s="head",o="body",u="plugins";_.initUtilityMethods(),_.initAPI(),e&&(window._skel_config=e);if(t){var a;_.iterate(t,function(e){window["_skel_"+e+"_config"]=t[e]})}_.initConfig(),_[n](r,document[i](r)[0]),_[n](s,document[i](s)[0]),_.DOMReady(function(){_[n](o,document[i](o)[0])}),_.initEvents(),_.poll();var a;_.iterate(_[u],function(e){_.initPluginConfig(e,_[u][e]),_[u][e].init()}),_.isInit=!0},preInit:function(){var e="getElementsByTagName",t="script",n="isConfigured",r=document[e](t);_.me=r[r.length-1],window._skel_config?_[n]=!0:(s=document[e](t),s=s[s.length-1].innerHTML.replace(/^\s+|\s+$/g,""),s&&(_[n]=!0)),_[n]&&_.init()}};return _.preInit(),_}(); -------------------------------------------------------------------------------- /src/main/resources/static/js/sockjs-0.3.4.min.js: -------------------------------------------------------------------------------- 1 | /* SockJS client, version 0.3.4, http://sockjs.org, MIT License 2 | 3 | Copyright (c) 2011-2012 VMware, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | */ 23 | 24 | // JSON2 by Douglas Crockford (minified). 25 | var JSON;JSON||(JSON={}),function(){function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c1?this._listeners[a]=d.slice(0,e).concat(d.slice(e+1)):delete this._listeners[a];return}return},d.prototype.dispatchEvent=function(a){var b=a.type,c=Array.prototype.slice.call(arguments,0);this["on"+b]&&this["on"+b].apply(this,c);if(this._listeners&&b in this._listeners)for(var d=0;d=3e3&&a<=4999},c.countRTO=function(a){var b;return a>100?b=3*a:b=a+200,b},c.log=function(){b.console&&console.log&&console.log.apply&&console.log.apply(console,arguments)},c.bind=function(a,b){return a.bind?a.bind(b):function(){return a.apply(b,arguments)}},c.flatUrl=function(a){return a.indexOf("?")===-1&&a.indexOf("#")===-1},c.amendUrl=function(b){var d=a.location;if(!b)throw new Error("Wrong url for SockJS");if(!c.flatUrl(b))throw new Error("Only basic urls are supported in SockJS");return b.indexOf("//")===0&&(b=d.protocol+b),b.indexOf("/")===0&&(b=d.protocol+"//"+d.host+b),b=b.replace(/[/]+$/,""),b},c.arrIndexOf=function(a,b){for(var c=0;c=0},c.delay=function(a,b){return typeof a=="function"&&(b=a,a=0),setTimeout(b,a)};var i=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,j={"\0":"\\u0000","\x01":"\\u0001","\x02":"\\u0002","\x03":"\\u0003","\x04":"\\u0004","\x05":"\\u0005","\x06":"\\u0006","\x07":"\\u0007","\b":"\\b","\t":"\\t","\n":"\\n","\x0b":"\\u000b","\f":"\\f","\r":"\\r","\x0e":"\\u000e","\x0f":"\\u000f","\x10":"\\u0010","\x11":"\\u0011","\x12":"\\u0012","\x13":"\\u0013","\x14":"\\u0014","\x15":"\\u0015","\x16":"\\u0016","\x17":"\\u0017","\x18":"\\u0018","\x19":"\\u0019","\x1a":"\\u001a","\x1b":"\\u001b","\x1c":"\\u001c","\x1d":"\\u001d","\x1e":"\\u001e","\x1f":"\\u001f",'"':'\\"',"\\":"\\\\","\x7f":"\\u007f","\x80":"\\u0080","\x81":"\\u0081","\x82":"\\u0082","\x83":"\\u0083","\x84":"\\u0084","\x85":"\\u0085","\x86":"\\u0086","\x87":"\\u0087","\x88":"\\u0088","\x89":"\\u0089","\x8a":"\\u008a","\x8b":"\\u008b","\x8c":"\\u008c","\x8d":"\\u008d","\x8e":"\\u008e","\x8f":"\\u008f","\x90":"\\u0090","\x91":"\\u0091","\x92":"\\u0092","\x93":"\\u0093","\x94":"\\u0094","\x95":"\\u0095","\x96":"\\u0096","\x97":"\\u0097","\x98":"\\u0098","\x99":"\\u0099","\x9a":"\\u009a","\x9b":"\\u009b","\x9c":"\\u009c","\x9d":"\\u009d","\x9e":"\\u009e","\x9f":"\\u009f","\xad":"\\u00ad","\u0600":"\\u0600","\u0601":"\\u0601","\u0602":"\\u0602","\u0603":"\\u0603","\u0604":"\\u0604","\u070f":"\\u070f","\u17b4":"\\u17b4","\u17b5":"\\u17b5","\u200c":"\\u200c","\u200d":"\\u200d","\u200e":"\\u200e","\u200f":"\\u200f","\u2028":"\\u2028","\u2029":"\\u2029","\u202a":"\\u202a","\u202b":"\\u202b","\u202c":"\\u202c","\u202d":"\\u202d","\u202e":"\\u202e","\u202f":"\\u202f","\u2060":"\\u2060","\u2061":"\\u2061","\u2062":"\\u2062","\u2063":"\\u2063","\u2064":"\\u2064","\u2065":"\\u2065","\u2066":"\\u2066","\u2067":"\\u2067","\u2068":"\\u2068","\u2069":"\\u2069","\u206a":"\\u206a","\u206b":"\\u206b","\u206c":"\\u206c","\u206d":"\\u206d","\u206e":"\\u206e","\u206f":"\\u206f","\ufeff":"\\ufeff","\ufff0":"\\ufff0","\ufff1":"\\ufff1","\ufff2":"\\ufff2","\ufff3":"\\ufff3","\ufff4":"\\ufff4","\ufff5":"\\ufff5","\ufff6":"\\ufff6","\ufff7":"\\ufff7","\ufff8":"\\ufff8","\ufff9":"\\ufff9","\ufffa":"\\ufffa","\ufffb":"\\ufffb","\ufffc":"\\ufffc","\ufffd":"\\ufffd","\ufffe":"\\ufffe","\uffff":"\\uffff"},k=/[\x00-\x1f\ud800-\udfff\ufffe\uffff\u0300-\u0333\u033d-\u0346\u034a-\u034c\u0350-\u0352\u0357-\u0358\u035c-\u0362\u0374\u037e\u0387\u0591-\u05af\u05c4\u0610-\u0617\u0653-\u0654\u0657-\u065b\u065d-\u065e\u06df-\u06e2\u06eb-\u06ec\u0730\u0732-\u0733\u0735-\u0736\u073a\u073d\u073f-\u0741\u0743\u0745\u0747\u07eb-\u07f1\u0951\u0958-\u095f\u09dc-\u09dd\u09df\u0a33\u0a36\u0a59-\u0a5b\u0a5e\u0b5c-\u0b5d\u0e38-\u0e39\u0f43\u0f4d\u0f52\u0f57\u0f5c\u0f69\u0f72-\u0f76\u0f78\u0f80-\u0f83\u0f93\u0f9d\u0fa2\u0fa7\u0fac\u0fb9\u1939-\u193a\u1a17\u1b6b\u1cda-\u1cdb\u1dc0-\u1dcf\u1dfc\u1dfe\u1f71\u1f73\u1f75\u1f77\u1f79\u1f7b\u1f7d\u1fbb\u1fbe\u1fc9\u1fcb\u1fd3\u1fdb\u1fe3\u1feb\u1fee-\u1fef\u1ff9\u1ffb\u1ffd\u2000-\u2001\u20d0-\u20d1\u20d4-\u20d7\u20e7-\u20e9\u2126\u212a-\u212b\u2329-\u232a\u2adc\u302b-\u302c\uaab2-\uaab3\uf900-\ufa0d\ufa10\ufa12\ufa15-\ufa1e\ufa20\ufa22\ufa25-\ufa26\ufa2a-\ufa2d\ufa30-\ufa6d\ufa70-\ufad9\ufb1d\ufb1f\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufb4e\ufff0-\uffff]/g,l,m=JSON&&JSON.stringify||function(a){return i.lastIndex=0,i.test(a)&&(a=a.replace(i,function(a){return j[a]})),'"'+a+'"'},n=function(a){var b,c={},d=[];for(b=0;b<65536;b++)d.push(String.fromCharCode(b));return a.lastIndex=0,d.join("").replace(a,function(a){return c[a]="\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4),""}),a.lastIndex=0,c};c.quote=function(a){var b=m(a);return k.lastIndex=0,k.test(b)?(l||(l=n(k)),b.replace(k,function(a){return l[a]})):b};var o=["websocket","xdr-streaming","xhr-streaming","iframe-eventsource","iframe-htmlfile","xdr-polling","xhr-polling","iframe-xhr-polling","jsonp-polling"];c.probeProtocols=function(){var a={};for(var b=0;b0&&h(a)};return c.websocket!==!1&&h(["websocket"]),d["xhr-streaming"]&&!c.null_origin?e.push("xhr-streaming"):d["xdr-streaming"]&&!c.cookie_needed&&!c.null_origin?e.push("xdr-streaming"):h(["iframe-eventsource","iframe-htmlfile"]),d["xhr-polling"]&&!c.null_origin?e.push("xhr-polling"):d["xdr-polling"]&&!c.cookie_needed&&!c.null_origin?e.push("xdr-polling"):h(["iframe-xhr-polling","jsonp-polling"]),e};var p="_sockjs_global";c.createHook=function(){var a="a"+c.random_string(8);if(!(p in b)){var d={};b[p]=function(a){return a in d||(d[a]={id:a,del:function(){delete d[a]}}),d[a]}}return b[p](a)},c.attachMessage=function(a){c.attachEvent("message",a)},c.attachEvent=function(c,d){typeof b.addEventListener!="undefined"?b.addEventListener(c,d,!1):(a.attachEvent("on"+c,d),b.attachEvent("on"+c,d))},c.detachMessage=function(a){c.detachEvent("message",a)},c.detachEvent=function(c,d){typeof b.addEventListener!="undefined"?b.removeEventListener(c,d,!1):(a.detachEvent("on"+c,d),b.detachEvent("on"+c,d))};var q={},r=!1,s=function(){for(var a in q)q[a](),delete q[a]},t=function(){if(r)return;r=!0,s()};c.attachEvent("unload",t),c.unload_add=function(a){var b=c.random_string(8);return q[b]=a,r&&c.delay(s),b},c.unload_del=function(a){a in q&&delete q[a]},c.createIframe=function(b,d){var e=a.createElement("iframe"),f,g,h=function(){clearTimeout(f);try{e.onload=null}catch(a){}e.onerror=null},i=function(){e&&(h(),setTimeout(function(){e&&e.parentNode.removeChild(e),e=null},0),c.unload_del(g))},j=function(a){e&&(i(),d(a))},k=function(a,b){try{e&&e.contentWindow&&e.contentWindow.postMessage(a,b)}catch(c){}};return e.src=b,e.style.display="none",e.style.position="absolute",e.onerror=function(){j("onerror")},e.onload=function(){clearTimeout(f),f=setTimeout(function(){j("onload timeout")},2e3)},a.body.appendChild(e),f=setTimeout(function(){j("timeout")},15e3),g=c.unload_add(i),{post:k,cleanup:i,loaded:h}},c.createHtmlfile=function(a,d){var e=new ActiveXObject("htmlfile"),f,g,i,j=function(){clearTimeout(f)},k=function(){e&&(j(),c.unload_del(g),i.parentNode.removeChild(i),i=e=null,CollectGarbage())},l=function(a){e&&(k(),d(a))},m=function(a,b){try{i&&i.contentWindow&&i.contentWindow.postMessage(a,b)}catch(c){}};e.open(),e.write(' 12 | 13 | 14 | 15 | 16 | 151 | 152 |
153 | 154 | -------------------------------------------------------------------------------- /src/test/java/com/deswaef/spring/examples/reactor/configuration/ReactorLoggingConfigurationTest.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.configuration; 2 | 3 | import com.deswaef.spring.examples.reactor.SpringReactorExample; 4 | import com.deswaef.spring.examples.reactor.repository.LogMessageRepository; 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.test.IntegrationTest; 9 | import org.springframework.boot.test.SpringApplicationConfiguration; 10 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 | import org.springframework.test.context.web.WebAppConfiguration; 12 | import reactor.bus.Event; 13 | import reactor.bus.EventBus; 14 | 15 | @RunWith(SpringJUnit4ClassRunner.class) 16 | @SpringApplicationConfiguration(classes = SpringReactorExample.class) 17 | @WebAppConfiguration 18 | @IntegrationTest("server.port:0") 19 | public class ReactorLoggingConfigurationTest { 20 | 21 | @Autowired 22 | private EventBus r; 23 | 24 | @Autowired 25 | private LogMessageRepository logMessageRepository; 26 | 27 | @Test 28 | public void logMessagesCreateDatabaseEntries() { 29 | r.notify("log.trace", Event.wrap("new logmessage")); 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /src/test/java/com/deswaef/spring/examples/reactor/repository/LogMessageRepositoryTest.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.repository; 2 | 3 | import org.junit.Test; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | 6 | import static org.fest.assertions.Assertions.assertThat; 7 | 8 | public class LogMessageRepositoryTest extends RepositoryIntegrationTest{ 9 | 10 | @Autowired 11 | private LogMessageRepository repository; 12 | 13 | @Test 14 | public void findAllIsNotNull() { 15 | assertThat(repository.findAll()).isNotNull(); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /src/test/java/com/deswaef/spring/examples/reactor/repository/RepositoryIntegrationTest.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.repository; 2 | 3 | import com.deswaef.spring.examples.reactor.SpringReactorExample; 4 | import org.junit.Test; 5 | import org.junit.runner.RunWith; 6 | import org.springframework.boot.test.IntegrationTest; 7 | import org.springframework.boot.test.SpringApplicationConfiguration; 8 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 9 | import org.springframework.test.context.web.WebAppConfiguration; 10 | 11 | /** 12 | * User: Quinten 13 | * Date: 15-7-2014 14 | * Time: 22:02 15 | * 16 | * @author Quinten De Swaef 17 | */ 18 | @RunWith(SpringJUnit4ClassRunner.class) 19 | @SpringApplicationConfiguration(classes = SpringReactorExample.class) 20 | @WebAppConfiguration 21 | @IntegrationTest("server.port:0") 22 | public class RepositoryIntegrationTest { 23 | 24 | @Test 25 | public void emptyTest() { 26 | //just an empty statement 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/test/java/com/deswaef/spring/examples/reactor/service/LoggingServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.deswaef.spring.examples.reactor.service; 2 | 3 | import com.deswaef.spring.examples.reactor.model.LogCategory; 4 | import com.deswaef.spring.examples.reactor.model.LogMessage; 5 | import com.deswaef.spring.examples.reactor.repository.LogMessageRepository; 6 | import org.junit.Test; 7 | import org.junit.runner.RunWith; 8 | import org.mockito.ArgumentCaptor; 9 | import org.mockito.InjectMocks; 10 | import org.mockito.Mock; 11 | import org.mockito.runners.MockitoJUnitRunner; 12 | import reactor.bus.EventBus; 13 | 14 | import static org.fest.assertions.Assertions.assertThat; 15 | import static org.mockito.Mockito.verify; 16 | 17 | 18 | @RunWith(MockitoJUnitRunner.class) 19 | public class LoggingServiceTest { 20 | 21 | private static final LogCategory TEST_CATEGORY = LogCategory.DEBUG; 22 | private static final String TEST_LOG_MESSAGE = "this is the log message"; 23 | 24 | @InjectMocks 25 | private LoggingService loggingService; 26 | 27 | @Mock 28 | private LogMessageRepository repository; 29 | 30 | 31 | @Mock 32 | private EventBus reactor; 33 | 34 | @Test 35 | public void logCallsLogRepository() { 36 | loggingService.log(TEST_CATEGORY, TEST_LOG_MESSAGE); 37 | ArgumentCaptor argCaptor = ArgumentCaptor.forClass(LogMessage.class); 38 | verify(repository).save(argCaptor.capture()); 39 | 40 | LogMessage value = argCaptor.getValue(); 41 | assertThat(value.getCategory()).isEqualTo(TEST_CATEGORY); 42 | assertThat(value.getText()).isEqualTo(TEST_LOG_MESSAGE); 43 | } 44 | 45 | } --------------------------------------------------------------------------------