├── assets
├── Uploads
│ └── .gitignore
└── .gitignore
├── themes
└── base
│ ├── .babelrc
│ ├── .bowerrc
│ ├── .gitignore
│ ├── .jshintignore
│ ├── bower.json
│ ├── source
│ ├── images
│ │ └── cms_logo.png
│ ├── index.js
│ ├── js
│ │ ├── reducers
│ │ │ ├── index.js
│ │ │ └── eventReducers.js
│ │ ├── components
│ │ │ ├── filters
│ │ │ │ ├── ResetFilters.js
│ │ │ │ ├── SearchFilter.js
│ │ │ │ └── DropdownFilter.js
│ │ │ ├── Pagination.js
│ │ │ ├── EventsApp.js
│ │ │ └── EventFilters.js
│ │ ├── init.js
│ │ └── actions
│ │ │ └── eventActions.js
│ └── less
│ │ ├── includes
│ │ ├── filter-set.less
│ │ ├── burger-container.less
│ │ └── pagination.less
│ │ ├── components
│ │ ├── defaults.less
│ │ ├── well.less
│ │ ├── bootstrap.less
│ │ ├── grid.less
│ │ ├── buttons.less
│ │ ├── typography.less
│ │ └── forms.less
│ │ ├── style.less
│ │ ├── layout
│ │ └── postcard-layout.less
│ │ └── helper
│ │ └── vars.less
│ ├── production
│ ├── images
│ │ └── cms_logo.png
│ └── css
│ │ └── main.css
│ ├── templates
│ ├── Layout
│ │ ├── Page.ss
│ │ └── EventsPage.ss
│ ├── Includes
│ │ ├── Page_Scripts.ss
│ │ └── Page_Styles.ss
│ └── Page.ss
│ ├── makefile
│ ├── .eslintrc
│ ├── server.js
│ ├── package.json
│ └── webpack.config.js
├── mysite
├── .htaccess
├── _config
│ ├── routes.yml
│ ├── catalog.yml
│ ├── config.yml
│ ├── cmsmenu.yml
│ └── seeder.yml
├── code
│ ├── API
│ │ ├── CountryService.php
│ │ ├── EventTypeService.php
│ │ ├── AccessPoint.php
│ │ ├── EventService.php
│ │ ├── WebServiceController.php
│ │ └── DataObjectService.php
│ ├── PageTypes
│ │ ├── EventsPage.php
│ │ ├── Page.php
│ │ └── EventPage.php
│ ├── ModelAdmin
│ │ └── EventAdmin.php
│ └── DataObjects
│ │ ├── EventType.php
│ │ └── Country.php
└── _config.php
├── .gitignore
├── .editorconfig
├── composer.json
├── LICENSE
├── README.md
├── .htaccess
└── composer.lock
/assets/Uploads/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
--------------------------------------------------------------------------------
/assets/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 | !Uploads/
--------------------------------------------------------------------------------
/themes/base/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "stage": 0
3 | }
4 |
--------------------------------------------------------------------------------
/themes/base/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory" : "source/lib"
3 | }
--------------------------------------------------------------------------------
/themes/base/.gitignore:
--------------------------------------------------------------------------------
1 | _build
2 | _build-js
3 | node_modules/
--------------------------------------------------------------------------------
/mysite/.htaccess:
--------------------------------------------------------------------------------
1 |
2 | Deny from all
3 |
--------------------------------------------------------------------------------
/themes/base/.jshintignore:
--------------------------------------------------------------------------------
1 | node_modules/**
2 | source/components/**
3 | source/lib/**/*
4 | source/js/main.js
5 |
--------------------------------------------------------------------------------
/mysite/_config/routes.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: routes
3 | ---
4 | Director:
5 | rules:
6 | 'api/$Action/$ID': WebServiceController
--------------------------------------------------------------------------------
/themes/base/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "bower",
3 | "version": "0.0.0",
4 | "dependencies": {
5 | "flare": "~1.0.0"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/themes/base/source/images/cms_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevie-mayhew/silverstripe-redux-example/HEAD/themes/base/source/images/cms_logo.png
--------------------------------------------------------------------------------
/themes/base/source/index.js:
--------------------------------------------------------------------------------
1 | import 'babel/polyfill';
2 | import './less/style.less';
3 | import './js/init';
4 |
5 | import './images/cms_logo.png';
6 |
--------------------------------------------------------------------------------
/themes/base/production/images/cms_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevie-mayhew/silverstripe-redux-example/HEAD/themes/base/production/images/cms_logo.png
--------------------------------------------------------------------------------
/mysite/code/API/CountryService.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
$Title
5 | $Content
6 |
7 |
8 |
--------------------------------------------------------------------------------
/themes/base/source/js/reducers/index.js:
--------------------------------------------------------------------------------
1 | /*eslint-disable */
2 |
3 | import { combineReducers } from 'redux';
4 | import {events} from './eventReducers';
5 |
6 | export const reducers = combineReducers({
7 | events
8 | });
9 | /*eslint-enable */
10 |
--------------------------------------------------------------------------------
/mysite/code/PageTypes/EventsPage.php:
--------------------------------------------------------------------------------
1 | <%-- Site javascript, compiled by webpack --%>
2 |
3 | <% else %>
4 |
5 | <% end_if %>
6 |
--------------------------------------------------------------------------------
/themes/base/makefile:
--------------------------------------------------------------------------------
1 | BIN = node_modules/.bin
2 |
3 | clean:
4 | rm -rf production
5 | build: clean
6 | NODE_ENV=production webpack --progress --colors
7 | watch:
8 | NODE_ENV=dev node server $(filter-out $@,$(MAKECMDGOALS))
9 | lint:
10 | NODE_ENV=dev $(BIN)/eslint ./source/index.js
11 |
--------------------------------------------------------------------------------
/themes/base/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "eslint-config-airbnb",
3 | "env": {
4 | "browser": true,
5 | "mocha": true,
6 | "node": true
7 | },
8 | "rules": {
9 | "react/jsx-uses-react": 2,
10 | "react/jsx-uses-vars": 2,
11 | "react/react-in-jsx-scope": 2
12 | },
13 | "plugins": [
14 | "react"
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/themes/base/templates/Layout/EventsPage.ss:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/mysite/_config/config.yml:
--------------------------------------------------------------------------------
1 | ---
2 | Name: mysite
3 | After: 'framework/*','cms/*'
4 | ---
5 |
6 | SSViewer:
7 | theme: 'base'
8 |
9 | SiteTree:
10 | create_default_pages: false
11 |
12 | Image:
13 | force_resample: true
14 |
15 | BetterNavigator:
16 | developers:
17 | - 'dev@littlegiant.co.nz'
18 | - 'webmaster@littlegiant.co.nz'
19 |
20 | Member:
21 | log_num_visits: false
22 | log_last_visited: false
--------------------------------------------------------------------------------
/themes/base/source/js/components/filters/ResetFilters.js:
--------------------------------------------------------------------------------
1 | /*eslint-disable */
2 |
3 | import React, {Component, PropTypes} from 'react';
4 |
5 | export default class ResetFilters extends Component {
6 | render() {
7 | return (
8 |
10 | );
11 | }
12 | }
13 |
14 | /*eslint-enable */
15 |
16 |
--------------------------------------------------------------------------------
/themes/base/templates/Includes/Page_Styles.ss:
--------------------------------------------------------------------------------
1 |
2 | <% if $WebpackDevServer %>
3 |
4 | <% else %>
5 |
6 | <% end_if %>
7 |
8 | <% if $SiteConfig.SupportedBrowser %>
9 |
12 | <% end_if %>
13 |
--------------------------------------------------------------------------------
/mysite/code/PageTypes/Page.php:
--------------------------------------------------------------------------------
1 | setOption(
18 | 'valid_styles',
19 | array('*' => 'width,height,color,font-size,font-weight,font-style,text-decoration')
20 | );
21 |
22 |
--------------------------------------------------------------------------------
/themes/base/server.js:
--------------------------------------------------------------------------------
1 | var webpack = require('webpack');
2 | var WebpackDevServer = require('webpack-dev-server');
3 | var config = require('./webpack.config');
4 |
5 | new WebpackDevServer(webpack(config), {
6 | publicPath: config.output.publicPath,
7 | hot: true,
8 | moduleBind: 'css=style!css',
9 | historyApiFallback: true,
10 | stats: {
11 | colors: true
12 | }
13 | }).listen(3000, 'localhost', function (err) {
14 |
15 | if (err) {
16 | console.log(err);
17 | }
18 |
19 | console.log('Listening at localhost:3000');
20 |
21 | });
22 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # This file is for unifying the coding style for different editors and IDEs
2 | # editorconfig.org
3 |
4 | root = true
5 |
6 | [*]
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
12 | [**.js]
13 | indent_style = space
14 | indent_size = 2
15 |
16 | # Tabs in less
17 | [**.less]
18 | indent_style = space
19 | indent_size = 4
20 |
21 | [**.css]
22 | indent_style = space
23 | indent_size = 4
24 |
25 | [**.php]
26 | indent_style = space
27 | indent_size = 4
28 |
29 | [**.html]
30 | indent_style = tab
31 | indent_size = 4
--------------------------------------------------------------------------------
/mysite/code/DataObjects/EventType.php:
--------------------------------------------------------------------------------
1 | 'Varchar(256)'
13 | );
14 |
15 | /**
16 | * @var array
17 | */
18 | private static $has_many = array(
19 | 'Events' => 'EventPage'
20 | );
21 |
22 | /**
23 | * @var array
24 | */
25 | private static $api_information = array(
26 | 'ID' => 'ID',
27 | 'Title' => 'Title'
28 | );
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/mysite/_config/cmsmenu.yml:
--------------------------------------------------------------------------------
1 | ---
2 | Name: 'cmsmenu'
3 | After: 'cms/*', 'framework/*'
4 | ---
5 |
6 | LeftAndMain:
7 | menu_groups:
8 | Events:
9 | - EventAdmin
10 | Other:
11 | - AssetAdmin
12 | - ReportAdmin
13 | - CMSPagesController
14 | - SecurityAdmin
15 | - CMSSettingsController
16 | - Help
17 | cms_menu_color: '#fff'
18 | cms_menu_background: '#23282d'
19 | cms_menu_active_text_color: '#fff'
20 | cms_menu_active_background_color: '#ee9601'
21 |
22 | SiteConfig:
23 | cms_logo: '/themes/base/production/images/cms_logo.png'
24 |
25 | EventAdmin:
26 | menu_icon_class: 'fa fa-pencil'
27 |
--------------------------------------------------------------------------------
/themes/base/source/less/includes/filter-set.less:
--------------------------------------------------------------------------------
1 | //
2 | // Filter Set
3 | // --------------------------------------------------
4 | .filter-set{
5 | margin-bottom: 20px;
6 |
7 | .form-group{
8 | margin-bottom: 0;
9 | }
10 |
11 | .form-icon{
12 | .form-control{
13 | padding-right: 60px;
14 | }
15 |
16 | .btn{
17 | position: absolute;
18 | top: 0;
19 | right: 0;
20 | width: 40px;
21 | padding-left: 0;
22 | padding-right: 0;
23 | }
24 | }
25 |
26 | label{
27 | text-align: right;
28 | font-size: 15px;
29 | line-height: 40px;
30 | color: @text-color;
31 | font-weight: 600;
32 | display: block;
33 | }
34 | }
--------------------------------------------------------------------------------
/themes/base/source/less/includes/burger-container.less:
--------------------------------------------------------------------------------
1 | //
2 | // Burger Container
3 | // --------------------------------------------------
4 |
5 | //** Burger style content container used on the Events and Businesses pages
6 | .burger-container{
7 | margin-bottom: 30px;
8 |
9 | & + .burger-container{
10 | padding-top: 30px;
11 | border-top: 1px solid #cdcccd;
12 | }
13 |
14 | h3{
15 | font-size: 20px;
16 | font-weight: 700;
17 | margin-bottom: 15px;
18 | }
19 |
20 | p{
21 | font-family: @font-family-heading;
22 | margin-bottom: 0;
23 |
24 | & + p{
25 | margin-top: 15px;
26 | }
27 | }
28 |
29 | i{
30 | vertical-align: middle;
31 | margin-right: 5px;
32 | }
33 | }
34 |
35 | .burger-wrapper{
36 | padding-left: 15px;
37 | }
38 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "littlegiant/redux",
3 | "require": {
4 | "php": ">=5.3.2",
5 | "silverstripe/cms": "~3.1.15",
6 | "silverstripe/framework": "~3.1.15",
7 | "heyday/silverstripe-hashpath": "2.0.1",
8 | "littlegiant/silverstripe-catalogmanager": "~2.0.0",
9 | "silverstripe-australia/grouped-cms-menu": "~2.2.0",
10 | "unclecheese/betterbuttons": "~1.2.0",
11 | "ryanpotter/silverstripe-cms-theme": "~0.3.0",
12 | "littlegiant/silverstripe-seeder": "~1.0.0"
13 | },
14 | "require-dev": {
15 | "gdmedia/ss-auto-git-ignore": "~0.0.1"
16 | },
17 | "config": {
18 | "process-timeout": 600
19 | },
20 | "scripts": {
21 | "post-update-cmd": "GDM\\SSAutoGitIgnore\\UpdateScript::Go"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/mysite/code/DataObjects/Country.php:
--------------------------------------------------------------------------------
1 | 'Varchar(256)',
13 | 'NationalityLabel' => 'Varchar(256)'
14 | );
15 |
16 | /**
17 | * @var array
18 | */
19 | private static $has_many = array(
20 | 'Events' => 'EventPage',
21 | 'Members' => 'Member'
22 | );
23 |
24 | private static $summary_fields = array(
25 | 'Title' => 'Name',
26 | 'NationalityLabel' => 'Nationality'
27 | );
28 |
29 | /**
30 | * @var array
31 | */
32 | private static $api_information = array(
33 | 'ID' => 'ID',
34 | 'Title' => 'Title'
35 | );
36 |
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/themes/base/source/less/components/defaults.less:
--------------------------------------------------------------------------------
1 | // ==================================================
2 | // Layout
3 | // ==================================================
4 |
5 | //
6 | // Defaults
7 | // --------------------------------------------------
8 |
9 | .global-main{
10 | padding-top: @main-top-offset;
11 | background-color: @main-bg;
12 | }
13 | .section-padding{
14 | padding: @section-padding;
15 | }
16 |
17 | .inner{
18 | position: relative;
19 | }
20 |
21 | .list-unstyled {
22 | padding: 0;
23 | margin: 0;
24 | list-style-type: none;
25 |
26 | li {
27 | margin: 0;
28 | }
29 | }
30 |
31 | .vcenter-parent {
32 | display: table;
33 | width: 100%;
34 | height: 100%;
35 | }
36 |
37 | .vcenter {
38 | display: table-cell;
39 | vertical-align: middle;
40 | }
41 |
--------------------------------------------------------------------------------
/mysite/_config/seeder.yml:
--------------------------------------------------------------------------------
1 | ---
2 | Name: seeder
3 | After: 'framework/*', 'cms/*'
4 | ---
5 |
6 | suppress_warnings: true
7 |
8 | ---
9 | Only:
10 | environment: 'dev'
11 | ---
12 |
13 | Seeder:
14 | create:
15 | Country:
16 | count: 244
17 | fields:
18 | Title: faker(words,2)
19 | EventType:
20 | count: 10
21 | fields:
22 | Title: faker(words,3)
23 | EventsPage:
24 | count: 1
25 | fields:
26 | Title: 'Events'
27 | URLSegment: 'events'
28 | EventPage:
29 | count: 100
30 | fields:
31 | Approved: 1
32 | Featured: 0
33 | LocationName: 'faker(words,2)'
34 | LocationAddress: 'faker(words,3)'
35 | StartTime: 'date(+10 month)'
36 | EndTime: 'date(+10 month)'
37 | Image: image(400,600)
38 | Country: Random(Country)
39 | EventType: Random(EventType)
40 | Parent: First(EventsPage)
41 |
--------------------------------------------------------------------------------
/themes/base/source/less/components/well.less:
--------------------------------------------------------------------------------
1 | //
2 | // Well
3 | // --------------------------------------------------
4 | .well{
5 | border: 1px solid #cdcccd;
6 | background-color: #fff;
7 | padding: 30px;
8 |
9 | &.well-lg{
10 | padding: 35px 60px 60px 60px;
11 | }
12 |
13 | // Title
14 | // -------------------------
15 | .well-title{
16 | font-size: 25px;
17 | line-height: 1.4;
18 | font-weight: 700;
19 | margin-bottom: 20px;
20 | }
21 |
22 | .well-subtitle{
23 | font-size: 20px;
24 | line-height: 1.4;
25 | font-weight: 600;
26 | margin-bottom: 20px;
27 | }
28 |
29 | // Generic typography
30 | // -------------------------
31 | p{
32 | font-size: 14px;
33 | margin-bottom: 25px;
34 | }
35 |
36 | .btn{
37 | margin-top: 30px;
38 | }
39 |
40 | // Generic forms
41 | // -------------------------
42 | form{
43 | .btn{
44 | margin-top: 0;
45 | }
46 | }
47 | }
--------------------------------------------------------------------------------
/themes/base/source/js/components/filters/SearchFilter.js:
--------------------------------------------------------------------------------
1 | /*eslint-disable */
2 |
3 | import React, {Component, PropTypes} from 'react';
4 | import {setSearchTerm} from '../../actions/eventActions';
5 |
6 | export default class SearchFilter extends Component {
7 |
8 | constructor(props) {
9 | super(props);
10 | }
11 |
12 | handleSearchChange(event) {
13 | this.props.dispatch(
14 | setSearchTerm(
15 | event.target.value
16 | )
17 | );
18 | }
19 | render() {
20 | return (
21 |
22 |
24 |
26 |
27 | );
28 | }
29 | }
30 |
31 | /*eslint-enable */
32 |
--------------------------------------------------------------------------------
/themes/base/source/js/components/filters/DropdownFilter.js:
--------------------------------------------------------------------------------
1 | /*eslint-disable */
2 |
3 | import React, {Component, PropTypes} from 'react';
4 |
5 | export default class DropdownFilter extends Component {
6 | render() {
7 | return (
8 |
9 |
13 |
18 |
19 | );
20 | }
21 | }
22 |
23 | /*eslint-enable */
24 |
--------------------------------------------------------------------------------
/themes/base/source/less/style.less:
--------------------------------------------------------------------------------
1 | // ==================================================
2 | // Style
3 | // ==================================================
4 |
5 |
6 | //
7 | // Libs
8 | // --------------------------------------------------
9 | @import "components/bootstrap.less";
10 |
11 | //
12 | // Modules
13 | // --------------------------------------------------
14 | @import "helper/vars.less";
15 | @import "components/typography.less";
16 | @import "components/grid.less";
17 | @import "components/defaults.less";
18 | @import "components/well.less";
19 | @import "components/forms.less";
20 | @import "components/buttons.less";
21 |
22 | //
23 | // Layout
24 | // --------------------------------------------------
25 | @import "layout/postcard-layout.less";
26 |
27 | //
28 | // Includes (globally available includes)
29 | // --------------------------------------------------
30 | @import "includes/pagination.less";
31 | @import "includes/burger-container.less";
32 | @import "includes/filter-set.less";
33 |
--------------------------------------------------------------------------------
/themes/base/source/js/init.js:
--------------------------------------------------------------------------------
1 | require('babel/polyfill');
2 |
3 | /*eslint-disable */
4 | import objectAssign from 'object-assign';
5 | import React, {Component} from 'react';
6 | import ReactDOM from 'react-dom';
7 | import { Provider, connect } from 'react-redux';
8 | import promiseMiddleware from 'redux-promise';
9 | import { createStore, applyMiddleware } from 'redux';
10 | import EventsApp from './components/EventsApp';
11 | import {reducers} from './reducers';
12 | /*eslint-enable */
13 |
14 | const createStoreWithMiddleware = applyMiddleware(promiseMiddleware)(createStore);
15 | const store = createStoreWithMiddleware(reducers);
16 | const AppConnectorEvents = connect(state => (objectAssign({}, state)))(EventsApp);
17 |
18 | document.addEventListener('DOMContentLoaded', function init() {
19 | // Events store
20 | if (document.getElementById('Events')) {
21 | ReactDOM.render(
22 |
23 | {() => }
24 | ,
25 | document.getElementById('Events')
26 | );
27 | }
28 | });
29 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Stevie Mayhew
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 all
13 | 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 THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/mysite/code/API/AccessPoint.php:
--------------------------------------------------------------------------------
1 | 300){
24 | $responseTitle = 'ErrorMessage';
25 | }
26 |
27 | // only display error messages in test mode
28 | if($code == 500 && Director::isLive()){
29 | $message = 'There was a server error';
30 | }
31 |
32 | $body = json_encode(
33 | array(
34 | $responseTitle => $message
35 | )
36 | );
37 | }
38 |
39 | if(is_array($message)){
40 | $body = json_encode($message);
41 | }
42 |
43 | $response = new SS_HTTPResponse($body, $code);
44 | return $response;
45 | }
46 |
47 | }
--------------------------------------------------------------------------------
/themes/base/templates/Page.ss:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | <% base_tag %>
9 | $MetaTags( false )
10 | <% if MetaTitle %>$MetaTitle<% else %>$Title | $SiteConfig.Title<% end_if %>
11 | <% include Page_Styles %>
12 |
13 |
14 | <% if $IsTablet %>
15 |
16 | <% else %>
17 |
18 | <% end_if %>
19 |
20 |
21 | <%-- Browser Support Page is rendered if the browser is less than IE9 - add class 'ie8-support' to body.browser-support-page to support IE8 --%>
22 |
23 |
24 | $Layout
25 | $Form
26 |
27 | <% include Page_Scripts %>
28 |
29 |
30 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SilverStripe Redux Example
2 | Just a small toy example showing React + Redux in tandem with SilverStripe.
3 |
4 | ## Setup
5 | ### SilverStripe Setup
6 | You'll need to set up a `_ss_environment.php` file, it might look something like this:
7 |
8 | ```php
9 |
8 | Order deny,allow
9 | Deny from all
10 | Allow from 127.0.0.1
11 |
12 |
13 |
14 | Order deny,allow
15 | Deny from all
16 |
17 |
18 | # This denies access to all yml files, since developers might include sensitive
19 | # information in them. See the docs for work-arounds to serve some yaml files
20 |
21 | Order allow,deny
22 | Deny from all
23 |
24 |
25 | ErrorDocument 404 /assets/error-404.html
26 | ErrorDocument 500 /assets/error-500.html
27 |
28 |
29 | SetEnv HTTP_MOD_REWRITE On
30 | RewriteEngine On
31 | RewriteBase '/'
32 |
33 | # SilverStripe HashPath rewrites for breaking cache
34 | RewriteCond %{REQUEST_FILENAME} !-f
35 | RewriteCond %{REQUEST_FILENAME} !-d
36 | RewriteRule ^(.+)\.(v[A-Za-z0-9]+)\.(js|css|png|jpg|gif|jpeg)$ $1.$3 [L]
37 |
38 | RewriteRule ^vendor(/|$) - [F,L,NC]
39 | RewriteRule silverstripe-cache(/|$) - [F,L,NC]
40 | RewriteRule composer\.(json|lock) - [F,L,NC]
41 |
42 | RewriteCond %{REQUEST_URI} ^(.*)$
43 | RewriteCond %{REQUEST_FILENAME} !-f
44 | RewriteRule .* framework/main.php?url=%1&%{QUERY_STRING} [L]
45 |
46 | ### SILVERSTRIPE END ###
47 |
--------------------------------------------------------------------------------
/themes/base/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-redux-silverstripe",
3 | "version": "0.0.1",
4 | "scripts": {
5 | "start": "node server.js"
6 | },
7 | "dependencies": {
8 | "react": "^0.14.0",
9 | "react-dom": "^0.14.0",
10 | "superagent": "^1.3.0",
11 | "form-serialize": "~0.6.0",
12 | "bootstrap": "^3.3.5",
13 | "dataset": "^0.3.1",
14 | "desandro-classie": "^1.0.1",
15 | "velocity-animate": "^1.2.2",
16 | "classnames": "2.1.5",
17 | "object-assign": "^4.0.1",
18 | "react-redux": "^0.9.0",
19 | "redux": "^1.0.1",
20 | "redux-actions": "^0.7.0",
21 | "redux-promise": "^0.5.0"
22 | },
23 | "devDependencies": {
24 | "autoprefixer-loader": "^2.0.0",
25 | "babel": "^5.8.21",
26 | "babel-core": "^5.8.22",
27 | "babel-eslint": "^4.0.10",
28 | "babel-loader": "^5.3.2",
29 | "css-loader": "^0.16.0",
30 | "eslint-loader": "^1.0.0",
31 | "eslint-plugin-react": "^3.2.3",
32 | "eslint-config-airbnb": "^0.0.7",
33 | "extract-text-webpack-plugin": "^0.8.2",
34 | "file-loader": "^0.8.4",
35 | "less": "^2.5.1",
36 | "less-loader": "^2.2.0",
37 | "react-hot-loader": "^1.2.8",
38 | "style-loader": "^0.12.3",
39 | "svgo": "^0.5.6",
40 | "svgo-loader": "^1.1.0",
41 | "url-loader": "^0.5.6",
42 | "webpack": "^1.11.0",
43 | "webpack-dev-server": "^1.10.1"
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/themes/base/source/less/includes/pagination.less:
--------------------------------------------------------------------------------
1 | //
2 | // Pagination
3 | // --------------------------------------------------
4 | .pagination{
5 | padding-top: 61px;
6 | .clearfix();
7 |
8 | .pagination-block{
9 | font-family: @font-family-heading;
10 | font-size: 14px;
11 | font-weight: 600;
12 | line-height: 38px;
13 | letter-spacing: 1px;
14 | text-transform: uppercase;
15 | text-align: center;
16 | color: #585858;
17 | background-color: #fff;
18 | margin-top: 4px;
19 | border: 1px solid #cdcccd;
20 | width: 40px;
21 | height: 40px;
22 | cursor: pointer;
23 | float: left;
24 | .transition(~"color 200ms, border-color 200ms, background-color 200ms");
25 |
26 | & + .pagination-block{
27 | margin-left: 5px;
28 | }
29 |
30 | &:hover{
31 | color: #fff;
32 | background-color: #cdcccd;
33 | }
34 |
35 | &.next,
36 | &.prev{
37 | width: auto;
38 | padding-left: 15px;
39 | padding-right: 15px;
40 | }
41 |
42 | &.active{
43 | background-color: @brand-primary;
44 | border-color: @brand-primary;
45 | color: #fff;
46 |
47 | &:hover{
48 | background-color: @brand-primary;
49 | border-color: @brand-primary;
50 | }
51 | }
52 | }
53 |
54 | // todo merge these
55 | span.pagination-block{
56 | background-color: @brand-primary;
57 | border-color: @brand-primary;
58 | color: #fff;
59 |
60 | &:hover{
61 | background-color: @brand-primary;
62 | border-color: @brand-primary;
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/themes/base/source/js/reducers/eventReducers.js:
--------------------------------------------------------------------------------
1 | /*eslint-disable */
2 |
3 | import { handleActions } from 'redux-actions';
4 | import objectAssign from 'object-assign';
5 |
6 | export const events = handleActions({
7 |
8 | SET_SEARCH_TERM: (state, action) => {
9 | return {
10 | ...state,
11 | term: action.payload.term
12 | };
13 | },
14 |
15 | GET_EVENTS: (state, action) => {
16 | return {
17 | ...state,
18 | events: JSON.parse(action.payload.objects),
19 | count: action.payload.count,
20 | page: action.payload.page,
21 | country: action.payload.country,
22 | month: action.payload.month,
23 | eventType: action.payload.eventType,
24 | term: action.payload.term
25 | };
26 | },
27 |
28 | GET_CATEGORIES: (state, action) => {
29 | return {
30 | ...state,
31 | categories: JSON.parse(action.payload.objects)
32 | };
33 | },
34 |
35 | GET_COUNTRIES: (state, action) => {
36 | return {
37 | ...state,
38 | countries: JSON.parse(action.payload.objects)
39 | };
40 | },
41 |
42 | GET_MONTHS: (state, action) => {
43 | return {
44 | ...state,
45 | months: JSON.parse(action.payload.objects)
46 | };
47 | },
48 |
49 | GET_EVENTTYPES: (state, action) => {
50 | return {
51 | ...state,
52 | eventTypes: JSON.parse(action.payload.objects)
53 | };
54 | },
55 |
56 | }, {
57 | countries: [],
58 | months: [],
59 | eventTypes: [],
60 | events: [],
61 | count: 0,
62 | term: '',
63 | page: 1
64 | });
65 | /*eslint-enable */
66 |
--------------------------------------------------------------------------------
/themes/base/source/js/actions/eventActions.js:
--------------------------------------------------------------------------------
1 | /*eslint-disable */
2 |
3 | import { createAction } from 'redux-actions';
4 | import request from 'superagent';
5 |
6 | function ajax(method, url, data = null) {
7 | return new Promise(function (resolve, reject) {
8 | var req = request;
9 | method = method.toUpperCase();
10 |
11 | if (method === 'POST') {
12 | req = req.post(url).send(data);
13 | } else {
14 | req = req.get(url);
15 | }
16 |
17 | req.end(function (err, res) {
18 | if (res.ok) {
19 | resolve(res.text);
20 | } else {
21 | reject(res.text);
22 | }
23 | });
24 | });
25 | }
26 |
27 | export const setSearchTerm = createAction('SET_SEARCH_TERM', (term) => {
28 | return {term: term}
29 | });
30 |
31 | export const getEvents = createAction('GET_EVENTS', (page = 1, keyword = '', countryId = '', monthStr = '', eventId = '') => {
32 | const keywordQuery = keyword !== '' ? `&keywords=${keyword}` : '';
33 | const countryQuery = countryId !== '' ? `&country=${countryId}` : '';
34 | const monthQuery = monthStr !== '' ? `&month=${monthStr}` : '';
35 | const eventTypeQuery = eventId !== '' ? `&eventType=${eventId}` : '';
36 | return ajax('GET', `api/events/?page=${page}${keywordQuery}${countryQuery}${monthQuery}${eventTypeQuery}`)
37 | .then(JSON.parse)
38 | .then((data) => ({...data, page, term: keyword, country: countryId, month: monthStr, eventType: eventId}));
39 | });
40 |
41 | export const getCountries = createAction('GET_COUNTRIES', () => {
42 | return ajax('GET', `api/countries`)
43 | .then(JSON.parse)
44 | .then((data) => ({...data}));
45 | });
46 |
47 | export const getMonths = createAction('GET_MONTHS', () => {
48 | return ajax('GET', `api/months`)
49 | .then(JSON.parse)
50 | .then((data) => ({...data}));
51 | });
52 |
53 | export const getEventTypes = createAction('GET_EVENTTYPES', () => {
54 | return ajax('GET', `api/eventTypes`)
55 | .then(JSON.parse)
56 | .then((data) => ({...data}));
57 | });
58 |
59 | /*eslint-enable */
60 |
--------------------------------------------------------------------------------
/themes/base/source/less/components/bootstrap.less:
--------------------------------------------------------------------------------
1 | //When adding new features such as carousels and modals etc - make sure you uncomment out the necessary less files.
2 |
3 | // Core variables and mixins
4 | @import "~bootstrap/less/variables.less";
5 | @import "~bootstrap/less/mixins.less";
6 |
7 | // Reset and dependencies
8 | @import "~bootstrap/less/normalize.less";
9 | @import "~bootstrap/less/print.less";
10 | //@import "~bootstrap/less/glyphicons.less";
11 |
12 | // Core CSS
13 | @import "~bootstrap/less/scaffolding.less";
14 | @import "~bootstrap/less/type.less";
15 | @import "~bootstrap/less/code.less";
16 | @import "~bootstrap/less/grid.less";
17 | //@import "~bootstrap/less/tables.less";
18 | @import "~bootstrap/less/forms.less";
19 | //@import "~bootstrap/less/buttons.less";
20 |
21 | // Components
22 | @import "~bootstrap/less/component-animations.less";
23 | //@import "~bootstrap/less/dropdowns.less";
24 | //@import "~bootstrap/less/button-groups.less";
25 | //@import "~bootstrap/less/input-groups.less";
26 | @import "~bootstrap/less/navs.less";
27 | @import "~bootstrap/less/navbar.less";
28 | @import "~bootstrap/less/breadcrumbs.less";
29 | @import "~bootstrap/less/pagination.less";
30 | @import "~bootstrap/less/pager.less";
31 | //@import "~bootstrap/less/labels.less";
32 | //@import "~bootstrap/less/badges.less";
33 | //@import "~bootstrap/less/jumbotron.less";
34 | //@import "~bootstrap/less/thumbnails.less";
35 | //@import "~bootstrap/less/alerts.less";
36 | //@import "~bootstrap/less/progress-bars.less";
37 | //@import "~bootstrap/less/media.less";
38 | //@import "~bootstrap/less/list-group.less";
39 | //@import "~bootstrap/less/panels.less";
40 | //@import "~bootstrap/less/responsive-embed.less";
41 | //@import "~bootstrap/less/wells.less";
42 | //@import "~bootstrap/less/close.less";
43 |
44 | // Components w/ JavaScript
45 | //@import "~bootstrap/less/modals.less";
46 | //@import "~bootstrap/less/tooltip.less";
47 | //@import "~bootstrap/less/popovers.less";
48 | //@import "~bootstrap/less/carousel.less";
49 |
50 | // Utility classes
51 | @import "~bootstrap/less/utilities.less";
52 | @import "~bootstrap/less/responsive-utilities.less";
53 |
--------------------------------------------------------------------------------
/mysite/code/API/EventService.php:
--------------------------------------------------------------------------------
1 | setItemsPerPage($this->stat('items_per_page'));
22 | parent::__construct($request);
23 | }
24 |
25 | public function filterObjects(SS_List $events)
26 | {
27 | $events = parent::filterObjects($events);
28 |
29 | if ($this->request->getVar('country') && $this->request->getVar('country') > 0) {
30 | $events = $events->filter('CountryID', intval($this->request->getVar('country')));
31 | }
32 |
33 | if ($this->request->getVar('eventType') && $this->request->getVar('eventType') > 0) {
34 | $events = $events->filter('EventTypeID', intval($this->request->getVar('eventType')));
35 | }
36 |
37 | if ($this->request->getVar('month') && $this->request->getVar('month') > 0) {
38 |
39 | $sanitizeMonth = date("Y-m-d H:i:s", $this->request->getVar('month'));
40 | $month = date('Y-m-d H:i:s', strtotime($sanitizeMonth));
41 | $plusOneMonth = date('Y-m-d H:i:s', strtotime($sanitizeMonth . " + 1 month"));
42 | $events = $events->filter(
43 | array(
44 | 'StartTime:GreaterThan' => $month,
45 | 'StartTime:LessThan' => $plusOneMonth
46 | )
47 | );
48 | }
49 |
50 | if ($this->request->getVar('keywords') && $this->request->getVar('keywords') !== '') {
51 |
52 | $keywords = $this->request->getVar('keywords');
53 | $events = $events->filterAny(
54 | array(
55 | 'Title:PartialMatch' => $keywords,
56 | 'Content:PartialMatch' => $keywords
57 | )
58 | );
59 |
60 | }
61 |
62 | return $events;
63 | }
64 |
65 | }
66 |
--------------------------------------------------------------------------------
/themes/base/source/js/components/Pagination.js:
--------------------------------------------------------------------------------
1 | /*eslint-disable */
2 |
3 | import React, {Component, PropTypes} from 'react';
4 | import classNames from 'classnames';
5 |
6 | export default class EventsApp extends Component {
7 |
8 | static propTypes = {
9 | count: PropTypes.number,
10 | page: PropTypes.number,
11 | handlePage: PropTypes.func
12 | };
13 |
14 | static defaultProps = {
15 | handlePage: () => {},
16 | count: 0,
17 | page: 1
18 | };
19 |
20 | render() {
21 | const {count, page, maxLinks} = this.props;
22 |
23 | if (count == 0) {
24 | return ();
25 | }
26 |
27 | let start = page - Math.floor(maxLinks / 2);
28 | let end = start + maxLinks;
29 |
30 | if (start < 1) {
31 | start = 1;
32 | end = maxLinks + start;
33 | }
34 |
35 | if (end > count) {
36 | end = count;
37 | start = Math.max(1, end - maxLinks);
38 | }
39 |
40 | const notFirstPage = page !== 1;
41 | const notLastPage = count !== page;
42 | const pages = Array.from({length: end - start}).map((v, i) => start + i);
43 |
44 | return (
45 |
46 | {notFirstPage ?
47 |
49 |
50 |
: null}
51 | {notFirstPage ?
52 |
54 | Prev
55 |
: null}
56 | {pages.map(v => {
57 | return (
58 |
{v}
62 |
63 | )
64 | })}
65 | {notLastPage ?
66 |
68 | Next
69 |
: null}
70 | {notLastPage ?
71 |
73 |
74 |
: null}
75 |
76 | );
77 | }
78 |
79 | }
80 | /*eslint-enable */
81 |
--------------------------------------------------------------------------------
/themes/base/source/less/components/grid.less:
--------------------------------------------------------------------------------
1 | // Had to add push and pull classes for xs grid because they don't exist in bootstrap currently
2 |
3 | // Push and pull columns for source order changes
4 | .col-xs-push-1 { left: percentage((1 / @grid-columns)); }
5 | .col-xs-push-2 { left: percentage((2 / @grid-columns)); }
6 | .col-xs-push-3 { left: percentage((3 / @grid-columns)); }
7 | .col-xs-push-4 { left: percentage((4 / @grid-columns)); }
8 | .col-xs-push-5 { left: percentage((5 / @grid-columns)); }
9 | .col-xs-push-6 { left: percentage((6 / @grid-columns)); }
10 | .col-xs-push-7 { left: percentage((7 / @grid-columns)); }
11 | .col-xs-push-8 { left: percentage((8 / @grid-columns)); }
12 | .col-xs-push-9 { left: percentage((9 / @grid-columns)); }
13 | .col-xs-push-10 { left: percentage((10/ @grid-columns)); }
14 | .col-xs-push-11 { left: percentage((11/ @grid-columns)); }
15 |
16 | .col-xs-pull-1 { right: percentage((1 / @grid-columns)); }
17 | .col-xs-pull-2 { right: percentage((2 / @grid-columns)); }
18 | .col-xs-pull-3 { right: percentage((3 / @grid-columns)); }
19 | .col-xs-pull-4 { right: percentage((4 / @grid-columns)); }
20 | .col-xs-pull-5 { right: percentage((5 / @grid-columns)); }
21 | .col-xs-pull-6 { right: percentage((6 / @grid-columns)); }
22 | .col-xs-pull-7 { right: percentage((7 / @grid-columns)); }
23 | .col-xs-pull-8 { right: percentage((8 / @grid-columns)); }
24 | .col-xs-pull-9 { right: percentage((9 / @grid-columns)); }
25 | .col-xs-pull-10 { right: percentage((10/ @grid-columns)); }
26 | .col-xs-pull-11 { right: percentage((11/ @grid-columns)); }
27 |
28 | // Offsets
29 | .col-xs-offset-1 { margin-left: percentage((1 / @grid-columns)); }
30 | .col-xs-offset-2 { margin-left: percentage((2 / @grid-columns)); }
31 | .col-xs-offset-3 { margin-left: percentage((3 / @grid-columns)); }
32 | .col-xs-offset-4 { margin-left: percentage((4 / @grid-columns)); }
33 | .col-xs-offset-5 { margin-left: percentage((5 / @grid-columns)); }
34 | .col-xs-offset-6 { margin-left: percentage((6 / @grid-columns)); }
35 | .col-xs-offset-7 { margin-left: percentage((7 / @grid-columns)); }
36 | .col-xs-offset-8 { margin-left: percentage((8 / @grid-columns)); }
37 | .col-xs-offset-9 { margin-left: percentage((9 / @grid-columns)); }
38 | .col-xs-offset-10 { margin-left: percentage((10/ @grid-columns)); }
39 | .col-xs-offset-11 { margin-left: percentage((11/ @grid-columns)); }
--------------------------------------------------------------------------------
/themes/base/source/js/components/EventsApp.js:
--------------------------------------------------------------------------------
1 | /*eslint-disable */
2 |
3 | import React, {Component, PropTypes} from 'react';
4 | import {getCountries, getMonths, getEventTypes, getEvents} from '../actions/eventActions';
5 | import Pagination from './Pagination';
6 | import EventFilters from './EventFilters';
7 |
8 | export default class EventsApp extends Component {
9 |
10 | handlePage(page) {
11 | this.props.dispatch(
12 | getEvents(
13 | page,
14 | this.props.events.term,
15 | this.props.events.country,
16 | this.props.events.month,
17 | this.props.events.eventType
18 | )
19 | );
20 | }
21 |
22 | componentDidMount() {
23 | this.props.dispatch(getEvents(1));
24 | this.props.dispatch(getCountries());
25 | this.props.dispatch(getMonths());
26 | this.props.dispatch(getEventTypes());
27 | }
28 |
29 | getEvents() {
30 | if (this.props.events.count) {
31 | return this.props.events.events.map(event =>
32 |
33 |
34 | {event.StartTime}
35 |
36 |
37 |
38 |
39 |
{event.Content}
40 |
41 |
42 |
43 |
44 |
Location
45 |
{event.LocationAddress}
46 |
47 |
48 |
49 |
50 | );
51 | } else {
52 | return (Sorry there are no events
);
53 | }
54 | }
55 |
56 | render() {
57 |
58 | const events = this.getEvents();
59 |
60 | return (
61 |
62 |
63 |
64 |
65 | {events}
66 |
67 |
72 |
73 | );
74 | }
75 |
76 | }
77 | /*eslint-enable */
78 |
--------------------------------------------------------------------------------
/mysite/code/PageTypes/EventPage.php:
--------------------------------------------------------------------------------
1 | 'Varchar(256)',
13 | 'LocationAddress' => 'Text',
14 | 'StartTime' => 'SS_DateTime',
15 | 'EndTime' => 'SS_DateTime'
16 | );
17 | /**
18 | * @var array
19 | */
20 | private static $has_one = array(
21 | 'EventType' => 'EventType',
22 | 'Image' => 'Image',
23 | 'Country' => 'Country'
24 | );
25 |
26 | private static $api_information = array(
27 | 'ID' => 'ID',
28 | 'Title' => 'Title',
29 | 'EventTypeID' => 'EventTypeID',
30 | 'CountryID' => 'CountryID',
31 | 'getShortContent' => 'Content',
32 | 'StartTime' => 'StartTime',
33 | 'getImageURL' => 'ImageURL',
34 | 'LocationAddress' => 'LocationAddress',
35 | 'AbsoluteLink' => 'Link'
36 | );
37 |
38 | public function getImageURL()
39 | {
40 | return $this->Image() && $this->Image()->exists() ? $this->Image()->CroppedImage(170,195)->URL : false;
41 | }
42 |
43 | public function getShortContent()
44 | {
45 | return $this->dbObject('Content')->LimitCharacters(200);
46 | }
47 |
48 | public function getCMSFields()
49 | {
50 | $fields = parent::getCMSFields();
51 | $eventTypeSource = EventType::get()->map()->toArray();
52 | $countrySource = Country::get()->map()->toArray();
53 |
54 | $fields->addFieldsToTab(
55 | 'Root.Main',
56 | array(
57 | TextField::create('LocationName', 'Location Name'),
58 | TextareaField::create('LocationAddress', 'Location Address'),
59 | $startDate = DatetimeField::create('StartTime', 'Start'),
60 | $endDate = DatetimeField::create('EndTime', 'End'),
61 | TextareaField::create('Price', 'Price'),
62 | DropdownField::create('EventTypeID', 'Type', $eventTypeSource),
63 | DropdownField::create('CountryID', 'Country', $countrySource),
64 | UploadField::create('Image', 'Image')
65 | )
66 | );
67 |
68 | $date = Date('Y-m-d', time());
69 | $time = Date('H:i:s', time());
70 |
71 | $startDate->getDateField()->setConfig('showcalendar', true);
72 | $startDate->getDateField()->setValue($date);
73 | $startDate->getTimeField()->setValue($time);
74 |
75 | $endDate->getDateField()->setConfig('showcalendar', true);
76 | $endDate->getDateField()->setValue($date);
77 | $endDate->getTimeField()->setValue($time);
78 |
79 |
80 | return $fields;
81 | }
82 |
83 | }
84 |
85 | /**
86 | * Class EventPage_Controller
87 | */
88 | class EventPage_Controller extends Page_Controller
89 | {
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/themes/base/source/less/layout/postcard-layout.less:
--------------------------------------------------------------------------------
1 | //
2 | // Postcard Layout
3 | // --------------------------------------------------
4 | .postcard-layout{
5 |
6 | // Postcard
7 | // --------------------------------------------------
8 | .postcard{
9 | border: 1px solid #cdcccd;
10 | background-color: #fff;
11 | display: flex;
12 | align-items: center;
13 | .clearfix();
14 |
15 | & + .postcard{
16 | margin-top: 15px;
17 | }
18 |
19 | &.short-height{
20 | .postcard-right,
21 | .postcard-center{
22 | height: 185px;
23 | }
24 |
25 | .postcard-center{
26 | p{
27 | font-size: 16px;
28 | }
29 |
30 | a{
31 | strong{
32 | font-weight: 600;
33 | }
34 | }
35 | }
36 | }
37 | }
38 |
39 | // Postcard segments
40 | // --------------------------------------------------
41 | .postcard-left,
42 | .postcard-center,
43 | .postcard-right{
44 | float: left;
45 | padding-left: 30px;
46 | padding-right: 30px;
47 | padding-top: 0;
48 |
49 | &.no-padding{
50 | padding: 0;
51 | }
52 |
53 | &.border-left{
54 | border-left: 1px solid #cdcccd;
55 | }
56 | }
57 |
58 | // Postcard left
59 | // -------------------------
60 | .postcard-left{
61 | width: 170px;
62 | position: relative;
63 |
64 | .postcard-img{
65 | display: block;
66 | }
67 |
68 | .postcard-label{
69 | font-family: @font-family-heading;
70 | text-align: center;
71 | font-size: 20px;
72 | color: #fff;
73 | line-height: 1.3;
74 | letter-spacing: 1px;
75 | font-weight: 700;
76 | background-color: rgba(45,43,44,0.9);
77 | padding: 12px 0;
78 | position: absolute;
79 | top: 0;
80 | left: 0;
81 | right: 0;
82 | }
83 | }
84 |
85 | // Postcard center
86 | // -------------------------
87 | .postcard-center{
88 | width: 480px;
89 | height: 195px;
90 | padding-bottom: 0;
91 |
92 | &.full-width{
93 | width: 675px;
94 | }
95 | }
96 |
97 | // Postcard right
98 | // -------------------------
99 | .postcard-right{
100 | width: 195px;
101 | height: 195px;
102 | padding-top: 0;
103 | padding-bottom: 0;
104 | }
105 |
106 | // Generic typography
107 | // --------------------------------------------------
108 | h2{
109 | font-size: 22px;
110 | line-height: 1.2;
111 | font-weight: 700;
112 | margin-bottom: 15px;
113 |
114 | a{
115 | color: #231f20;
116 |
117 | &:hover{
118 | color: @brand-primary;
119 | }
120 | }
121 | }
122 |
123 | h3{
124 | font-size: 20px;
125 | font-weight: 700;
126 | margin-bottom: 10px;
127 |
128 | svg{
129 | vertical-align: middle;
130 | margin-right: 5px;
131 | }
132 | }
133 |
134 | p{
135 | font-family: @font-family-heading;
136 | font-size: 15px;
137 | margin-bottom: 0;
138 |
139 | & + p{
140 | margin-top: 5px;
141 | }
142 | }
143 |
144 | .btn + .btn{
145 | margin-top: 15px;
146 | }
147 | }
148 |
--------------------------------------------------------------------------------
/themes/base/source/js/components/EventFilters.js:
--------------------------------------------------------------------------------
1 | /*eslint-disable */
2 |
3 | import React, {Component} from 'react';
4 | import {getCountries, getMonths, getEventTypes, getEvents, setSearchTerm} from '../actions/eventActions';
5 | import SearchFilter from './filters/SearchFilter';
6 | import DropdownFilter from './filters/DropdownFilter';
7 | import ResetFilters from './filters/ResetFilters';
8 |
9 | export default class EventFilters extends Component {
10 |
11 | handleCountryChange(event) {
12 | this.props.dispatch(
13 | getEvents(
14 | 1,
15 | this.props.events.term,
16 | event.target.value,
17 | this.props.events.month,
18 | this.props.events.eventType
19 | )
20 | );
21 | }
22 |
23 | handleMonthChange(event) {
24 | this.props.dispatch(
25 | getEvents(
26 | 1,
27 | this.props.events.term,
28 | this.props.events.country,
29 | event.target.value,
30 | this.props.events.eventType
31 | )
32 | );
33 | }
34 |
35 | handleEventTypeChange(event) {
36 | this.props.dispatch(
37 | getEvents(
38 | 1,
39 | this.props.events.term,
40 | this.props.events.country,
41 | this.props.events.month,
42 | event.target.value
43 | )
44 | );
45 | }
46 |
47 | clearFilters() {
48 | this.props.dispatch(
49 | getEvents(
50 | 1,
51 | '',
52 | '',
53 | '',
54 | ''
55 | )
56 | );
57 | }
58 |
59 | render() {
60 | return (
61 |
62 |
63 |
64 |
65 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
84 |
85 |
86 |
87 |
94 |
95 |
96 |
97 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 | );
112 | }
113 | }
114 |
115 | /*eslint-enable */
116 |
--------------------------------------------------------------------------------
/mysite/code/API/WebServiceController.php:
--------------------------------------------------------------------------------
1 | param('Action');
27 | if(in_array($action, $this->stat('allowed_actions'))){
28 | return $this->{$action}($request);
29 | }
30 |
31 | $this->httpError(404);
32 | return $this;
33 | }
34 |
35 | /**
36 | * @param $request
37 | * @return SS_HTTPResponse
38 | */
39 | public function events($request)
40 | {
41 | $response = Controller::curr()->getResponse();
42 | $service = new EventService($request);
43 | $objects = $service->processRequest();
44 |
45 | $responseData = array(
46 | 'objects' => $service->formatObjects($service->paginateObjects($objects)),
47 | 'count' => ceil($objects->count() / $service->getItemsPerPage())
48 | );
49 |
50 | $response = $response->setBody(json_encode($responseData));
51 |
52 | return $response;
53 | }
54 |
55 | /**
56 | * @return SS_HTTPRequest|SS_HTTPResponse
57 | */
58 | public function months()
59 | {
60 | $currentMonth = date('F Y');
61 |
62 | $months[] = array(
63 | 'Title' => $currentMonth,
64 | 'ID' => strtotime($currentMonth)
65 | );
66 | for ($i = 0; $i < 11; $i++) {
67 | $currentMonth = date('F Y', strtotime($currentMonth . " + 1 month"));
68 | $months[] = array(
69 | 'Title' => $currentMonth,
70 | 'ID' => strtotime($currentMonth)
71 | );
72 | }
73 |
74 | $responseData = array(
75 | 'objects' => json_encode($months),
76 | 'count' => 12
77 | );
78 | $response = Controller::curr()->getResponse();
79 | $response = $response->setBody(json_encode($responseData));
80 | return $response;
81 | }
82 |
83 | /**
84 | * @param $request
85 | * @return SS_HTTPRequest|SS_HTTPResponse
86 | */
87 | public function countries($request)
88 | {
89 | $response = Controller::curr()->getResponse();
90 | $service = new CountryService($request);
91 | $objects = $service->processRequest();
92 | $responseData = array(
93 | 'objects' => $service->formatObjects($objects),
94 | 'count' => $objects->count()
95 | );
96 | $response = $response->setBody(json_encode($responseData));
97 | return $response;
98 | }
99 |
100 | /**
101 | * @param $request
102 | * @return SS_HTTPRequest|SS_HTTPResponse
103 | */
104 | public function eventTypes($request)
105 | {
106 | $response = Controller::curr()->getResponse();
107 | $service = new EventTypeService($request);
108 | $objects = $service->processRequest();
109 | $responseData = array(
110 | 'objects' => $service->formatObjects($objects),
111 | 'count' => $objects->count()
112 | );
113 | $response = $response->setBody(json_encode($responseData));
114 | return $response;
115 | }
116 |
117 | }
118 |
--------------------------------------------------------------------------------
/themes/base/webpack.config.js:
--------------------------------------------------------------------------------
1 | var path = require('path');
2 | var webpack = require('webpack');
3 | var ExtractTextPlugin = require('extract-text-webpack-plugin');
4 |
5 | var PRODUCTION = process.env.NODE_ENV === 'production';
6 | var PORT = process.env.PORT || 3000;
7 | var HOST = process.env.HOST || 'localhost';
8 | var CLIENT_SERVER = 'http://' + HOST + ':' + PORT;
9 | var LINT_WATCH = process.argv.slice(2).length && process.argv.slice(2)[0] === 'lint';
10 |
11 |
12 | var EXCLUDE_JS = [
13 | /node_modules/
14 | ];
15 |
16 | /**
17 | *
18 | * @type {*[]}
19 | */
20 | var plugins = [
21 | new webpack.HotModuleReplacementPlugin(),
22 | new ExtractTextPlugin('css/[name].css')
23 | ];
24 |
25 | /**
26 | * Plugins that will only be included in development
27 | * @type {Array}
28 | */
29 | var devPlugins = [];
30 |
31 | /**
32 | * Plugins that will only be included in production
33 | * @type {*[]}
34 | */
35 | var productionPlugins = [
36 | new webpack.optimize.UglifyJsPlugin({minimize: true})
37 | ];
38 |
39 | /**
40 | * Assets that will only be included in development
41 | * @type {string[]}
42 | */
43 | var devServerEntry = [
44 | 'webpack-dev-server/client?' + CLIENT_SERVER +'/',
45 | 'webpack/hot/only-dev-server'
46 | ];
47 |
48 | /**
49 | * Styles should only be extracted in production to allow hot-reload of css
50 | * @param loader
51 | * @returns {*}
52 | */
53 | function styleLoader(loader) {
54 | if(PRODUCTION) return ExtractTextPlugin.extract('style-loader', loader);
55 | return 'style-loader!' + loader;
56 | }
57 |
58 | /**
59 | *
60 | * @returns {string}
61 | */
62 | function autoPrefixLoader() {
63 | return 'autoprefixer-loader?' + JSON.stringify({
64 | browsers: ['Firefox > 20', 'iOS 7', 'IE 9']
65 | });
66 | }
67 |
68 | /**
69 | *
70 | * @type {*[]}
71 | */
72 | var loaders = [
73 | {
74 | test: /\.js$/,
75 | loaders: ['react-hot', 'babel'],
76 | exclude: EXCLUDE_JS,
77 | include: __dirname
78 | },
79 | {
80 | test: /\.css$/,
81 | loader: styleLoader('css-loader!' + autoPrefixLoader())
82 | },
83 | {
84 | test: /\.less/,
85 | loader: styleLoader('css-loader!' + autoPrefixLoader() + '!less-loader')
86 | },
87 | {
88 | test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
89 | loader: "url-loader?limit=10000&minetype=application/font-woff&name=fonts/[name].[ext]"
90 | },
91 | {
92 | test: /\.(ttf|eot)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
93 | loader: "file-loader?name=fonts/[name].[ext]"
94 | },
95 | {
96 | test: /\.jpg|\.png|\.gif$/,
97 | loader: "file-loader?name=images/[name].[ext]"
98 | },
99 | {
100 | test: /\.svg/,
101 | loader: "file-loader?name=svg/[name].[ext]!svgo-loader"
102 | },
103 | {
104 | test: /\.ss/,
105 | loader: 'file-loader?name=../templates/Includes/Webpack/[name].[ext]'
106 | }
107 | ];
108 |
109 | /**
110 | *
111 | * @type {*[]}
112 | */
113 | var preLoaders = [
114 | {test: /\.js$/, loader: "eslint-loader", exclude: EXCLUDE_JS}
115 | ];
116 |
117 | module.exports = {
118 |
119 | entry: {
120 | main: PRODUCTION ? ['./source']: devServerEntry.concat(['./source'])
121 | },
122 |
123 | output: {
124 | filename: 'js/main.js',
125 | path: path.join(__dirname, 'production'),
126 | publicPath: PRODUCTION ? '/production/' : 'http://localhost:3000/production/'
127 | },
128 |
129 | eslint: {configFile: '.eslintrc'},
130 | devtool: PRODUCTION ? null : 'cheap-module-eval-source-map',
131 | module: {loaders: loaders, preLoaders: LINT_WATCH || PRODUCTION ? preLoaders : []},
132 | plugins: PRODUCTION ? plugins.concat(productionPlugins) : plugins.concat(devPlugins)
133 |
134 | };
135 |
--------------------------------------------------------------------------------
/themes/base/source/less/components/buttons.less:
--------------------------------------------------------------------------------
1 | // ==================================================
2 | // Buttons
3 | // ==================================================
4 |
5 | //
6 | // Button Mixin
7 | // --------------------------------------------------
8 | .button(@name, @color, @color-secondary){
9 | &.btn-@{name} {
10 | color: #fff;
11 | background-color: @color;
12 | border-color: transparent;
13 |
14 | &:hover{
15 | color: #fff;
16 | background-color: @color-secondary;
17 | }
18 |
19 | &:active{
20 | .scale(0.95);
21 | }
22 | }
23 | }
24 |
25 | //
26 | // Base Style
27 | // --------------------------------------------------
28 | .btn {
29 | //** Set button colours
30 | .button(primary, @brand-primary, lighten(@brand-primary, 5%));
31 | .button(secondary, @brand-secondary, lighten(@brand-secondary, 10%));
32 | .button(danger, @brand-danger, #e63c45);
33 | .button(white, #fff, @brand-primary);
34 | //** Set button transition
35 | .transition(~"color 200ms, background-color 200ms, border-color 200ms, transform 75ms");
36 |
37 |
38 | font-family: @btn-font-family;
39 | font-size: @btn-font-size;
40 | color: #fff;
41 | font-weight: @btn-font-weight;
42 | text-transform: @btn-text-transform;
43 | background-color: transparent;
44 | height: @btn-height;
45 | line-height: @btn-line-height; // Font baseline is slightly off
46 | letter-spacing: @btn-letter-spacing;
47 | padding: 0 @btn-hrz-padding;
48 | border-radius: @btn-border-radius;
49 | border: none;
50 | text-align: center;
51 | outline: 0;
52 | display: inline-block;
53 | position: relative;
54 | cursor: pointer;
55 | z-index: 0;
56 | overflow: hidden;
57 |
58 | //** Large button variation
59 | &.btn-lg{
60 | font-size: @btn-font-size-lg;
61 | line-height: @btn-line-height-lg;
62 | height: @btn-height-lg;
63 | padding: 0 @btn-hrz-padding-lg;
64 | }
65 |
66 | &.btn-block{
67 | width: 100%;
68 | display: block;
69 | padding-left: 0;
70 | padding-right: 0;
71 |
72 | &.btn-lg{
73 | padding-left: 0;
74 | padding-right: 0;
75 | }
76 | }
77 |
78 | svg{
79 | vertical-align: middle;
80 | margin-left: 10px;
81 | }
82 |
83 | //** White button bespoke variant
84 | &.btn-white{
85 | color: #585858;
86 | border: 1px solid @input-border;
87 |
88 | &:hover{
89 | color: #fff;
90 | border-color: @brand-primary;
91 | }
92 | }
93 |
94 | //
95 | // Social login buttons
96 | // --------------------------------------------------
97 | &.btn-social{
98 | font-size: 16px;
99 | font-weight: 600;
100 | letter-spacing: 0;
101 | text-transform: none;
102 | width: 100%;
103 | display: block;
104 | padding-right: 0;
105 | padding-left: @btn-height;
106 |
107 | &:hover,
108 | &:active,
109 | &:focus{
110 | color: #fff;
111 | }
112 |
113 | &:active{
114 | .scale(0.95);
115 | }
116 |
117 | & + .btn-social{
118 | margin-top: 15px;
119 | }
120 |
121 | span{
122 | text-align: center;
123 | //** reset inline-block elements
124 | font-size: 0;
125 | display: block;
126 | height: @btn-height;
127 | width: @btn-height;
128 | position: absolute;
129 | top: 0;
130 | left: 0;
131 | background-color: rgba(0,0,0,0.12);
132 | }
133 |
134 | svg{
135 | margin: 0;
136 | vertical-align: middle;
137 | }
138 |
139 | &.btn-lg{
140 | padding-left: @btn-height-lg;
141 |
142 | span{
143 | height: @btn-height-lg;
144 | width: @btn-height-lg;
145 | }
146 | }
147 | }
148 |
149 | //** Facebook button
150 | //** Used for Facebook sign in
151 | &.btn-facebook{
152 | background-color: #43649e;
153 |
154 | &:hover{
155 | background-color: lighten(#43649e, 6%);
156 | }
157 | }
158 |
159 | //** LinkedIn button
160 | //** Used for LinkedIn sign in
161 | &.btn-linkedin{
162 | background-color: #1fa7df;
163 |
164 | &:hover{
165 | background-color: lighten(#1fa7df, 6%);
166 | }
167 | }
168 | }
--------------------------------------------------------------------------------
/mysite/code/API/DataObjectService.php:
--------------------------------------------------------------------------------
1 | 'Title',
24 | * 'getLink' => 'URL'
25 | * );
26 | *
27 | * @var array
28 | */
29 | private $api_return = array();
30 |
31 | /**
32 | * @param SS_HTTPRequest $request
33 | * @throws Exception
34 | */
35 | public function __construct(SS_HTTPRequest $request)
36 | {
37 | $this->request = $request;
38 |
39 |
40 | $class = $this->stat('class_name');
41 | if (!$class) {
42 | throw new Exception('class_name must be implemented in subclasses of ' . __CLASS__);
43 | }
44 |
45 | $this->api_return = Config::inst()->get($class, 'api_information');
46 |
47 | parent::__construct();
48 | }
49 |
50 | /**
51 | * @return mixed
52 | */
53 | public function getItemsPerPage()
54 | {
55 | return $this->itemsPerPage;
56 | }
57 |
58 | /**
59 | * @param mixed $itemsPerPage
60 | */
61 | public function setItemsPerPage($itemsPerPage)
62 | {
63 | $this->itemsPerPage = $itemsPerPage;
64 | }
65 |
66 | /**
67 | * @return SS_HTTPResponse|SS_List
68 | */
69 | public function processRequest()
70 | {
71 | $class = Config::inst()->get(get_class($this), 'class_name');
72 |
73 | if($this->request->param('ID')){
74 | $id = intval($this->request->param('ID'));
75 |
76 | if($id > 0){
77 | $object = $class::get()->byID($id);
78 | }
79 | }
80 |
81 | return $this->getObjects();
82 | }
83 |
84 | /**
85 | * @return SS_HTTPResponse|SS_List
86 | */
87 | public function getObjects()
88 | {
89 | if(!class_exists($this->stat('class_name'))){
90 | return $this->response(500, 'Could not find class');
91 | }
92 |
93 | if(!(singleton($this->stat('class_name')) instanceof DataObject)){
94 | return $this->response(500, $this->stat('class_name') . ' is not an of the correct type.');
95 | }
96 |
97 | $class = $this->stat('class_name');
98 |
99 | $objects = $class::get();
100 |
101 | if(method_exists($this, 'filterObjects')){
102 | $objects = $this->filterObjects($objects);
103 | }
104 |
105 | return $objects;
106 | }
107 |
108 | /**
109 | * @param SS_List $objects
110 | * @return SS_List
111 | */
112 | public function filterObjects(SS_List $objects)
113 | {
114 | $filterable_attributes = Config::inst()->get(get_class($this), 'filter_attributes');
115 |
116 | if ($filterable_attributes) {
117 | foreach($filterable_attributes as $attribute)
118 | {
119 | if($value = $this->request->getVar($attribute)){
120 | $objects = $objects->filter($attribute, $value);
121 | }
122 | }
123 | }
124 |
125 | return $objects;
126 | }
127 |
128 | /**
129 | * @param $objects
130 | * @return mixed
131 | */
132 | public function paginateObjects($objects)
133 | {
134 | $page = intval($this->request->getVar('page')) ?: 1;
135 | // let page reflect realistic integer, not array index
136 | $page = $page - 1;
137 | return $objects->limit($this->itemsPerPage, $page * $this->itemsPerPage);
138 | }
139 |
140 | /**
141 | * @param SS_List $objects
142 | * @return string
143 | */
144 | public function formatObjects(SS_List $objects)
145 | {
146 | $returnList = array();
147 | foreach ($objects as $object) {
148 | $returnObject = array();
149 | foreach ($this->api_return as $key => $title) {
150 | if ($object->hasMethod($key)) {
151 | $returnObject[$title] = $object->{$key}();
152 | } else {
153 | $returnObject[$title] = $object->{$key};
154 | }
155 | }
156 | $returnList[] = $returnObject;
157 | }
158 |
159 | return json_encode($returnList);
160 | }
161 |
162 | }
163 |
--------------------------------------------------------------------------------
/themes/base/source/less/components/typography.less:
--------------------------------------------------------------------------------
1 | // ==================================================
2 | // Typography
3 | // ==================================================
4 | .typography {
5 |
6 | // Headings
7 | // --------------------------------------------------
8 | h1,
9 | .h1 {
10 | font-family: @font-family-heading;
11 | font-weight: @h1-font-weight;
12 | font-size: @h1-font-size;
13 | line-height: 1.2;
14 | color: @brand-secondary;
15 | margin: 0 0 30px 0;
16 | }
17 |
18 | h2,
19 | .h2
20 | {
21 | font-family: @font-family-heading;
22 | font-weight: @h2-font-weight;
23 | font-size: @h2-font-size;
24 | line-height: 1.3;
25 | color: @gray;
26 | margin: 0 0 45px 0;
27 | }
28 |
29 | h3,
30 | .h3
31 | {
32 | font-family: @font-family-heading;
33 | font-weight: @h3-font-weight;
34 | font-size: @h3-font-size;
35 | line-height: 1.4;
36 | color: @brand-primary;
37 | margin: 0 0 35px 0;
38 | }
39 |
40 | h4,
41 | .h4 {
42 | font-family: @font-family-base;
43 | text-transform: uppercase;
44 | font-weight: @h4-font-weight;
45 | font-size: @h4-font-size;
46 | letter-spacing: 1px;
47 | line-height: 1.5;
48 | color: @brand-secondary;
49 | margin: 0 0 30px 0;
50 | }
51 |
52 | h5,
53 | .h5 {
54 | font-family: @font-family-base;
55 | text-transform: uppercase;
56 | font-weight: @h5-font-weight;
57 | font-size: @h5-font-size;
58 | letter-spacing: 1px;
59 | line-height: 1.4;
60 | color: @brand-secondary;
61 | margin: 0 0 15px 0;
62 | }
63 |
64 | // Body
65 | // --------------------------------------------------
66 | p {
67 | font-weight: @normal;
68 | line-height: @line-height-base;
69 | color: @text-color;
70 | margin: 0 0 15px 0;
71 |
72 | }
73 |
74 |
75 | // List
76 | // --------------------------------------------------
77 | .ul-list {
78 | padding: 0;
79 | margin: 0;
80 | list-style-type: none;
81 | li {
82 | padding-left: 20px;
83 | position: relative;
84 | &:before {
85 | content: "\2022";
86 | position: absolute;
87 | top: 50%;
88 | left: 0;
89 | .translate(0;-50%);
90 | color: @gray;
91 | font-size: 1.5em;
92 | }
93 | }
94 | }
95 |
96 | // BlockQuotes
97 | // --------------------------------------------------
98 | blockquote {
99 | border-left: none;
100 | padding: 12px 55px;
101 | p {
102 | font-weight: @normal;
103 | span {
104 | font-weight: @bold;
105 | }
106 | }
107 | small {
108 | text-transform: uppercase;
109 | color: @text-color;
110 | &:before {
111 | content: '';
112 | }
113 | span {
114 | font-weight: @bold;
115 | }
116 | }
117 | }
118 |
119 | // Links
120 | // --------------------------------------------------
121 |
122 | a {
123 | color: @brand-primary;
124 | .transition(color 300ms);
125 | svg {
126 | .transition(fill 300ms);
127 | }
128 | &:hover,
129 | &:focus {
130 | color: @brand-secondary;
131 | text-decoration: none;
132 | }
133 | }
134 |
135 |
136 | // Tables
137 | // --------------------------------------------------
138 | table {
139 | border-collapse: collapse;
140 | td,
141 | th {
142 | padding: 10px;
143 | border-right: 1px solid @light-gray;
144 | &:first-child {
145 | border-left: 1px solid @light-gray;
146 | }
147 | }
148 | tr {
149 | border-bottom: 1px solid @light-gray;
150 | &:first-child {
151 | border-top: 1px solid @light-gray;
152 | }
153 | }
154 | thead {
155 | tr {
156 | background-color: @lighter-gray;
157 | }
158 | th {
159 | font-weight: @bold;
160 | color: @gray;
161 | }
162 | }
163 | tfoot {
164 | td {
165 | border: none;
166 | &:first-child {
167 | border: none;
168 | }
169 | }
170 | }
171 | }
172 | }
173 |
--------------------------------------------------------------------------------
/themes/base/source/less/helper/vars.less:
--------------------------------------------------------------------------------
1 | //
2 | // Vars
3 | // --------------------------------------------------
4 |
5 | //
6 | // Body
7 | // --------------------------------------------------
8 | @body-bg: #0d0c0d;
9 | @main-bg: #ebedee;
10 | @main-top-offset: 20px; // Sticky nav height
11 |
12 | //
13 | // Fonts
14 | // --------------------------------------------------
15 | // 'Droid Sans', sans-serif; 400, 700
16 | // 'proxima-nova', sans-serif; 400, 400 italic, 600, 700, 700 italic
17 | @font-family-base: 'Droid Sans', sans-serif;
18 | @font-family-body: 'Droid Sans', sans-serif;
19 | @font-family-heading: 'proxima-nova', sans-serif;
20 | @font-size-base: 16px;
21 | @font-size-large: ceil((@font-size-base * 1.25)); // ~18px
22 | @font-size-small: ceil((@font-size-base * 0.85)); // ~12px
23 | @line-height-base: 1.6;
24 |
25 | @light: 300;
26 | @normal: 400;
27 | @book: 400;
28 | @medium: 500;
29 | @semibold: 600;
30 | @bold: 700;
31 | @black: 800;
32 |
33 | //
34 | // Colours
35 | // --------------------------------------------------
36 | @brand-primary: #0099cc; //** Blue
37 | @brand-primary-light: lighten(@brand-primary, 15%); //** Blue
38 | @brand-secondary: #2d2b2c; //** Dark grey
39 | @brand-error: @brand-primary;
40 | @brand-danger: #d44950;
41 | @text-color: #585858;
42 | @light-gray: #585858;
43 | @lighter-gray: #585858;
44 | @section-padding: 15px;
45 | //
46 | // Headings
47 | // -------------------------
48 | @h1-font-family: @font-family-heading;
49 | @h1-font-size: 40px;
50 | @h1-font-weight: 400;
51 | @h1-line-height: 1.2;
52 | @h1-font-colour: #231f20;
53 |
54 | @h2-font-family: @font-family-heading;
55 | @h2-font-size: 30px;
56 | @h2-font-weight: 400;
57 | @h2-line-height: 1.35;
58 | @h2-font-colour: #231f20;
59 |
60 | @h3-font-family: @font-family-heading;
61 | @h3-font-size: 22px;
62 | @h3-font-weight: 400;
63 | @h3-line-height: 1.45;
64 | @h3-font-colour: #231f20;
65 |
66 | @h4-font-family: @font-family-heading;
67 | @h4-font-size: 20px;
68 | @h4-font-weight: 400;
69 | @h4-line-height: 1.45;
70 | @h4-font-colour: #231f20;
71 |
72 | @h5-font-family: @font-family-heading;
73 | @h5-font-size: 18px;
74 | @h5-font-weight: 400;
75 | @h5-line-height: 1.45;
76 | @h5-font-colour: #231f20;
77 |
78 | @h6-font-family: @font-family-heading;
79 | @h6-font-size: 16px;
80 | @h6-font-weight: 400;
81 | @h6-line-height: 1.45;
82 | @h6-font-colour: #231f20;
83 |
84 | //
85 | // Paragraph
86 | // -------------------------
87 | @p-font-size: 15px;
88 | @p-font-weight: 400;
89 | @p-line-height: 1.5;
90 | @p-font-colour: @text-color;
91 |
92 | //
93 | // Links
94 | // --------------------------------------------------
95 | @link-color: @brand-primary;
96 | @link-hover-color: @brand-primary-light;
97 | @link-hover-decoration: none;
98 |
99 | //
100 | // Buttons
101 | // --------------------------------------------------
102 | @btn-font-family: @font-family-heading;
103 | @btn-font-weight: 600;
104 | @btn-letter-spacing: 1px;
105 | @btn-text-transform: uppercase;
106 |
107 | // Btn regular
108 | // -------------------------
109 | @btn-font-size: 14px;
110 | @btn-height: 40px;
111 | @btn-line-height: 40px;
112 | @btn-hrz-padding: 35px;
113 | @btn-border-radius: 0;
114 |
115 | // Btn large
116 | // -------------------------
117 | @btn-font-size-lg: 16px;
118 | @btn-height-lg: 50px;
119 | @btn-line-height-lg: 50px;
120 | @btn-hrz-padding-lg: 50px;
121 |
122 | //
123 | // Forms
124 | // --------------------------------------------------
125 |
126 | //
127 | // Input
128 | // -------------------------
129 | @input-font-family: @font-family-base;
130 | @input-font-size: 14px;
131 | @input-line-height: 1.6;
132 | @input-font-weight: 400;
133 | @input-color: #2d2b2c;
134 |
135 | @input-bg: #fff;
136 | @input-bg-disabled: #eee;
137 | @input-bg-focus: #fff;
138 |
139 | @input-padding: 8px 12px;
140 |
141 | @input-border-radius: 0;
142 | @input-border-colour: #cdcccd;
143 | @input-border-focus: @brand-primary;
144 | @input-color-placeholder: #808184;
145 |
146 | //
147 | // Label
148 | // -------------------------
149 | @label-font-size: 16px;
150 | @label-color: #2d2b2c;
151 | @label-font-weight: 700;
152 | @label-line-height: 1.3;
153 | @label-letter-spacing: 0;
154 | @label-text-transform: none;
155 | @label-margin-bottom: 5px;
156 |
157 | //
158 | // Textarea
159 | // -------------------------
160 | @textarea-height: 140px;
161 | @textarea-padding: 8px 12px;
162 |
163 | //
164 | // Form submit
165 | // -------------------------
166 | @form-submit-margin-top: 30px;
167 |
168 | //
169 | // Border radius
170 | // --------------------------------------------------
171 | @border-radius-base: 0;
172 |
173 | //
174 | // Container sizes
175 | // --------------------------------------------------
176 | @screen-xs-min: 0;
177 | @screen-xs-max: 599px;
178 | @screen-sm-min: 600px;
179 | @screen-md-min: 600px;
180 |
--------------------------------------------------------------------------------
/themes/base/source/less/components/forms.less:
--------------------------------------------------------------------------------
1 | // ==================================================
2 | // Forms
3 | // ==================================================
4 |
5 | //
6 | // Form control
7 | // --------------------------------------------------
8 | .form-control {
9 | //** Set form transition
10 | .transition(~"border-color 200ms linear, background-color 200ms linear, box-shadow 200ms linear");
11 |
12 | font-family: @input-font-family;
13 | color: @input-color;
14 | height: auto;
15 | line-height: @input-line-height;
16 | padding: @input-padding;
17 | border-radius: @input-border-radius;
18 | border: 1px solid @input-border-colour;
19 | font-size: @input-font-size;
20 | font-weight: @input-font-weight;
21 | background-color: @input-bg;
22 | .box-shadow(none);
23 |
24 | &::-moz-placeholder {
25 | color: @input-color-placeholder; // Firefox
26 | opacity: 1;
27 | }
28 | // See https://github.com/twbs/bootstrap/pull/11526
29 | &:-ms-input-placeholder {
30 | color: @input-color-placeholder;
31 | }
32 | // Internet Explorer 10+
33 | &::-webkit-input-placeholder {
34 | color: @input-color-placeholder;
35 | }
36 |
37 | &:active,
38 | &:focus {
39 | .box-shadow(none);
40 | border-color: @input-border-focus;
41 |
42 | &[disabled],
43 | &[readonly]{
44 | background-color: @input-bg-disabled;
45 | }
46 | }
47 |
48 | &:focus{
49 | box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);
50 | }
51 |
52 | &.form-error{
53 | border-color: @brand-primary;
54 | }
55 | }
56 |
57 | //Remove field shadow from ios safari/chrome
58 | input.form-control,
59 | textarea.form-control {
60 | -webkit-appearance: none;
61 | }
62 |
63 | textarea.form-control {
64 | height: @textarea-height;
65 | padding: @textarea-padding;
66 | resize: none;
67 | }
68 |
69 |
70 | // Label
71 | // --------------------------------------------------
72 | label{
73 | font-family: @font-family-heading;
74 | font-size: @label-font-size;
75 | font-weight: @label-font-weight;
76 | line-height: @label-line-height;
77 | color: @label-color;
78 | text-transform: @label-text-transform;
79 | letter-spacing: @label-letter-spacing;
80 | margin-bottom: @label-margin-bottom;
81 |
82 | span{
83 | color: #000;
84 | margin-left: 3px;
85 | }
86 |
87 | &.floating-label{
88 | font-size: 14px;
89 | font-weight: 400;
90 | color: #808184;
91 | position: absolute;
92 | right: -20px;
93 | bottom: 10px;
94 | margin-bottom: 0;
95 | }
96 | }
97 |
98 | //
99 | // Legend
100 | // --------------------------------------------------
101 | legend{
102 | font-size: 22px;
103 | line-height: 1.4;
104 | font-weight: 700;
105 | margin-bottom: 25px;
106 | border-bottom: 0;
107 | }
108 |
109 | // Select
110 | // --------------------------------------------------
111 | .form-group-select{
112 | position: relative;
113 |
114 | .form-control{
115 | padding-right: 32px;
116 | color: @input-color-placeholder;
117 | appearance: none;
118 | -moz-appearance: none;
119 | -webkit-appearance: none;
120 | }
121 |
122 | select::-ms-expand {
123 | display: none;
124 | }
125 |
126 | svg{
127 | fill: @input-color-placeholder;
128 | position: absolute;
129 | right: 12px;
130 | top: 50%;
131 | margin-top: -4px;
132 | pointer-events: none;
133 | }
134 | }
135 |
136 |
137 | // Form group
138 | // --------------------------------------------------
139 | .form-group {
140 | margin-bottom: 20px;
141 | text-align: left;
142 | position: relative;
143 | z-index: 0;
144 |
145 | &.no-margin{
146 | margin-bottom: 0;
147 | }
148 |
149 | &.form-group-short{
150 | margin-bottom: 15px;
151 | }
152 |
153 | .alert{
154 | padding-top: 8px;
155 | padding-bottom: 8px;
156 | }
157 | }
158 |
159 |
160 | // Form submit
161 | // --------------------------------------------------
162 | .form-submit {
163 | margin-top: @form-submit-margin-top;
164 | .clearfix();
165 |
166 | .btn{
167 | margin: 0;
168 | float: right;
169 |
170 | & + .btn{
171 | margin-right: 15px;
172 | }
173 | }
174 |
175 | .btn,
176 | .btn.btn-lg{
177 | padding-left: 70px;
178 | padding-right: 70px;
179 | }
180 | }
181 |
182 | // Checkboxes
183 | // --------------------------------------------------
184 | /* Base for label styling */
185 | [type="checkbox"]:not(:checked),
186 | [type="checkbox"]:checked {
187 | position: absolute;
188 | left: -9999px;
189 | }
190 | [type="checkbox"]:not(:checked) + label,
191 | [type="checkbox"]:checked + label {
192 | font-family: @font-family-base;
193 | font-weight: 400;
194 | color: #636363;
195 | font-size: 15px;
196 | position: relative;
197 | padding-left: 40px;
198 | line-height: 30px;
199 | cursor: pointer;
200 | display: inline-block;
201 | -webkit-touch-callout: none;
202 | -webkit-user-select: none;
203 | -khtml-user-select: none;
204 | -moz-user-select: none;
205 | -ms-user-select: none;
206 | user-select: none;
207 | }
208 |
209 | /* checkbox aspect */
210 | [type="checkbox"]:not(:checked) + label:before,
211 | [type="checkbox"]:checked + label:before {
212 | content: '';
213 | position: absolute;
214 | left: 0; top: 0;
215 | width: 30px;
216 | height: 30px;
217 | border: 1px solid @input-border;
218 | .transition(background-color 200ms);
219 | }
220 | /* checked mark aspect */
221 | [type="checkbox"]:not(:checked) + label:after,
222 | [type="checkbox"]:checked + label:after {
223 | content: '';
224 | position: absolute;
225 | left: 0;
226 | top: 0;
227 | width: 30px;
228 | height: 30px;
229 | }
230 | /* checked mark aspect changes */
231 | [type="checkbox"]:not(:checked) + label:after {
232 | .opacity(0);
233 | .scale(0);
234 | }
235 | [type="checkbox"]:checked + label:after {
236 | .opacity(1);
237 | .scale(0.5);
238 | }
239 | /* disabled checkbox */
240 | [type="checkbox"]:disabled:not(:checked) + label:before,
241 | [type="checkbox"]:disabled:checked + label:before {
242 | box-shadow: none;
243 | border-color: @input-border;
244 | background-color: #ddd;
245 | }
246 | [type="checkbox"]:disabled:checked + label:after {
247 | color: #999;
248 | }
249 | [type="checkbox"]:disabled + label {
250 | color: #aaa;
251 | }
252 |
253 | // Form errors
254 | // --------------------------------------------------
255 | @keyframes push-down-fade {
256 | 0% {
257 | .opacity(0);
258 | .translate(0, -10px);
259 | }
260 |
261 | 100% {
262 | .opacity(1);
263 | .translate(0, 0);
264 | }
265 | }
266 |
267 | .error-container{
268 | width: auto;
269 | background-color: @brand-error;
270 | position: absolute;
271 | top: -10px;
272 | right: 7px;
273 | z-index: 99999;
274 | pointer-events: none;
275 | padding: 4px 10px 5px 10px;
276 | border-radius: 3px;
277 | display: none;
278 | animation: push-down-fade 400ms 1;
279 | transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);
280 |
281 | &.filled {
282 | display: block;
283 | }
284 |
285 | .message-wrap{
286 | p{
287 | font-size: 11px;
288 | line-height: 16px;
289 | font-weight: 400;
290 | color: #fff;
291 | margin-bottom: 0;
292 | }
293 | }
294 |
295 | &::after {
296 | content: '';
297 | width: 0;
298 | height: 0;
299 | width: 0;
300 | border-left: 5px solid transparent;
301 | border-right: 5px solid transparent;
302 | border-top: 5px solid @brand-error;
303 | position: absolute;
304 | right: 10px;
305 | bottom: -5px;
306 | z-index: -25;
307 | }
308 | }
309 |
--------------------------------------------------------------------------------
/composer.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_readme": [
3 | "This file locks the dependencies of your project to a known state",
4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5 | "This file is @generated automatically"
6 | ],
7 | "hash": "dec1e3c1231264365d2edf922f5fbcf5",
8 | "content-hash": "737293728a259f65fa09cf8fd9c4a4b7",
9 | "packages": [
10 | {
11 | "name": "composer/installers",
12 | "version": "v1.0.22",
13 | "source": {
14 | "type": "git",
15 | "url": "https://github.com/composer/installers.git",
16 | "reference": "bd9b14f094c89c8b5804a4e41edeb7853bb85046"
17 | },
18 | "dist": {
19 | "type": "zip",
20 | "url": "https://api.github.com/repos/composer/installers/zipball/bd9b14f094c89c8b5804a4e41edeb7853bb85046",
21 | "reference": "bd9b14f094c89c8b5804a4e41edeb7853bb85046",
22 | "shasum": ""
23 | },
24 | "require": {
25 | "composer-plugin-api": "1.0.0"
26 | },
27 | "replace": {
28 | "roundcube/plugin-installer": "*",
29 | "shama/baton": "*"
30 | },
31 | "require-dev": {
32 | "composer/composer": "1.0.*@dev",
33 | "phpunit/phpunit": "4.1.*"
34 | },
35 | "type": "composer-plugin",
36 | "extra": {
37 | "class": "Composer\\Installers\\Plugin",
38 | "branch-alias": {
39 | "dev-master": "1.0-dev"
40 | }
41 | },
42 | "autoload": {
43 | "psr-0": {
44 | "Composer\\Installers\\": "src/"
45 | }
46 | },
47 | "notification-url": "https://packagist.org/downloads/",
48 | "license": [
49 | "MIT"
50 | ],
51 | "authors": [
52 | {
53 | "name": "Kyle Robinson Young",
54 | "email": "kyle@dontkry.com",
55 | "homepage": "https://github.com/shama"
56 | }
57 | ],
58 | "description": "A multi-framework Composer library installer",
59 | "homepage": "http://composer.github.com/installers/",
60 | "keywords": [
61 | "Craft",
62 | "Dolibarr",
63 | "Hurad",
64 | "MODX Evo",
65 | "OXID",
66 | "SMF",
67 | "Thelia",
68 | "WolfCMS",
69 | "agl",
70 | "aimeos",
71 | "annotatecms",
72 | "bitrix",
73 | "cakephp",
74 | "chef",
75 | "codeigniter",
76 | "concrete5",
77 | "croogo",
78 | "dokuwiki",
79 | "drupal",
80 | "elgg",
81 | "fuelphp",
82 | "grav",
83 | "installer",
84 | "joomla",
85 | "kohana",
86 | "laravel",
87 | "lithium",
88 | "magento",
89 | "mako",
90 | "mediawiki",
91 | "modulework",
92 | "moodle",
93 | "phpbb",
94 | "piwik",
95 | "ppi",
96 | "puppet",
97 | "roundcube",
98 | "shopware",
99 | "silverstripe",
100 | "symfony",
101 | "typo3",
102 | "wordpress",
103 | "zend",
104 | "zikula"
105 | ],
106 | "time": "2015-10-29 23:28:48"
107 | },
108 | {
109 | "name": "fzaninotto/faker",
110 | "version": "v1.5.0",
111 | "source": {
112 | "type": "git",
113 | "url": "https://github.com/fzaninotto/Faker.git",
114 | "reference": "d0190b156bcca848d401fb80f31f504f37141c8d"
115 | },
116 | "dist": {
117 | "type": "zip",
118 | "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d",
119 | "reference": "d0190b156bcca848d401fb80f31f504f37141c8d",
120 | "shasum": ""
121 | },
122 | "require": {
123 | "php": ">=5.3.3"
124 | },
125 | "require-dev": {
126 | "phpunit/phpunit": "~4.0",
127 | "squizlabs/php_codesniffer": "~1.5"
128 | },
129 | "suggest": {
130 | "ext-intl": "*"
131 | },
132 | "type": "library",
133 | "extra": {
134 | "branch-alias": {
135 | "dev-master": "1.5.x-dev"
136 | }
137 | },
138 | "autoload": {
139 | "psr-4": {
140 | "Faker\\": "src/Faker/"
141 | }
142 | },
143 | "notification-url": "https://packagist.org/downloads/",
144 | "license": [
145 | "MIT"
146 | ],
147 | "authors": [
148 | {
149 | "name": "François Zaninotto"
150 | }
151 | ],
152 | "description": "Faker is a PHP library that generates fake data for you.",
153 | "keywords": [
154 | "data",
155 | "faker",
156 | "fixtures"
157 | ],
158 | "time": "2015-05-29 06:29:14"
159 | },
160 | {
161 | "name": "heyday/silverstripe-hashpath",
162 | "version": "2.0.1",
163 | "source": {
164 | "type": "git",
165 | "url": "https://github.com/heyday/silverstripe-hashpath.git",
166 | "reference": "6b418e4e882ed4740a574d8dd9d5ed6e8ba0e3bd"
167 | },
168 | "dist": {
169 | "type": "zip",
170 | "url": "https://api.github.com/repos/heyday/silverstripe-hashpath/zipball/6b418e4e882ed4740a574d8dd9d5ed6e8ba0e3bd",
171 | "reference": "6b418e4e882ed4740a574d8dd9d5ed6e8ba0e3bd",
172 | "shasum": ""
173 | },
174 | "require": {
175 | "composer/installers": "~1.0"
176 | },
177 | "require-dev": {
178 | "composer/composer": "~1.0.0-alpha9",
179 | "silverstripe/framework": "~3.0"
180 | },
181 | "type": "silverstripe-module",
182 | "notification-url": "https://packagist.org/downloads/",
183 | "license": [
184 | "MIT"
185 | ],
186 | "authors": [
187 | {
188 | "name": "Pieter Vanderwerff",
189 | "email": "pieter@heyday.co.nz",
190 | "role": "Developer"
191 | },
192 | {
193 | "name": "Cam Spiers",
194 | "email": "cameron@heyday.co.nz",
195 | "role": "Developer"
196 | }
197 | ],
198 | "description": "Hash path provides a function in SilverStripe templates which given a path to an asset returns a path including a hash of the asset",
199 | "time": "2015-02-11 19:37:10"
200 | },
201 | {
202 | "name": "littlegiant/silverstripe-batchwrite",
203 | "version": "0.2.3",
204 | "source": {
205 | "type": "git",
206 | "url": "https://github.com/Little-Giant/silverstripe-batchwrite.git",
207 | "reference": "697646ab16c6a8ecac5d6862fed7106c46b0508d"
208 | },
209 | "dist": {
210 | "type": "zip",
211 | "url": "https://api.github.com/repos/Little-Giant/silverstripe-batchwrite/zipball/697646ab16c6a8ecac5d6862fed7106c46b0508d",
212 | "reference": "697646ab16c6a8ecac5d6862fed7106c46b0508d",
213 | "shasum": ""
214 | },
215 | "type": "silverstripe-module",
216 | "extra": {
217 | "installer-name": "silverstripe-batchwrite"
218 | },
219 | "notification-url": "https://packagist.org/downloads/",
220 | "license": [
221 | "BSD-2-Clause"
222 | ],
223 | "authors": [
224 | {
225 | "name": "Little Giant",
226 | "email": "webmaster@littlegiant.co.nz"
227 | }
228 | ],
229 | "description": "Batch write for silverstripe data objects",
230 | "homepage": "http://github.com/Little-Giant/silverstripe-batchwrite",
231 | "keywords": [
232 | "batch",
233 | "performance",
234 | "silverstripe"
235 | ],
236 | "time": "2015-10-15 01:11:36"
237 | },
238 | {
239 | "name": "littlegiant/silverstripe-catalogmanager",
240 | "version": "2.0.4",
241 | "source": {
242 | "type": "git",
243 | "url": "https://github.com/Little-Giant/silverstripe-catalogmanager.git",
244 | "reference": "43fe8b10d7f6865f6315d0d172717e633574f3f8"
245 | },
246 | "dist": {
247 | "type": "zip",
248 | "url": "https://api.github.com/repos/Little-Giant/silverstripe-catalogmanager/zipball/43fe8b10d7f6865f6315d0d172717e633574f3f8",
249 | "reference": "43fe8b10d7f6865f6315d0d172717e633574f3f8",
250 | "shasum": ""
251 | },
252 | "require": {
253 | "undefinedoffset/sortablegridfield": "~0.4.0"
254 | },
255 | "type": "silverstripe-module",
256 | "notification-url": "https://packagist.org/downloads/",
257 | "license": [
258 | "MIT"
259 | ],
260 | "authors": [
261 | {
262 | "name": "Stevie Mayhew",
263 | "email": "stevie.mayhew@littlegiant.co.nz",
264 | "role": "Developer"
265 | },
266 | {
267 | "name": "Oliver Shaw",
268 | "email": "oliver.shaw@littlegiant.co.nz",
269 | "role": "Developer"
270 | },
271 | {
272 | "name": "James Fallwell",
273 | "email": "james.fallwell@littlegiant.co.nz",
274 | "role": "Developer"
275 | }
276 | ],
277 | "description": "Catalog Manager provides extension for ModelAdmin editing of SiteTree instances",
278 | "time": "2015-09-28 07:27:03"
279 | },
280 | {
281 | "name": "littlegiant/silverstripe-seeder",
282 | "version": "1.0.2",
283 | "source": {
284 | "type": "git",
285 | "url": "https://github.com/Little-Giant/silverstripe-seeder.git",
286 | "reference": "884a18d4cc20b651eb4e7db48d127cb3cac97fb6"
287 | },
288 | "dist": {
289 | "type": "zip",
290 | "url": "https://api.github.com/repos/Little-Giant/silverstripe-seeder/zipball/884a18d4cc20b651eb4e7db48d127cb3cac97fb6",
291 | "reference": "884a18d4cc20b651eb4e7db48d127cb3cac97fb6",
292 | "shasum": ""
293 | },
294 | "require": {
295 | "fzaninotto/faker": "^1.5",
296 | "littlegiant/silverstripe-batchwrite": "^0.2.2",
297 | "silverstripe/cms": "~3.1",
298 | "symfony/console": "^2.7"
299 | },
300 | "type": "silverstripe-module",
301 | "extra": {
302 | "installer-name": "silverstripe-seeder"
303 | },
304 | "notification-url": "https://packagist.org/downloads/",
305 | "license": [
306 | "MIT"
307 | ],
308 | "authors": [
309 | {
310 | "name": "Chris Barrett",
311 | "email": "chris.barrett@littlegiant.co.nz"
312 | }
313 | ],
314 | "description": "Seed data objects for dev",
315 | "homepage": "http://github.com/Little-Giant/silverstripe-seeder",
316 | "keywords": [
317 | "developer tool",
318 | "seed",
319 | "silverstripe"
320 | ],
321 | "time": "2015-11-26 02:48:49"
322 | },
323 | {
324 | "name": "ryanpotter/silverstripe-cms-theme",
325 | "version": "0.3.1",
326 | "source": {
327 | "type": "git",
328 | "url": "https://github.com/Rhym/silverstripe-cms-theme.git",
329 | "reference": "3b2e03ee5953f5d3b391101bc5d23f484f3056f7"
330 | },
331 | "dist": {
332 | "type": "zip",
333 | "url": "https://api.github.com/repos/Rhym/silverstripe-cms-theme/zipball/3b2e03ee5953f5d3b391101bc5d23f484f3056f7",
334 | "reference": "3b2e03ee5953f5d3b391101bc5d23f484f3056f7",
335 | "shasum": ""
336 | },
337 | "require": {
338 | "composer/installers": "*",
339 | "silverstripe/framework": ">=3.0.1,<3.2"
340 | },
341 | "suggest": {
342 | "silverstripe-australia/grouped-cms-menu": "Group CMS menus to provide a better UX"
343 | },
344 | "type": "silverstripe-module",
345 | "extra": {
346 | "installer-name": "silverstripe-branding"
347 | },
348 | "notification-url": "https://packagist.org/downloads/",
349 | "license": [
350 | "BSD-3-Clause"
351 | ],
352 | "authors": [
353 | {
354 | "name": "Ryan Potter",
355 | "homepage": "http://ryanpotter.co.nz/",
356 | "role": "Developer"
357 | }
358 | ],
359 | "description": "CMS Theme",
360 | "keywords": [
361 | "silverstripe",
362 | "theme"
363 | ],
364 | "time": "2015-08-12 05:30:43"
365 | },
366 | {
367 | "name": "silverstripe-australia/grouped-cms-menu",
368 | "version": "2.2.3",
369 | "target-dir": "grouped-cms-menu",
370 | "source": {
371 | "type": "git",
372 | "url": "https://github.com/silverstripe-australia/silverstripe-grouped-cms-menu.git",
373 | "reference": "0a2c7bd620676a1ab613a7db73d0bb8ad3a8a53d"
374 | },
375 | "dist": {
376 | "type": "zip",
377 | "url": "https://api.github.com/repos/silverstripe-australia/silverstripe-grouped-cms-menu/zipball/0a2c7bd620676a1ab613a7db73d0bb8ad3a8a53d",
378 | "reference": "0a2c7bd620676a1ab613a7db73d0bb8ad3a8a53d",
379 | "shasum": ""
380 | },
381 | "require": {
382 | "silverstripe/cms": "~3.1",
383 | "silverstripe/framework": "~3.1"
384 | },
385 | "type": "silverstripe-module",
386 | "extra": {
387 | "installer-name": "grouped-cms-menu",
388 | "branch-alias": {
389 | "dev-master": "2.2.x-dev"
390 | }
391 | },
392 | "notification-url": "https://packagist.org/downloads/",
393 | "license": [
394 | "BSD-3-Clause"
395 | ],
396 | "authors": [
397 | {
398 | "name": "Marcus Nyeholt",
399 | "email": "marcus@silverstripe.com.au"
400 | }
401 | ],
402 | "description": "Allows you to group CMS menu items.",
403 | "homepage": "https://github.com/silverstripe-australia/silverstripe-grouped-cms-menu",
404 | "keywords": [
405 | "cms",
406 | "menu",
407 | "module",
408 | "silverstripe"
409 | ],
410 | "time": "2015-11-04 20:57:04"
411 | },
412 | {
413 | "name": "silverstripe/cms",
414 | "version": "3.1.16",
415 | "source": {
416 | "type": "git",
417 | "url": "https://github.com/silverstripe/silverstripe-cms.git",
418 | "reference": "592588333026502b4968b1837d5725fbe7252745"
419 | },
420 | "dist": {
421 | "type": "zip",
422 | "url": "https://api.github.com/repos/silverstripe/silverstripe-cms/zipball/592588333026502b4968b1837d5725fbe7252745",
423 | "reference": "592588333026502b4968b1837d5725fbe7252745",
424 | "shasum": ""
425 | },
426 | "require": {
427 | "composer/installers": "*",
428 | "php": ">=5.3.2",
429 | "silverstripe/framework": "3.1.*"
430 | },
431 | "type": "silverstripe-module",
432 | "autoload": {
433 | "classmap": [
434 | "tests/behat/"
435 | ]
436 | },
437 | "notification-url": "https://packagist.org/downloads/",
438 | "license": [
439 | "BSD-3-Clause"
440 | ],
441 | "authors": [
442 | {
443 | "name": "SilverStripe",
444 | "homepage": "http://silverstripe.com"
445 | },
446 | {
447 | "name": "The SilverStripe Community",
448 | "homepage": "http://silverstripe.org"
449 | }
450 | ],
451 | "description": "The SilverStripe Content Management System",
452 | "homepage": "http://silverstripe.org",
453 | "keywords": [
454 | "cms",
455 | "silverstripe"
456 | ],
457 | "time": "2015-11-16 02:08:39"
458 | },
459 | {
460 | "name": "silverstripe/framework",
461 | "version": "3.1.16",
462 | "source": {
463 | "type": "git",
464 | "url": "https://github.com/silverstripe/silverstripe-framework.git",
465 | "reference": "2e6469956fa76513c6c9c70587c806f095ddb6d7"
466 | },
467 | "dist": {
468 | "type": "zip",
469 | "url": "https://api.github.com/repos/silverstripe/silverstripe-framework/zipball/2e6469956fa76513c6c9c70587c806f095ddb6d7",
470 | "reference": "2e6469956fa76513c6c9c70587c806f095ddb6d7",
471 | "shasum": ""
472 | },
473 | "require": {
474 | "composer/installers": "*",
475 | "php": ">=5.3.2,<7"
476 | },
477 | "require-dev": {
478 | "phpunit/phpunit": "~3.7@stable"
479 | },
480 | "type": "silverstripe-module",
481 | "autoload": {
482 | "classmap": [
483 | "tests/behat/features/bootstrap"
484 | ]
485 | },
486 | "notification-url": "https://packagist.org/downloads/",
487 | "license": [
488 | "BSD-3-Clause"
489 | ],
490 | "authors": [
491 | {
492 | "name": "SilverStripe",
493 | "homepage": "http://silverstripe.com"
494 | },
495 | {
496 | "name": "The SilverStripe Community",
497 | "homepage": "http://silverstripe.org"
498 | }
499 | ],
500 | "description": "The SilverStripe framework",
501 | "homepage": "http://silverstripe.org",
502 | "keywords": [
503 | "framework",
504 | "silverstripe"
505 | ],
506 | "time": "2015-11-16 02:20:30"
507 | },
508 | {
509 | "name": "symfony/console",
510 | "version": "v2.7.7",
511 | "source": {
512 | "type": "git",
513 | "url": "https://github.com/symfony/console.git",
514 | "reference": "16bb1cb86df43c90931df65f529e7ebd79636750"
515 | },
516 | "dist": {
517 | "type": "zip",
518 | "url": "https://api.github.com/repos/symfony/console/zipball/16bb1cb86df43c90931df65f529e7ebd79636750",
519 | "reference": "16bb1cb86df43c90931df65f529e7ebd79636750",
520 | "shasum": ""
521 | },
522 | "require": {
523 | "php": ">=5.3.9"
524 | },
525 | "require-dev": {
526 | "psr/log": "~1.0",
527 | "symfony/event-dispatcher": "~2.1",
528 | "symfony/process": "~2.1"
529 | },
530 | "suggest": {
531 | "psr/log": "For using the console logger",
532 | "symfony/event-dispatcher": "",
533 | "symfony/process": ""
534 | },
535 | "type": "library",
536 | "extra": {
537 | "branch-alias": {
538 | "dev-master": "2.7-dev"
539 | }
540 | },
541 | "autoload": {
542 | "psr-4": {
543 | "Symfony\\Component\\Console\\": ""
544 | },
545 | "exclude-from-classmap": [
546 | "/Tests/"
547 | ]
548 | },
549 | "notification-url": "https://packagist.org/downloads/",
550 | "license": [
551 | "MIT"
552 | ],
553 | "authors": [
554 | {
555 | "name": "Fabien Potencier",
556 | "email": "fabien@symfony.com"
557 | },
558 | {
559 | "name": "Symfony Community",
560 | "homepage": "https://symfony.com/contributors"
561 | }
562 | ],
563 | "description": "Symfony Console Component",
564 | "homepage": "https://symfony.com",
565 | "time": "2015-11-18 09:54:26"
566 | },
567 | {
568 | "name": "unclecheese/betterbuttons",
569 | "version": "1.2.8",
570 | "source": {
571 | "type": "git",
572 | "url": "https://github.com/unclecheese/silverstripe-gridfield-betterbuttons.git",
573 | "reference": "b78f3c7449651ba2acefe4000f161e17384fcad3"
574 | },
575 | "dist": {
576 | "type": "zip",
577 | "url": "https://api.github.com/repos/unclecheese/silverstripe-gridfield-betterbuttons/zipball/b78f3c7449651ba2acefe4000f161e17384fcad3",
578 | "reference": "b78f3c7449651ba2acefe4000f161e17384fcad3",
579 | "shasum": ""
580 | },
581 | "require": {
582 | "silverstripe/framework": "~3.1"
583 | },
584 | "type": "silverstripe-module",
585 | "notification-url": "https://packagist.org/downloads/",
586 | "license": [
587 | "BSD-3-Clause"
588 | ],
589 | "authors": [
590 | {
591 | "name": "Uncle Cheese",
592 | "email": "unclecheese@leftandmain.com"
593 | }
594 | ],
595 | "description": "Adds new form actions and buttons to GridField detail form for usability enhancements.",
596 | "keywords": [
597 | "buttons",
598 | "gridfield",
599 | "silverstripe"
600 | ],
601 | "time": "2015-02-09 02:07:59"
602 | },
603 | {
604 | "name": "undefinedoffset/sortablegridfield",
605 | "version": "0.4.5",
606 | "source": {
607 | "type": "git",
608 | "url": "https://github.com/UndefinedOffset/SortableGridField.git",
609 | "reference": "282ea74a764d247f70c1c73c1400bcc322aade08"
610 | },
611 | "dist": {
612 | "type": "zip",
613 | "url": "https://api.github.com/repos/UndefinedOffset/SortableGridField/zipball/282ea74a764d247f70c1c73c1400bcc322aade08",
614 | "reference": "282ea74a764d247f70c1c73c1400bcc322aade08",
615 | "shasum": ""
616 | },
617 | "require": {
618 | "composer/installers": "*",
619 | "silverstripe/framework": ">=3.0.1,<3.3"
620 | },
621 | "type": "silverstripe-module",
622 | "extra": {
623 | "installer-name": "sortablegridfield"
624 | },
625 | "notification-url": "https://packagist.org/downloads/",
626 | "license": [
627 | "BSD-3-Clause"
628 | ],
629 | "authors": [
630 | {
631 | "name": "Ed Chipman",
632 | "homepage": "http://www.edchipman.ca",
633 | "role": "Developer"
634 | }
635 | ],
636 | "description": "Adds drag and drop functionality to SilverStripe 3.0's GridField",
637 | "keywords": [
638 | "gridfield",
639 | "silverstripe"
640 | ],
641 | "time": "2015-08-29 17:54:46"
642 | }
643 | ],
644 | "packages-dev": [
645 | {
646 | "name": "gdmedia/ss-auto-git-ignore",
647 | "version": "0.0.3",
648 | "source": {
649 | "type": "git",
650 | "url": "https://github.com/guru-digital/SSAutoGitIgnore.git",
651 | "reference": "4e71f8ecf506fa7e82d3218b7c5d593b021d4e7f"
652 | },
653 | "dist": {
654 | "type": "zip",
655 | "url": "https://api.github.com/repos/guru-digital/SSAutoGitIgnore/zipball/4e71f8ecf506fa7e82d3218b7c5d593b021d4e7f",
656 | "reference": "4e71f8ecf506fa7e82d3218b7c5d593b021d4e7f",
657 | "shasum": ""
658 | },
659 | "type": "library",
660 | "autoload": {
661 | "psr-0": {
662 | "GDM\\": "./"
663 | }
664 | },
665 | "notification-url": "https://packagist.org/downloads/",
666 | "authors": [
667 | {
668 | "name": "Corey Sewell",
669 | "email": "corey@gurudigal.nz"
670 | }
671 | ],
672 | "description": "A Composer post-update-cmd script to automatically add Composer managed SilverStripe modules and themes to .gitignore",
673 | "time": "2015-03-05 23:18:02"
674 | }
675 | ],
676 | "aliases": [],
677 | "minimum-stability": "stable",
678 | "stability-flags": [],
679 | "prefer-stable": false,
680 | "prefer-lowest": false,
681 | "platform": {
682 | "php": ">=5.3.2"
683 | },
684 | "platform-dev": []
685 | }
686 |
--------------------------------------------------------------------------------
/themes/base/production/css/main.css:
--------------------------------------------------------------------------------
1 | /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}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}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}*,:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:Droid Sans,sans-serif;font-size:1pc;line-height:1.6;color:#585858;background-color:#0d0c0d}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#09c}a,a:focus,a:hover{text-decoration:none}a:focus,a:hover{color:#1ac6ff}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.6;background-color:#0d0c0d;border:1px solid #ddd;border-radius:0;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:25px;margin-bottom:25px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:25px;margin-bottom:12.5px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:12.5px;margin-bottom:12.5px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:41px}.h2,h2{font-size:34px}.h3,h3{font-size:28px}.h4,h4{font-size:20px}.h5,h5{font-size:1pc}.h6,h6{font-size:14px}p{margin:0 0 12.5px}.lead{margin-bottom:25px;font-size:18px;font-weight:300;line-height:1.4}@media (min-width:600px){.lead{font-size:24px}}.small,small{font-size:87%}.mark,mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#09c}a.text-primary:focus,a.text-primary:hover{color:#007399}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#09c}a.bg-primary:focus,a.bg-primary:hover{background-color:#007399}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:11.5px;margin:50px 0 25px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:12.5px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;padding:0;margin:0;list-style-type:none;margin-left:-5px}.list-inline li{margin:0}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:25px}dd,dt{line-height:1.6}dt{font-weight:700}dd{margin-left:0}@media (min-width:600px){.dl-horizontal dt{float:left;width:10pc;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:12.5px 25px;margin:0 0 25px;font-size:20px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.6;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\A0 \2014'}address{margin-bottom:25px;font-style:normal;line-height:1.6}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Courier New,monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:0}code,kbd{padding:2px 4px;font-size:90%}kbd{color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;padding:9pt;margin:0 0 12.5px;font-size:15px;line-height:1.6;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:600px){.container{width:750px;width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-0{margin-left:0}@media (min-width:600px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:600px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{margin:0;min-width:0}fieldset,legend{padding:0;border:0}legend{display:block;width:100%;margin-bottom:25px;font-size:24px;line-height:inherit;color:#333;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{padding-top:7px}.form-control,output{display:block;font-size:1pc;line-height:1.6;color:#2d2b2c}.form-control{width:100%;height:39px;padding:6px 9pt;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#09c;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(0,153,204,.6)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:39px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:33px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:49px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:25px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:41px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:33px;padding:5px 10px;font-size:14px;line-height:1.5;border-radius:3px}select.input-sm{height:33px;line-height:33px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:33px;padding:5px 10px;font-size:14px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:33px;line-height:33px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:33px;min-height:39px;padding:6px 10px;font-size:14px;line-height:1.5}.input-lg{height:49px;padding:10px 1pc;font-size:20px;line-height:1.3333333;border-radius:6px}select.input-lg{height:49px;line-height:49px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:49px;padding:10px 1pc;font-size:20px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:49px;line-height:49px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:49px;min-height:45px;padding:11px 1pc;font-size:20px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:48.75px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:39px;height:39px;line-height:39px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:49px;height:49px;line-height:49px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:33px;height:33px;line-height:33px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:30px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#989898}@media (min-width:600px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:2pc}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:600px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:600px){.form-horizontal .form-group-lg .control-label{padding-top:14.333333px;font-size:20px}}@media (min-width:600px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:14px}}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition-property:height,visibility;transition-duration:.35s;transition-timing-function:ease}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li,.nav>li>a{position:relative;display:block}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#09c}.nav .nav-divider{height:1px;margin:11.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.6;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#0d0c0d;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:600px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:600px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0 0 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#0d0c0d}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#09c}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:600px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:600px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#0d0c0d}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:25px;border:1px solid transparent}@media (min-width:600px){.navbar{border-radius:0}}@media (min-width:600px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 hsla(0,0%,100%,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:600px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:0) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:600px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:600px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:600px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:12.5px 15px;font-size:20px;line-height:25px;height:50px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:600px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:600px){.navbar-toggle{display:none}}.navbar-nav{margin:6.25px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:25px}@media (max-width:599px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:25px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:600px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:12.5px;padding-bottom:12.5px}}.navbar-form{margin:5.5px -15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;box-shadow:inset 0 1px 0 hsla(0,0%,100%,.1),0 1px 0 hsla(0,0%,100%,.1)}@media (min-width:600px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:599px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:600px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:5.5px;margin-bottom:5.5px}.navbar-btn.btn-sm{margin-top:8.5px;margin-bottom:8.5px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:12.5px;margin-bottom:12.5px}@media (min-width:600px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:600px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:599px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:599px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:25px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\A0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:25px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 9pt;line-height:1.6;text-decoration:none;color:#09c;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#1ac6ff;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;background-color:#09c;border-color:#09c;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 1pc;font-size:20px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:14px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:25px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.row:after,.row:before{content:" ";display:table}.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:599px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:599px){.visible-xs-block{display:block!important}}@media (max-width:599px){.visible-xs-inline{display:inline!important}}@media (max-width:599px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:600px) and (max-width:599px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:600px) and (max-width:599px){.visible-sm-block{display:block!important}}@media (min-width:600px) and (max-width:599px){.visible-sm-inline{display:inline!important}}@media (min-width:600px) and (max-width:599px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:600px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:600px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:600px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:600px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:599px){.hidden-xs{display:none!important}}@media (min-width:600px) and (max-width:599px){.hidden-sm{display:none!important}}@media (min-width:600px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}.typography .h1,.typography h1{font-family:proxima-nova,sans-serif;font-weight:400;font-size:40px;line-height:1.2;color:#2d2b2c;margin:0 0 30px}.typography .h2,.typography h2{font-family:proxima-nova,sans-serif;font-weight:400;font-size:30px;line-height:1.3;color:#555;margin:0 0 45px}.typography .h3,.typography h3{font-family:proxima-nova,sans-serif;font-weight:400;font-size:22px;line-height:1.4;color:#09c;margin:0 0 35px}.typography .h4,.typography h4{font-size:20px;line-height:1.5;margin:0 0 30px}.typography .h4,.typography .h5,.typography h4,.typography h5{font-family:Droid Sans,sans-serif;text-transform:uppercase;font-weight:400;letter-spacing:1px;color:#2d2b2c}.typography .h5,.typography h5{font-size:18px;line-height:1.4;margin:0 0 15px}.typography p{font-weight:400;line-height:1.6;color:#585858;margin:0 0 15px}.typography .ul-list{padding:0;margin:0;list-style-type:none}.typography .ul-list li{padding-left:20px;position:relative}.typography .ul-list li:before{content:"\2022";position:absolute;top:50%;left:0;-webkit-transform:translate(0, -50%);-ms-transform:translate(0, -50%);transform:translate(0, -50%);color:#555;font-size:1.5em}.typography blockquote{border-left:none;padding:9pt 55px}.typography blockquote p{font-weight:400}.typography blockquote p span{font-weight:700}.typography blockquote small{text-transform:uppercase;color:#585858}.typography blockquote small:before{content:''}.typography blockquote small span{font-weight:700}.typography a{color:#09c;transition:color .3s}.typography a svg{transition:fill .3s}.typography a:focus,.typography a:hover{color:#2d2b2c;text-decoration:none}.typography table{border-collapse:collapse}.typography table td,.typography table th{padding:10px;border-right:1px solid #585858}.typography table td:first-child,.typography table th:first-child{border-left:1px solid #585858}.typography table tr{border-bottom:1px solid #585858}.typography table tr:first-child{border-top:1px solid #585858}.typography table thead tr{background-color:#585858}.typography table thead th{font-weight:700;color:#555}.typography table tfoot td,.typography table tfoot td:first-child{border:none}.col-xs-push-1{left:8.33333333%}.col-xs-push-2{left:16.66666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333333%}.col-xs-push-5{left:41.66666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333333%}.col-xs-push-8{left:66.66666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333333%}.col-xs-push-11{left:91.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-11{right:91.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.global-main{padding-top:20px;background-color:#ebedee}.section-padding{padding:15px}.inner{position:relative}.list-unstyled{padding:0;margin:0;list-style-type:none}.list-unstyled li{margin:0}.vcenter-parent{display:table;width:100%;height:100%}.vcenter{display:table-cell;vertical-align:middle}.well{border:1px solid #cdcccd;background-color:#fff;padding:30px}.well.well-lg{padding:35px 60px 60px}.well .well-title{font-size:25px;line-height:1.4;font-weight:700;margin-bottom:20px}.well .well-subtitle{font-size:20px;line-height:1.4;font-weight:600;margin-bottom:20px}.well p{font-size:14px;margin-bottom:25px}.well .btn{margin-top:30px}.well form .btn{margin-top:0}.form-control{transition:border-color .2s linear,background-color .2s linear,box-shadow .2s linear;font-family:Droid Sans,sans-serif;color:#2d2b2c;height:auto;line-height:1.6;padding:8px 9pt;border-radius:0;border:1px solid #cdcccd;font-size:14px;font-weight:400;background-color:#fff;box-shadow:none}.form-control::-moz-placeholder{color:#808184;opacity:1}.form-control:-ms-input-placeholder{color:#808184}.form-control::-webkit-input-placeholder{color:#808184}.form-control:active,.form-control:focus{box-shadow:none;border-color:#09c}.form-control:active[disabled],.form-control:active[readonly],.form-control:focus[disabled],.form-control:focus[readonly]{background-color:#eee}.form-control:focus{box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control.form-error{border-color:#09c}input.form-control,textarea.form-control{-webkit-appearance:none}textarea.form-control{height:140px;padding:8px 9pt;resize:none}label{font-family:proxima-nova,sans-serif;font-size:1pc;font-weight:700;line-height:1.3;color:#2d2b2c;text-transform:none;letter-spacing:0;margin-bottom:5px}label span{color:#000;margin-left:3px}label.floating-label{font-size:14px;font-weight:400;color:#808184;position:absolute;right:-20px;bottom:10px;margin-bottom:0}legend{font-size:22px;line-height:1.4;font-weight:700;margin-bottom:25px;border-bottom:0}.form-group-select{position:relative}.form-group-select .form-control{padding-right:2pc;color:#808184;appearance:none;-moz-appearance:none;-webkit-appearance:none}.form-group-select select::-ms-expand{display:none}.form-group-select svg{fill:#808184;position:absolute;right:9pt;top:50%;margin-top:-4px;pointer-events:none}.form-group{margin-bottom:20px;text-align:left;position:relative;z-index:0}.form-group.no-margin{margin-bottom:0}.form-group.form-group-short{margin-bottom:15px}.form-group .alert{padding-top:8px;padding-bottom:8px}.form-submit{margin-top:30px}.form-submit:after,.form-submit:before{content:" ";display:table}.form-submit:after{clear:both}.form-submit .btn{margin:0;float:right}.form-submit .btn+.btn{margin-right:15px}.form-submit .btn,.form-submit .btn.btn-lg{padding-left:70px;padding-right:70px}[type=checkbox]:checked,[type=checkbox]:not(:checked){position:absolute;left:-9999px}[type=checkbox]:checked+label,[type=checkbox]:not(:checked)+label{font-family:Droid Sans,sans-serif;font-weight:400;color:#636363;font-size:15px;position:relative;padding-left:40px;line-height:30px;cursor:pointer;display:inline-block;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;user-select:none}[type=checkbox]:checked+label:before,[type=checkbox]:not(:checked)+label:before{content:'';position:absolute;left:0;top:0;width:30px;height:30px;border:1px solid #ccc;transition:background-color .2s}[type=checkbox]:checked+label:after,[type=checkbox]:not(:checked)+label:after{content:'';position:absolute;left:0;top:0;width:30px;height:30px}[type=checkbox]:not(:checked)+label:after{opacity:0;filter:alpha(opacity=0);-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}[type=checkbox]:checked+label:after{opacity:1;filter:alpha(opacity=100);-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}[type=checkbox]:disabled:checked+label:before,[type=checkbox]:disabled:not(:checked)+label:before{box-shadow:none;border-color:#ccc;background-color:#ddd}[type=checkbox]:disabled:checked+label:after{color:#999}[type=checkbox]:disabled+label{color:#aaa}@-webkit-keyframes push-down-fade{0%{opacity:0;filter:alpha(opacity=0);-webkit-transform:translate(0, -10px);-ms-transform:translate(0, -10px);transform:translate(0, -10px)}to{opacity:1;filter:alpha(opacity=100);-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}@keyframes push-down-fade{0%{opacity:0;filter:alpha(opacity=0);-webkit-transform:translate(0, -10px);-ms-transform:translate(0, -10px);transform:translate(0, -10px)}to{opacity:1;filter:alpha(opacity=100);-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.error-container{width:auto;background-color:#09c;position:absolute;top:-10px;right:7px;z-index:99999;pointer-events:none;padding:4px 10px 5px;border-radius:3px;display:none;-webkit-animation:push-down-fade .4s 1;animation:push-down-fade .4s 1;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.error-container.filled{display:block}.error-container .message-wrap p{font-size:11px;line-height:1pc;font-weight:400;color:#fff;margin-bottom:0}.error-container:after{content:'';height:0;width:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #09c;position:absolute;right:10px;bottom:-5px;z-index:-25}.btn{transition:color .2s,background-color .2s,border-color .2s,-webkit-transform 75ms;transition:color .2s,background-color .2s,border-color .2s,transform 75ms;font-family:proxima-nova,sans-serif;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;background-color:transparent;height:40px;line-height:40px;letter-spacing:1px;padding:0 35px;border-radius:0;border:none;text-align:center;outline:0;display:inline-block;position:relative;cursor:pointer;z-index:0;overflow:hidden}.btn.btn-primary{color:#fff;background-color:#09c;border-color:transparent}.btn.btn-primary:hover{color:#fff;background-color:#00ace6}.btn.btn-primary:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}.btn.btn-secondary{color:#fff;background-color:#2d2b2c;border-color:transparent}.btn.btn-secondary:hover{color:#fff;background-color:#474446}.btn.btn-secondary:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}.btn.btn-danger{color:#fff;background-color:#d44950;border-color:transparent}.btn.btn-danger:hover{color:#fff;background-color:#e63c45}.btn.btn-danger:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}.btn.btn-white{color:#fff;background-color:#fff;border-color:transparent}.btn.btn-white:hover{color:#fff;background-color:#09c}.btn.btn-white:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}.btn.btn-lg{font-size:1pc;line-height:50px;height:50px;padding:0 50px}.btn.btn-block{width:100%;display:block}.btn.btn-block,.btn.btn-block.btn-lg{padding-left:0;padding-right:0}.btn svg{vertical-align:middle;margin-left:10px}.btn.btn-white{color:#585858;border:1px solid #ccc}.btn.btn-white:hover{color:#fff;border-color:#09c}.btn.btn-social{font-size:1pc;font-weight:600;letter-spacing:0;text-transform:none;width:100%;display:block;padding-right:0;padding-left:40px}.btn.btn-social:active,.btn.btn-social:focus,.btn.btn-social:hover{color:#fff}.btn.btn-social:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}.btn.btn-social+.btn-social{margin-top:15px}.btn.btn-social span{text-align:center;font-size:0;display:block;height:40px;width:40px;position:absolute;top:0;left:0;background-color:rgba(0,0,0,.12)}.btn.btn-social svg{margin:0;vertical-align:middle}.btn.btn-social.btn-lg{padding-left:50px}.btn.btn-social.btn-lg span{height:50px;width:50px}.btn.btn-facebook{background-color:#43649e}.btn.btn-facebook:hover{background-color:#4c72b3}.btn.btn-linkedin{background-color:#1fa7df}.btn.btn-linkedin:hover{background-color:#39b2e3}.postcard-layout .postcard{border:1px solid #cdcccd;background-color:#fff;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center}.postcard-layout .postcard:after,.postcard-layout .postcard:before{content:" ";display:table}.postcard-layout .postcard:after{clear:both}.postcard-layout .postcard+.postcard{margin-top:15px}.postcard-layout .postcard.short-height .postcard-center,.postcard-layout .postcard.short-height .postcard-right{height:185px}.postcard-layout .postcard.short-height .postcard-center p{font-size:1pc}.postcard-layout .postcard.short-height .postcard-center a strong{font-weight:600}.postcard-layout .postcard-center,.postcard-layout .postcard-left,.postcard-layout .postcard-right{float:left;padding-left:30px;padding-right:30px;padding-top:0}.postcard-layout .postcard-center.no-padding,.postcard-layout .postcard-left.no-padding,.postcard-layout .postcard-right.no-padding{padding:0}.postcard-layout .postcard-center.border-left,.postcard-layout .postcard-left.border-left,.postcard-layout .postcard-right.border-left{border-left:1px solid #cdcccd}.postcard-layout .postcard-left{width:170px;position:relative}.postcard-layout .postcard-left .postcard-img{display:block}.postcard-layout .postcard-left .postcard-label{font-family:proxima-nova,sans-serif;text-align:center;font-size:20px;color:#fff;line-height:1.3;letter-spacing:1px;font-weight:700;background-color:rgba(45,43,44,.9);padding:9pt 0;position:absolute;top:0;left:0;right:0}.postcard-layout .postcard-center{width:5in;height:195px;padding-bottom:0}.postcard-layout .postcard-center.full-width{width:675px}.postcard-layout .postcard-right{width:195px;height:195px;padding-top:0;padding-bottom:0}.postcard-layout h2{font-size:22px;line-height:1.2;font-weight:700;margin-bottom:15px}.postcard-layout h2 a{color:#231f20}.postcard-layout h2 a:hover{color:#09c}.postcard-layout h3{font-size:20px;font-weight:700;margin-bottom:10px}.postcard-layout h3 svg{vertical-align:middle;margin-right:5px}.postcard-layout p{font-family:proxima-nova,sans-serif;font-size:15px;margin-bottom:0}.postcard-layout p+p{margin-top:5px}.postcard-layout .btn+.btn{margin-top:15px}.pagination{padding-top:61px}.pagination:after,.pagination:before{content:" ";display:table}.pagination:after{clear:both}.pagination .pagination-block{font-family:proxima-nova,sans-serif;font-size:14px;font-weight:600;line-height:38px;letter-spacing:1px;text-transform:uppercase;text-align:center;color:#585858;background-color:#fff;margin-top:4px;border:1px solid #cdcccd;width:40px;height:40px;cursor:pointer;float:left;transition:color .2s,border-color .2s,background-color .2s}.pagination .pagination-block+.pagination-block{margin-left:5px}.pagination .pagination-block:hover{color:#fff;background-color:#cdcccd}.pagination .pagination-block.next,.pagination .pagination-block.prev{width:auto;padding-left:15px;padding-right:15px}.pagination .pagination-block.active{color:#fff}.pagination .pagination-block.active,.pagination .pagination-block.active:hover,.pagination span.pagination-block{background-color:#09c;border-color:#09c}.pagination span.pagination-block{color:#fff}.pagination span.pagination-block:hover{background-color:#09c;border-color:#09c}.burger-container{margin-bottom:30px}.burger-container+.burger-container{padding-top:30px;border-top:1px solid #cdcccd}.burger-container h3{font-size:20px;font-weight:700;margin-bottom:15px}.burger-container p{font-family:proxima-nova,sans-serif;margin-bottom:0}.burger-container p+p{margin-top:15px}.burger-container i{vertical-align:middle;margin-right:5px}.burger-wrapper{padding-left:15px}.filter-set{margin-bottom:20px}.filter-set .form-group{margin-bottom:0}.filter-set .form-icon .form-control{padding-right:60px}.filter-set .form-icon .btn{position:absolute;top:0;right:0;width:40px;padding-left:0;padding-right:0}.filter-set label{text-align:right;font-size:15px;line-height:40px;color:#585858;font-weight:600;display:block}
--------------------------------------------------------------------------------