├── .gitignore
├── Gemfile
├── README.md
├── _config.yml
├── _data
├── countries.yml
└── delivery-methods.yml
├── _includes
├── centered_navigation.html
├── footer.html
└── head.html
├── _layouts
├── compress.html
├── default.html
├── post.html
└── product.html
├── _posts
├── 2014-12-23-these-three-kings-of-freestyle.md
├── 2015-01-25-how-competitions-ruin-the-runway-scene.md
├── 2015-02-06-everything-you-need-to-know-about-plasma-stabilizers.md
├── 2015-02-17-regular-goofy-or-just-plain-weird.md
└── 2015-03-15-7-reasons-hoverboards-are-awesome.md
├── _products
├── birgerboard.md
├── blue-dot.md
├── bullet.md
├── classic.md
├── forward.md
├── hooverboard.md
├── hoverskull.md
├── lysboards-hovervarsel.md
├── mattel.md
├── merry-christmas.md
├── trinity-owl.md
├── waterhover.md
└── zboard.md
├── assets
├── _js
│ ├── compiled.js
│ ├── components
│ │ ├── AddToBasket.jsx
│ │ ├── Basket.jsx
│ │ ├── BasketItem.jsx
│ │ ├── BasketSummary.jsx
│ │ ├── CountriesSelect.jsx
│ │ ├── DeliverySelect.jsx
│ │ ├── Display.jsx
│ │ ├── Errors.jsx
│ │ ├── Favourites.jsx
│ │ ├── OrderSummary.jsx
│ │ ├── Pagination.jsx
│ │ ├── Product.jsx
│ │ ├── RangesButtonGroup.jsx
│ │ ├── SearchBox.jsx
│ │ ├── SortButtonGroup.jsx
│ │ ├── TagButtonGroup.jsx
│ │ └── Visited.jsx
│ ├── helpers
│ │ ├── loadJSON.js
│ │ ├── money.js
│ │ ├── renderComponent.js
│ │ ├── spinner.js
│ │ └── toggle.js
│ ├── index.js
│ ├── mixins
│ │ └── products.js
│ ├── pages
│ │ ├── basket.js
│ │ ├── checkout.js
│ │ └── product.js
│ ├── renderComponents.js
│ └── vendor
│ │ ├── es5-sham.min.js
│ │ ├── es5-shim.min.js
│ │ ├── form2js.js
│ │ ├── html5shiv.js
│ │ ├── paymill-dss3.js
│ │ └── placeholders.min.js
├── _sass
│ ├── pages
│ │ ├── _basket.scss
│ │ ├── _blog.scss
│ │ ├── _checkout.scss
│ │ ├── _favourites.scss
│ │ ├── _index.scss
│ │ ├── _post.scss
│ │ ├── _product.scss
│ │ └── _thankyou.scss
│ ├── shared
│ │ ├── _layout.scss
│ │ ├── _product.scss
│ │ └── _yotpo.scss
│ └── vendor
│ │ ├── _normalize.scss
│ │ ├── _omega-reset.scss
│ │ ├── base
│ │ ├── _base.scss
│ │ ├── _buttons.scss
│ │ ├── _forms.scss
│ │ ├── _grid-settings.scss
│ │ ├── _lists.scss
│ │ ├── _tables.scss
│ │ ├── _typography.scss
│ │ └── _variables.scss
│ │ ├── bourbon
│ │ ├── _bourbon-deprecated-upcoming.scss
│ │ ├── _bourbon.scss
│ │ ├── addons
│ │ │ ├── _button.scss
│ │ │ ├── _clearfix.scss
│ │ │ ├── _directional-values.scss
│ │ │ ├── _ellipsis.scss
│ │ │ ├── _font-family.scss
│ │ │ ├── _hide-text.scss
│ │ │ ├── _html5-input-types.scss
│ │ │ ├── _position.scss
│ │ │ ├── _prefixer.scss
│ │ │ ├── _retina-image.scss
│ │ │ ├── _size.scss
│ │ │ ├── _timing-functions.scss
│ │ │ ├── _triangle.scss
│ │ │ └── _word-wrap.scss
│ │ ├── css3
│ │ │ ├── _animation.scss
│ │ │ ├── _appearance.scss
│ │ │ ├── _backface-visibility.scss
│ │ │ ├── _background-image.scss
│ │ │ ├── _background.scss
│ │ │ ├── _border-image.scss
│ │ │ ├── _border-radius.scss
│ │ │ ├── _box-sizing.scss
│ │ │ ├── _calc.scss
│ │ │ ├── _columns.scss
│ │ │ ├── _filter.scss
│ │ │ ├── _flex-box.scss
│ │ │ ├── _font-face.scss
│ │ │ ├── _font-feature-settings.scss
│ │ │ ├── _hidpi-media-query.scss
│ │ │ ├── _hyphens.scss
│ │ │ ├── _image-rendering.scss
│ │ │ ├── _keyframes.scss
│ │ │ ├── _linear-gradient.scss
│ │ │ ├── _perspective.scss
│ │ │ ├── _placeholder.scss
│ │ │ ├── _radial-gradient.scss
│ │ │ ├── _transform.scss
│ │ │ ├── _transition.scss
│ │ │ └── _user-select.scss
│ │ ├── functions
│ │ │ ├── _assign.scss
│ │ │ ├── _color-lightness.scss
│ │ │ ├── _flex-grid.scss
│ │ │ ├── _golden-ratio.scss
│ │ │ ├── _grid-width.scss
│ │ │ ├── _modular-scale.scss
│ │ │ ├── _px-to-em.scss
│ │ │ ├── _px-to-rem.scss
│ │ │ ├── _strip-units.scss
│ │ │ ├── _tint-shade.scss
│ │ │ ├── _transition-property-name.scss
│ │ │ └── _unpack.scss
│ │ ├── helpers
│ │ │ ├── _convert-units.scss
│ │ │ ├── _gradient-positions-parser.scss
│ │ │ ├── _is-num.scss
│ │ │ ├── _linear-angle-parser.scss
│ │ │ ├── _linear-gradient-parser.scss
│ │ │ ├── _linear-positions-parser.scss
│ │ │ ├── _linear-side-corner-parser.scss
│ │ │ ├── _radial-arg-parser.scss
│ │ │ ├── _radial-gradient-parser.scss
│ │ │ ├── _radial-positions-parser.scss
│ │ │ ├── _render-gradients.scss
│ │ │ ├── _shape-size-stripper.scss
│ │ │ └── _str-to-num.scss
│ │ └── settings
│ │ │ ├── _asset-pipeline.scss
│ │ │ ├── _prefixer.scss
│ │ │ └── _px-to-em.scss
│ │ ├── font-awesome
│ │ ├── _animated.scss
│ │ ├── _bordered-pulled.scss
│ │ ├── _core.scss
│ │ ├── _fixed-width.scss
│ │ ├── _icons.scss
│ │ ├── _larger.scss
│ │ ├── _list.scss
│ │ ├── _mixins.scss
│ │ ├── _path.scss
│ │ ├── _rotated-flipped.scss
│ │ ├── _stacked.scss
│ │ ├── _variables.scss
│ │ └── font-awesome.scss
│ │ ├── neat
│ │ ├── _neat-helpers.scss
│ │ ├── _neat.scss
│ │ ├── functions
│ │ │ ├── _new-breakpoint.scss
│ │ │ └── _private.scss
│ │ ├── grid
│ │ │ ├── _box-sizing.scss
│ │ │ ├── _direction-context.scss
│ │ │ ├── _display-context.scss
│ │ │ ├── _fill-parent.scss
│ │ │ ├── _media.scss
│ │ │ ├── _omega.scss
│ │ │ ├── _outer-container.scss
│ │ │ ├── _pad.scss
│ │ │ ├── _private.scss
│ │ │ ├── _row.scss
│ │ │ ├── _shift.scss
│ │ │ ├── _span-columns.scss
│ │ │ ├── _to-deprecate.scss
│ │ │ └── _visual-grid.scss
│ │ └── settings
│ │ │ ├── _disable-warnings.scss
│ │ │ ├── _grid.scss
│ │ │ └── _visual-grid.scss
│ │ └── refills
│ │ ├── _base.scss
│ │ ├── _button_group.scss
│ │ ├── _centered_navigation.scss
│ │ ├── _flashes.scss
│ │ ├── _footer.scss
│ │ └── _pagination.scss
├── app.js
└── app.scss
├── json
├── countries.json
├── delivery-methods.json
└── products.json
├── package.json
└── pages
├── basket.html
├── blog.html
├── checkout.html
├── favourites.html
├── index.html
└── thankyou.html
/.gitignore:
--------------------------------------------------------------------------------
1 | .sass-cache
2 | _site
3 | Gemfile.lock
4 | node_modules
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'jekyll'
4 | gem 'wdm', '>= 0.1.0' if Gem.win_platform?
5 | gem 'github-pages'
6 | gem 'html-proofer'
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Jekyll-Store/Front
2 |
3 | ## _products
4 |
5 | All products must have at least a unique name, price and image. All other meta-data can be used for filtering.
6 |
7 | If looking to export data from csv, see [csv_to_products](https://github.com/jekyll-store/csv_to_products).
8 |
9 | ## _config.yml
10 |
11 | * `defaultAddress`
12 | * `country` - iso as defined in `/_data/countries.yml`
13 |
14 | * `payment`
15 | * `currency` - [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) currency code.
16 | * `hook` - url for your [Microservice](https://github.com/jekyll-store/microservice) instance or similar app for handling payment processing.
17 |
18 | * `image_prefix`: Folder or url to be prefixed to all images
19 |
20 | * `paymillPublicKey`: [Paymill public key](https://developers.paymill.com/en/introduction/your-account/) (Only if using Paymill)
21 |
22 | * `accounting`: [accounting.js config](http://openexchangerates.github.io/accounting.js/#documentation)
23 |
24 | * `prose`: [prose.io config](https://github.com/prose/prose/wiki/Prose-Configuration)
25 |
26 | ## _data
27 |
28 | ### countries.yml
29 |
30 | Countries are given zones to group them and match which delivery methods are applicable for deliveries to that country.
31 |
32 | ### delivery-methods.yml
33 |
34 | Each delivery method must have a unique name.
35 |
36 | Each delivery method must have zones to match which countries they are applicable for.
37 |
38 | Each delivery method must have a calculator that is the name of a valid [Jekll-Store Engine](https://github.com/jekyll-store/engine) calculator and the args to be used for the calculator. Currently available calculators:
39 | * Fixed
40 | * Percent
41 | * Tiered
42 |
43 | ## json
44 |
45 | `products.json` must have the fields used for the products explicitly stated.
46 |
47 | ## Reset Hook
48 |
49 | To keep your [Microservice](https://github.com/jekyll-store/microservice) instance (or similar) up to date. Make sure to create a [github webhook](https://developer.github.com/webhooks/creating/) on your repository with it's reset url.
50 |
51 | ## Building Javascript
52 |
53 | Jekyll-Store Front uses [Browersify](https://github.com/substack/node-browserify) to compile the scripts together and to transpile JSX. If you would like to make changes to any of these files, you will have to do the following:
54 |
55 | 1. Install [node.js](https://nodejs.org/download/)
56 | 2. Install the packages: `npm install`
57 | 3. Delete duplicate packages: `npm dedupe`
58 | 4. Watch whilst making changes: `npm run watch`
59 | 5. Build the finalized version: `npm run build`
60 |
61 | ## Contributing
62 |
63 | 1. [Fork it](https://github.com/jekyll-store/front/fork)
64 | 2. Create your feature branch (`git checkout -b my-new-feature`)
65 | 3. Commit your changes (`git commit -am 'Add some feature'`)
66 | 4. Push to the branch (`git push origin my-new-feature`)
67 | 5. Create a new Pull Request
68 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | title: Jekyll-Store
2 | description: 'A lightweight, backend-free ecommerce solution.'
3 | baseurl: /front
4 | url: 'http://www.jekyll-store.com'
5 |
6 | # Jekyll-Store Engine
7 | defaultAddress:
8 | country: GB
9 | payment:
10 | currency: GBP
11 | hook: 'https://jekyll-store-microservice.herokuapp.com/purchase'
12 | tracking_id: 'UA-62379004-1'
13 |
14 | # Jekll-Store Front
15 | image_prefix: 'http://res.cloudinary.com/jekyll-store/'
16 | paymillPublicKey: 323027826220f6ed944b96a1a47e35a0
17 | wake_up: 'http://jekyll-store-microservice.herokuapp.com/ping'
18 | disqus_shortname: 'jekyll-store'
19 |
20 | # http://openexchangerates.github.io/accounting.js/#documentation
21 | accounting:
22 | symbol : '£'
23 | format: '%s%v'
24 | decimal : '.'
25 | thousand: ','
26 | precision : 2
27 |
28 | # https://github.com/prose/prose/wiki/Prose-Configuration
29 | prose:
30 | ignore:
31 | - _includes
32 | - _layouts
33 | - assets
34 | - json
35 | - node_modules
36 | - pages
37 | - .gitignore
38 | - _config.yml
39 | - CNAME
40 | - Gemfile
41 | - package.json
42 | - README.md
43 | metadata:
44 | _products:
45 | - name: name
46 | field:
47 | element: text
48 | label: Name
49 | help: Must be unique
50 | - name: price
51 | field:
52 | element: number
53 | label: 'Price (£)'
54 | - name: weight
55 | field:
56 | element: number
57 | label: 'Weight (kg)'
58 | - name: designer
59 | field:
60 | element: text
61 | label: Designer
62 | - name: type
63 | field:
64 | element: select
65 | label: Type
66 | options:
67 | - value: Wood
68 | - value: Metal
69 | - value: Metallic
70 | - name: condition
71 | field:
72 | element: select
73 | label: Condition
74 | options:
75 | - value: Mint
76 | - value: Worn
77 | - value: Rough
78 | - name: image
79 | field:
80 | element: text
81 | label: Image
82 | - name: big_image
83 | field:
84 | element: text
85 | label: Big Image
86 |
87 | # http://jekyllrb.com/docs/configuration/
88 | permalink: blog/:title
89 | sass:
90 | sass_dir: /assets/_sass
91 | style: :compressed
92 | collections:
93 | products:
94 | output: true
95 | permalink: /:path/
96 | defaults:
97 | -
98 | scope:
99 | path: '' # an empty string here means all files in the project
100 | type: posts # previously `post` in Jekyll 2.2.
101 | values:
102 | layout: post
103 | -
104 | scope:
105 | path: ''
106 | type: products
107 | values:
108 | layout: product
109 | exclude:
110 | - node_modules
111 | - Gemfile
112 | - Gemfile.lock
113 | - README.md
114 | - CNAME
115 | - package.json
116 |
--------------------------------------------------------------------------------
/_data/delivery-methods.yml:
--------------------------------------------------------------------------------
1 | - name: Royal Mail 48
2 | zones: [Domestic]
3 | eta: 2-3 working days
4 | calculator: Tiered
5 | args:
6 | field: weight
7 | tiers: [[0, 5.48], [5, 9.95], [10, 14.68], [15]]
8 | - name: Royal Mail 24
9 | zones: [Domestic]
10 | eta: 1 working day
11 | calculator: Tiered
12 | args:
13 | field: weight
14 | tiers: [[0, 8.35], [5, 12.13], [10, 20.34], [15, 18.94]]
15 | - name: International Standard
16 | zones: [International]
17 | eta: 4-5 working days
18 | calculator: Fixed
19 | args:
20 | amount: 25.00
--------------------------------------------------------------------------------
/_includes/centered_navigation.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/_includes/footer.html:
--------------------------------------------------------------------------------
1 |
23 |
--------------------------------------------------------------------------------
/_includes/head.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {% if page.title %}{{ page.title }} | {% elsif page.name %}{{ page.name }} | {% endif %}{{ site.title }}
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/_layouts/compress.html:
--------------------------------------------------------------------------------
1 | ---
2 | #
3 | # Jekyll layout that compresses HTML
4 | # v1.1.1
5 | # http://jch.penibelst.de/
6 | # © 2015 Anatol Broder
7 | # MIT License
8 | #
9 | ---
10 |
11 | {% if site.compress_html.ignore.envs contains jekyll.environment %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd p rt rp optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if site.compress_html.comments.size == 2 %}{% assign _comment_befores = _content | split: site.compress_html.comments.first %}{% for _comment_before in _comment_befores %}{% assign _comment_content = _comment_before | split: site.compress_html.comments.last | first %}{% if _comment_content %}{% capture _comment %}{{ site.compress_html.comments.first }}{{ _comment_content }}{{ site.compress_html.comments.last }}{% endcapture %}{% assign _content = _content | remove: _comment %}{% endif %}{% endfor %}{% endif %}{% assign _pre_befores = _content | split: "" %}{% case _pres.size %}{% when 2 %}{% capture _content %}{{ _content }}{{ _pres.last | split: " " | join: " " }}{% endcapture %}{% when 1 %}{% capture _content %}{{ _content }}{{ _pres.last | split: " " | join: " " }}{% endcapture %}{% endcase %}{% endfor %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " ; ; ;" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{{ _content }}{% endif %}
12 |
--------------------------------------------------------------------------------
/_layouts/default.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: compress
3 | ---
4 |
5 |
6 | {% include head.html %}
7 |
8 |
9 |
13 |
14 | {% include footer.html %}
15 |
16 |
17 |
--------------------------------------------------------------------------------
/_layouts/post.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 | {{ page.title }}
6 |
7 |
8 |
10 |
{{ page.author }}
11 |
13 | {{ page.date | date_to_string }}
14 |
15 |
16 |
17 |
18 | {{ content }}
19 |
20 |
21 |
22 |
23 |
36 | Please enable JavaScript to view the comments powered by Disqus.
37 |
--------------------------------------------------------------------------------
/_layouts/product.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
8 |
9 | {{ page.name }}
10 |
11 | £
12 | {{ page.price }}
13 |
14 |
15 |
16 |
17 |
20 |
21 |
22 | Type
23 | {{ page.type }}
24 |
25 |
26 | Condition
27 | {{ page.condition }}
28 |
29 |
30 | Weight
31 | {{ page.weight }}kg
32 |
33 |
34 |
35 |
36 |
38 |
39 | {{ content }}
40 |
41 |
42 |
43 |
49 |
--------------------------------------------------------------------------------
/_posts/2015-02-06-everything-you-need-to-know-about-plasma-stabilizers.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Everything You Need to Know About Plasma Stabilizers
3 | author: Max White
4 | author_image: 'max-white.jpg'
5 | ---
6 |
7 | In dignissim maximus posuere. Fusce vel arcu ante. Morbi lacinia purus diam, egestas facilisis mauris rhoncus vel. Vestibulum pharetra nibh quam, ultricies consequat leo volutpat eget. Phasellus lectus arcu, molestie quis libero consequat, finibus tempus metus. In vulputate erat a arcu faucibus, at ornare est dapibus.
8 |
9 | Nulla at vestibulum sapien. Ut nec mollis libero. Ut eget dolor tempor, varius nulla et, tincidunt ligula. Suspendisse eu nibh ut nulla lobortis vehicula. Quisque imperdiet metus interdum enim viverra, ut sagittis ante aliquet. Fusce vitae rutrum lorem. Ut nibh lacus, sagittis scelerisque lacus eu, commodo pellentesque diam. Aenean ut suscipit orci.
10 |
11 | Maecenas eu erat lacus. Nulla rhoncus convallis elit eu porttitor. Donec nibh arcu, posuere sit amet odio sit amet, sollicitudin consectetur tortor. Sed efficitur rhoncus ligula, vel semper diam malesuada eu. Aliquam volutpat iaculis velit non laoreet. Aliquam porttitor a risus sed volutpat. Sed sed finibus urna. Cras lacinia pulvinar metus eu tempor. Quisque dolor justo, luctus in risus sit amet, condimentum pretium purus. Morbi aliquam neque ac tellus ullamcorper ultricies. Duis orci lorem, tincidunt vitae ullamcorper pharetra, vehicula at lacus. Curabitur sed felis eleifend, fringilla eros at, ornare urna. Fusce ornare ac ligula sit amet condimentum. Morbi congue, nibh eu pulvinar iaculis, purus ipsum egestas lacus, eget maximus nibh ex ac leo.
12 |
13 | In vel diam nec mauris posuere sodales vel congue sapien. Aenean consequat urna dignissim urna porta euismod. Etiam eu eros a lacus porta consectetur. Aenean at iaculis massa. Maecenas ac gravida odio. Quisque maximus neque velit, sed maximus arcu lobortis vitae. Ut at porttitor metus, posuere cursus risus. Nullam lobortis egestas augue sed iaculis. Pellentesque viverra libero nec lectus facilisis, at egestas nisi luctus. Fusce velit tellus, eleifend sit amet diam ac, pharetra tincidunt mi. Sed commodo eget ante sit amet elementum. Integer malesuada placerat est non laoreet. Nulla nec cursus nibh.
14 |
15 | Cras tempor vitae mauris id convallis. Vivamus facilisis sodales massa et ultrices. Aenean gravida risus quis dolor cursus, ut vehicula mauris varius. Mauris varius id diam aliquam sagittis. Maecenas pulvinar a ex eu cursus. Morbi quis augue lacinia, facilisis risus nec, congue eros. Nulla dolor purus, viverra at erat id, accumsan consequat ex. Mauris dictum eleifend diam, quis tempor justo rhoncus a. Mauris efficitur faucibus magna. Integer a euismod tellus. Phasellus id ligula eget odio dapibus mattis. Nunc enim tortor, ornare id pulvinar id, sagittis eget erat. Etiam eu augue arcu. Duis vel tortor ac diam consequat elementum.
16 |
17 | Duis eget eleifend nibh. Nam non auctor diam. Duis lacus felis, sodales tempus nunc ut, bibendum pulvinar mi. Suspendisse tortor arcu, auctor vitae luctus id, commodo et metus. Suspendisse id imperdiet dolor. Ut et magna maximus, feugiat lacus eget, dapibus urna. Sed feugiat mi sit amet condimentum gravida. Suspendisse hendrerit justo porttitor mauris viverra, sed convallis tortor hendrerit. Pellentesque dapibus, lorem non cursus hendrerit, justo leo accumsan odio, at tristique metus ex nec nulla. Ut vitae risus ultricies, faucibus ligula ac, consectetur tortor. Ut malesuada metus eget tellus viverra tristique. Phasellus ultrices luctus orci, non congue augue interdum vitae.
18 |
19 | Etiam gravida odio nec nisi semper, in vehicula nulla tempor. Proin in mauris tristique magna cursus dapibus. Quisque lacus sem, rutrum sit amet sodales et, commodo id quam. Ut non lorem ipsum. Nulla aliquet mauris sit amet dui sollicitudin varius. Vivamus consequat ornare nulla a facilisis. Pellentesque ultricies arcu sit amet sem tincidunt rhoncus.
--------------------------------------------------------------------------------
/_posts/2015-02-17-regular-goofy-or-just-plain-weird.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Regular, Goofy or Just Plain Weird
3 | author: Max White
4 | author_image: 'max-white.jpg'
5 | ---
6 |
7 | Donec suscipit quam sit amet nunc venenatis condimentum. Aenean pharetra convallis semper. Donec dictum est odio, vel malesuada tellus ornare at. Cras vestibulum orci tristique molestie bibendum. Sed imperdiet posuere mi, ac cursus neque finibus eu. Morbi quis auctor mi, quis accumsan magna. Donec eleifend eu enim ac sagittis. Integer posuere rhoncus fringilla.
8 |
9 | Nunc est est, sagittis eget velit auctor, bibendum scelerisque felis. Vivamus mollis magna ut enim egestas porta ac nec ante. Sed molestie enim velit, id aliquet mi pellentesque ut. Etiam et nibh eu nunc viverra condimentum at quis nibh. Nulla vel nibh velit. Nulla facilisis nisl in eros ultricies, sit amet fermentum purus hendrerit. Praesent pulvinar cursus est in venenatis. Nam non ligula et ex mattis facilisis quis ac nulla.
10 |
11 | Nam ac ex imperdiet, ullamcorper est non, accumsan turpis. Sed eu urna ultrices, convallis purus ut, condimentum purus. Duis malesuada est nec lectus fermentum, ut finibus tellus viverra. Mauris a orci lacus. Curabitur dignissim id ligula in faucibus. Suspendisse neque mauris, semper sit amet lectus in, elementum fringilla lacus.
12 |
13 | Ut ultrices, urna eu molestie congue, felis odio maximus arcu, vel rutrum elit nunc non turpis. Duis quis turpis sed leo ultrices iaculis. Nullam tristique iaculis diam, eget bibendum nunc. Morbi ac est mattis, imperdiet risus lobortis, elementum ante. Cras ut molestie libero, ut commodo massa. Ut fringilla sodales eros sed sagittis. Donec pretium odio et magna porta egestas. Vivamus eu ante sollicitudin, tincidunt nunc eget, mollis est. Nullam a elementum ligula. Donec sed massa ac massa venenatis fringilla. Donec posuere cursus convallis. Aenean congue velit porta ultrices commodo. In vel neque in risus tempor malesuada. Pellentesque in ultricies leo, sit amet dignissim diam. Suspendisse ipsum diam, facilisis in imperdiet et, pharetra in nulla. Donec ac risus sed est molestie imperdiet.
14 |
15 | Donec rutrum felis egestas semper iaculis.Donec at ex ac mi tincidunt tincidunt ac ac mi. Aliquam cursus condimentum dignissim. Mauris aliquet nulla elit, nec pulvinar diam mattis vitae. Aliquam sit amet ante quis eros condimentum vestibulum eget gravida est. Morbi sem neque, consectetur a sodales nec, pellentesque vel urna. Vestibulum magna dui, scelerisque eu urna sed, eleifend auctor libero. Aliquam non lacinia arcu. Vivamus commodo augue facilisis sapien mattis iaculis. Quisque fringilla arcu dolor, vitae facilisis ipsum volutpat eget.
16 |
17 | Etiam id blandit velit. Quisque tincidunt erat vel lacus rutrum, ac elementum tellus molestie. Nunc pretium interdum mauris ac sagittis. Integer ut cursus orci. Integer pretium ante eu semper finibus. Nulla vel vehicula felis. Proin in nisi iaculis sapien imperdiet aliquet eu ac justo. Aenean et pretium est. Phasellus pretium eros mauris. Nulla pretium efficitur metus in sollicitudin.
18 |
19 | Curabitur blandit semper diam nec venenatis. Ut quis libero et lorem auctor aliquet non eget nulla. Nunc interdum rutrum nunc a sollicitudin. Cras imperdiet diam ac massa posuere, nec aliquam lectus ultricies. Phasellus at maximus augue. Nullam aliquet fermentum justo a pretium. Nunc varius a nunc non elementum. Quisque venenatis vehicula orci. Aenean convallis erat augue, nec consectetur felis placerat et. Vestibulum blandit dui eros, fermentum tristique mauris tempus eget.
--------------------------------------------------------------------------------
/_posts/2015-03-15-7-reasons-hoverboards-are-awesome.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: '7 Reasons Hoverboards Are Awesome'
3 | author: Max White
4 | author_image: 'max-white.jpg'
5 | ---
6 |
7 | Duis accumsan sodales massa nec porttitor. Cras facilisis gravida mi in sollicitudin. Proin sem mauris, tincidunt ut viverra at, pretium sit amet lorem. Ut elit lacus, fermentum at feugiat sit amet, pulvinar tempor neque. Fusce ac quam efficitur, hendrerit ligula at, pharetra quam. Vestibulum lobortis posuere dui quis imperdiet. Fusce egestas leo eu condimentum volutpat. Suspendisse sed convallis sem, sed tincidunt arcu. Nulla consectetur iaculis consequat.
8 |
9 | Morbi vehicula orci sed diam suscipit volutpat. Nulla imperdiet varius volutpat. Donec finibus, arcu eu egestas finibus, leo mi dapibus lacus, in suscipit eros enim id augue. Sed tincidunt justo id consectetur malesuada. Aliquam in cursus felis. Sed venenatis eu nisi ut cursus. Ut eget sollicitudin ante. Nulla semper dui id nibh cursus, sit amet euismod dui sagittis.
10 |
11 | Sed et congue est, at semper sem. Sed quis est porta, sagittis ex quis, vestibulum neque. Fusce rutrum augue vitae orci consectetur, hendrerit placerat neque vulputate. Sed semper velit et massa rutrum accumsan. Suspendisse ac dui libero. Proin pharetra ligula quis nulla rhoncus tincidunt. Ut nec ex et odio molestie euismod ac a quam. Sed quis dui euismod, dictum felis vitae, tempor sem. Quisque placerat diam vel sapien tincidunt, eget congue quam ullamcorper. Proin eu ante mauris.
12 |
13 | Nunc pulvinar blandit mi ut condimentum.
--------------------------------------------------------------------------------
/_products/birgerboard.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Birgerboard
3 | price: 580
4 | weight: 3.66
5 | designer: Birgers Oterutleie
6 | type: Wood
7 | condition: Mint
8 | image: 'birgerboard-small.jpg'
9 | big_image: 'birgerboard-big.jpg'
10 | ---
11 |
12 | Vestibulum euismod turpis vel purus condimentum ultricies id in ipsum. Donec sit amet lectus ut est commodo fermentum in non tortor. Cras imperdiet et tellus ut hendrerit. Donec efficitur dui in dui auctor sagittis. Curabitur rhoncus elit id enim accumsan rutrum. Nunc porta lobortis nisi, volutpat dictum mauris luctus ac. Praesent ullamcorper rhoncus egestas.
13 |
14 | The [images][flickr] used for this product were designed by [Birger´s Oterutleie][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/16189931266
17 | [designer]: http://birgersoterutleie.com
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/blue-dot.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Blue Dot
3 | price: 285
4 | weight: 3.39
5 | designer: Gudrun Brekke
6 | type: Wood
7 | condition: Worn
8 | image: 'blue-dot-small.jpg'
9 | big_image: 'blue-dot-big.jpg'
10 | ---
11 |
12 | Pellentesque dignissim porttitor leo sed condimentum. Maecenas sodales urna id blandit efficitur. Mauris quis posuere massa, at varius quam. Donec quam leo, sollicitudin a dignissim quis, consectetur quis urna. Duis sit amet est at dolor ultrices eleifend quis faucibus mauris. Morbi mattis suscipit suscipit. Proin ac tristique purus, sed finibus justo.
13 |
14 | The [images][flickr] used for this product were designed by [Gudrun Brekke][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/15455617174
17 | [designer]: http://www.behance.net/Gudrun
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/bullet.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bullet
3 | price: 315
4 | weight: 4.13
5 | designer: Philip Notland
6 | type: Wood
7 | condition: Rough
8 | image: 'bullet-small.jpg'
9 | big_image: 'bullet-big.jpg'
10 | ---
11 |
12 | Donec et scelerisque est. Suspendisse aliquet interdum interdum. Proin id sem arcu. Curabitur vitae est ullamcorper, malesuada nisi eu, maximus lacus. Cras vehicula, nulla sit amet suscipit porta, dolor risus posuere massa, nec accumsan nisl justo in risus. Sed ac ipsum sit amet orci volutpat dictum eu sed magna. Sed vitae enim lacinia risus condimentum placerat.
13 |
14 | The [images][flickr] used for this product were designed by Philip Notland and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/15382248904
17 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/classic.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Classic
3 | price: 575
4 | weight: 4.02
5 | designer: JHåland
6 | type: Wood
7 | condition: Mint
8 | image: 'classic-small.jpg'
9 | big_image: 'classic-big.jpg'
10 | ---
11 |
12 | Suspendisse nisi quam, sollicitudin convallis semper sed, porta pretium est. Morbi non condimentum enim. Sed non massa a justo porta porta eget et odio. Quisque dictum est eget purus scelerisque, id feugiat ligula maximus. In nulla ligula, faucibus nec felis non, commodo scelerisque ante. Suspendisse dictum hendrerit nisl, ac vulputate nisl. Nunc facilisis ante eu ipsum tincidunt, id vulputate felis finibus. Morbi eu accumsan orci.
13 |
14 | The [images][flickr] used for this product were designed by [Jørgen Håland][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/15817108788
17 | [designer]: http://jhaland.com
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/forward.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Forward
3 | price: 750
4 | weight: 2.83
5 | designer: Joakim Carlsen
6 | type: Metal
7 | condition: Mint
8 | image: 'forward-small.jpg'
9 | big_image: 'forward-big.jpg'
10 | ---
11 |
12 | Pellentesque in nisl euismod, feugiat sem eget, pharetra mi. Cras consectetur accumsan massa vel cursus. Morbi laoreet laoreet tortor quis laoreet. Mauris iaculis sollicitudin diam, eget tincidunt ex condimentum ornare. Cras a ipsum et ante gravida eleifend at in sapien. Cras et porta ipsum. In pellentesque ultricies arcu, eleifend laoreet urna accumsan eu.
13 |
14 | The [images][flickr] used for this product were designed by [Joakim Carlsen][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/16033393402
17 | [designer]: http://kassett.no
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/hooverboard.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Hooverboard
3 | price: 345
4 | weight: 3.1
5 | designer: Helge Kirkaune
6 | type: Metal
7 | condition: Worn
8 | image: 'hooverboard-small.jpg'
9 | big_image: 'hooverboard-big.jpg'
10 | ---
11 |
12 | Vestibulum convallis posuere felis id maximus. Maecenas euismod, sapien et porttitor consequat, augue arcu tincidunt ex, quis vestibulum quam ex vel ipsum. Etiam suscipit purus non nulla volutpat bibendum. Suspendisse semper a urna quis mollis. Praesent a odio in arcu tempor feugiat.
13 |
14 | The [images][flickr] used for this product were designed by [Helge Kirkaune][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/16004492855
17 | [designer]: http://www.behance.net/Machelgee817
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/hoverskull.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Hoverskull
3 | price: 330
4 | weight: 3.24
5 | designer: Jonas Bødtker
6 | type: Metallic
7 | condition: Worn
8 | image: 'hoverskull-small.jpg'
9 | big_image: 'hoverskull-big.jpg'
10 | ---
11 |
12 | Nam eget leo vitae lectus pulvinar accumsan. Aliquam efficitur vel erat in mollis. Phasellus cursus ligula nec lectus pharetra, vel tristique sapien facilisis. Etiam condimentum condimentum sapien in hendrerit.
13 |
14 | The [images][flickr] used for this product were designed by [Jonas Bødtker][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/16471502205
17 | [designer]: http://jonasbodtker.com
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/lysboards-hovervarsel.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Lysboard's Hovervarsel
3 | price: 290
4 | weight: 4.15
5 | designer: Jacob Lysgaard
6 | type: Wood
7 | condition: Rough
8 | image: 'lysboards-hovervarsel-small.jpg'
9 | big_image: 'lysboards-hovervarsel-big.jpg'
10 | ---
11 |
12 | Phasellus suscipit sem eu lacinia facilisis. Nullam eu enim viverra, pharetra nisi in, rhoncus lorem. Etiam efficitur ante vitae purus tincidunt, in pellentesque ex congue. Donec eget mi nec libero mollis faucibus sodales nec lectus. In pellentesque lorem non orci tempus, id scelerisque orci tempor. Curabitur vitae dolor sem.
13 |
14 | The [images][flickr] used for this product were designed by [Jacob Lysgaard][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/15868669428
17 | [designer]: http://nabovarsel.info
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/mattel.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Mattel
3 | price: 565
4 | weight: 2.97
5 | designer: John Bell
6 | type: Metallic
7 | condition: Rough
8 | image: 'mattel-small.jpg'
9 | big_image: 'mattel-big.jpg'
10 | ---
11 |
12 | Phasellus suscipit sem eu lacinia facilisis. Nullam eu enim viverra, pharetra nisi in, rhoncus lorem. Etiam efficitur ante vitae purus tincidunt, in pellentesque ex congue. Donec eget mi nec libero mollis faucibus sodales nec lectus. In pellentesque lorem non orci tempus, id scelerisque orci tempor. Curabitur vitae dolor sem.
13 |
14 | The [images][flickr] used for this product were designed by John Bell and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/15817108478
17 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/merry-christmas.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Merry Christmas
3 | price: 380
4 | weight: 4.03
5 | designer: JHåland
6 | type: Wood
7 | condition: Worn
8 | image: 'merry-christmas-small.jpg'
9 | big_image: 'merry-christmas-big.jpg'
10 | ---
11 |
12 | Praesent in mollis purus, eu tristique ligula. Vivamus viverra nulla non sapien facilisis tempor. Ut condimentum pulvinar quam, eget tristique lectus luctus sed. Nullam pharetra dui sem, sed efficitur ligula tincidunt ut. Sed quam tellus, porta ut lectus nec, accumsan tempor ex. Duis vitae interdum arcu, ut sodales ante. In diam metus, pellentesque ut urna in, sodales iaculis tellus.
13 |
14 | The [images][flickr] used for this product were designed by [Jørgen Håland][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/15491614883
17 | [designer]: http://jhaland.com
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/trinity-owl.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Trinity Owl
3 | price: 350
4 | weight: 4.26
5 | designer: Håvar Legreid
6 | type: Wood
7 | condition: Worn
8 | image: 'trinity-owl-small.jpg'
9 | big_image: 'trinity-owl-big.jpg'
10 | ---
11 |
12 | Quisque gravida, libero quis pharetra fermentum, velit elit sollicitudin elit, quis tempor justo sem a tortor. Quisque lacinia magna in est accumsan mollis. Pellentesque vulputate tristique congue. Mauris posuere interdum leo, vel vestibulum lacus elementum at. Cras nec dictum dolor. Phasellus eleifend pellentesque nisl vel auctor. Fusce sagittis massa eget iaculis sollicitudin.
13 |
14 | The [images][flickr] used for this product were designed by [Håvar Legreid][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/15491614883
17 | [designer]: http://leketoys.no
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/waterhover.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Waterhover
3 | price: 490
4 | weight: 2.53
5 | designer: JHåland
6 | type: Metallic
7 | condition: Worn
8 | image: 'waterhover-small.jpg'
9 | big_image: 'waterhover-big.jpg'
10 | ---
11 |
12 | Etiam dapibus condimentum lorem, id fermentum erat rutrum eu. Aenean justo ipsum, luctus at felis id, tincidunt sollicitudin risus. Nullam sagittis, augue non fermentum tristique, diam eros vehicula velit, vitae vehicula ante elit varius eros. Curabitur ut dolor at mauris condimentum feugiat non a nisi. Mauris luctus augue vel massa accumsan volutpat. Vestibulum in dolor eget dui lacinia lacinia.
13 |
14 | The [images][flickr] used for this product were designed by [Jørgen Håland][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/15978719286
17 | [designer]: http://jhaland.com
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/_products/zboard.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: ZBoard
3 | price: 355
4 | weight: 3.98
5 | designer: Annette Sandøy Kristiansen
6 | type: Wood
7 | condition: Rough
8 | image: 'zboard-small.jpg'
9 | big_image: 'zboard-big.jpg'
10 | ---
11 |
12 | Maecenas vel tellus sed leo rhoncus faucibus eget ut tortor. Aliquam a dolor ac tellus vestibulum tempor. Cras faucibus risus id mattis auctor. Nunc porta nunc sit amet felis posuere, sit amet varius diam fringilla. Nunc a ipsum iaculis velit viverra condimentum vel non neque. Maecenas eget feugiat enim.
13 |
14 | The [images][flickr] used for this product were designed by [Annette Sandøy Kristiansen][designer] and being used under the [creative common's licence][licence].
15 |
16 | [flickr]: http://www.flickr.com/photos/50290212@N05/15653753373
17 | [designer]: http://annettekri.no
18 | [licence]: http://creativecommons.org/licenses/by/2.0
--------------------------------------------------------------------------------
/assets/_js/components/AddToBasket.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var JSE = require('jekyll-store-engine');
3 |
4 | var AddToBasket = React.createClass({
5 | getInitialState: function() { return { quantity: 1 }; },
6 | setQuantity: function(e) { this.setState({ quantity: e.target.value }); },
7 | add: function() {
8 | JSE.Actions.setItem({
9 | name: this.props.name,
10 | quantity: +this.state.quantity
11 | })
12 | },
13 | render: function() {
14 | return (
15 |
21 | );
22 | }
23 | });
24 |
25 | module.exports = AddToBasket;
--------------------------------------------------------------------------------
/assets/_js/components/Basket.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Reflux = require('reflux');
3 | var JSE = require('jekyll-store-engine');
4 | var BasketItem = require('./BasketItem.jsx');
5 | var money = require('../helpers/money');
6 |
7 | var Basket = React.createClass({
8 | mixins: [Reflux.connect(JSE.Stores.Order), Reflux.connect(JSE.Stores.Basket)],
9 | render: function() {
10 | return (
11 |
12 |
Basket
13 |
14 |
15 |
16 | Product Price Quatity Cost
17 |
18 | {
19 | Object.keys(this.state.basket).map(function(name, i) {
20 | return ;
21 | }, this)
22 | }
23 |
24 | Item Total
25 |
26 |
27 |
28 | {money(this.state.order.totals.price)}
29 |
30 |
31 |
32 |
33 | Checkout
34 |
35 |
36 |
37 |
38 |
39 | );
40 | }
41 | });
42 |
43 | module.exports = Basket;
44 |
--------------------------------------------------------------------------------
/assets/_js/components/BasketItem.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var JSE = require('jekyll-store-engine');
3 | var money = require('../helpers/money');
4 |
5 | var BasketItem = React.createClass({
6 | set: function(e) {
7 | JSE.Actions.setItem({
8 | name: this.props.item.name,
9 | quantity: e.target.value
10 | });
11 | },
12 | remove: function(e) {
13 | JSE.Actions.removeItem({ name: this.props.item.name });
14 | },
15 | render: function() {
16 | var item = this.props.item;
17 | return (
18 |
19 |
20 |
21 | {item.name}
22 |
23 |
24 |
25 | {money(item.price)}
26 |
27 | {money(item.subtotal)}
28 | x
29 |
30 | );
31 | }
32 | });
33 |
34 | module.exports = BasketItem;
35 |
--------------------------------------------------------------------------------
/assets/_js/components/BasketSummary.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Reflux = require('reflux');
3 | var JSE = require('jekyll-store-engine');
4 | var money = require('../helpers/money');
5 |
6 | var BasketSummary = React.createClass({
7 | mixins: [Reflux.connect(JSE.Stores.Order)],
8 |
9 | render: function() {
10 | var total = this.state.order.totals.price;
11 | return total > 0 ? this.renderSummary(total) : null;
12 | },
13 |
14 | renderSummary: function(total) {
15 | return (
16 |
17 |
18 | {money(total)}
19 |
20 | );
21 | }
22 | });
23 |
24 | module.exports = BasketSummary;
25 |
--------------------------------------------------------------------------------
/assets/_js/components/CountriesSelect.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Reflux = require('reflux');
3 | var JSE = require('jekyll-store-engine');
4 |
5 | var CountriesSelect = React.createClass({
6 | mixins: [
7 | Reflux.connect(JSE.Stores.Countries),
8 | Reflux.connect(JSE.Stores.Address)
9 | ],
10 | change: function(e) { JSE.Actions.setAddress({ country: e.target.value }); },
11 | values: function(obj) { return Object.keys(obj).map(function(k){ return obj[k]; }); },
12 |
13 | sortedCountries: function() {
14 | return this.values(this.state.countries).sort(function(a, b) {
15 | return a.name > b.name ? 1 : -1
16 | });
17 | },
18 |
19 | render: function() {
20 | return (
21 |
24 | {
25 | this.sortedCountries().map(function(country, i) {
26 | return {country.name} ;
27 | })
28 | }
29 |
30 | );
31 | }
32 | });
33 |
34 | module.exports = CountriesSelect;
35 |
--------------------------------------------------------------------------------
/assets/_js/components/DeliverySelect.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Reflux = require('reflux');
3 | var JSE = require('jekyll-store-engine');
4 | var money = require('../helpers/money');
5 |
6 | var DeliverySelect = React.createClass({
7 | mixins: [
8 | Reflux.connect(JSE.Stores.DeliveryMethods),
9 | Reflux.connect(JSE.Stores.Delivery)
10 | ],
11 |
12 | select: function(name) {
13 | JSE.Actions.setDelivery({ delivery: name });
14 | },
15 |
16 | render: function() {
17 | return (
18 |
19 |
20 | {
21 | Object.keys(this.state.methods).map(function(name, i) {
22 | return (
23 |
26 | {name}
27 |
28 | );
29 | }, this)
30 | }
31 |
32 |
{money(this.state.delivery.amount)}
33 |
34 | );
35 | }
36 | });
37 |
38 | module.exports = DeliverySelect;
--------------------------------------------------------------------------------
/assets/_js/components/Display.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Reflux = require('reflux');
3 | var JSE = require('jekyll-store-engine');
4 |
5 | var Display = React.createClass({
6 | mixins: [
7 | Reflux.connect(JSE.Stores.Display),
8 | require('../mixins/Products')
9 | ],
10 | render: function() {
11 | return (
12 |
13 | { this.state.display.products.length > 0 ?
14 |
{this.products(this.state.display.products)} :
15 |
No Products Found
16 | }
17 |
18 | );
19 | }
20 | });
21 |
22 | module.exports = Display;
23 |
--------------------------------------------------------------------------------
/assets/_js/components/Errors.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Reflux = require('reflux');
3 | var JSE = require('jekyll-store-engine');
4 |
5 | var Errors = React.createClass({
6 | mixins: [Reflux.connect(JSE.Stores.Order)],
7 | render: function() {
8 | return this.state.order.errors.length === 0 ? null :
9 |
10 | {
11 | this.state.order.errors.asMutable().map(function(error, i) {
12 | return {error}
13 | })
14 | }
15 |
;
16 | }
17 | });
18 |
19 | module.exports = Errors;
20 |
--------------------------------------------------------------------------------
/assets/_js/components/Favourites.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 |
3 | var Favourites = React.createClass({
4 | mixins: [require('../mixins/Products')],
5 | values: function(obj) { return Object.keys(obj).map(function(k){ return obj[k]; }); },
6 | render: function() {
7 | return (
8 |
9 |
Your Favourites
10 | {
11 | Object.keys(this.state.favourites).length > 0 ?
12 |
{this.products(this.values(this.state.favourites))} :
13 |
No Products Found
14 | }
15 |
16 | );
17 | }
18 | });
19 |
20 | module.exports = Favourites;
--------------------------------------------------------------------------------
/assets/_js/components/OrderSummary.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Reflux = require('reflux');
3 | var JSE = require('jekyll-store-engine');
4 | var money = require('../helpers/money');
5 |
6 | var OrderSummary = React.createClass({
7 | mixins: [Reflux.connect(JSE.Stores.Order)],
8 | render: function() {
9 | return (
10 |
11 |
12 | Item Total {money(this.state.order.totals.price)}
13 | {
14 | this.state.order.adjustments.asMutable().map(function(adjustment, i) {
15 | return(
16 |
17 | {adjustment.label}
18 | {money(adjustment.amount)}
19 |
20 | );
21 | })
22 | }
23 | Total {money(this.state.order.totals.order)}
24 |
25 |
26 | );
27 | }
28 | });
29 |
30 | module.exports = OrderSummary;
31 |
--------------------------------------------------------------------------------
/assets/_js/components/Pagination.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Reflux = require('reflux');
3 | var JSE = require('jekyll-store-engine');
4 | var I = require('seamless-immutable');
5 |
6 | var Pagination = React.createClass({
7 | mixins: [Reflux.listenTo(JSE.Stores.Display, 'onChange')],
8 | onChange: function(args) {
9 | if(args.display.page) { this.setState(args.display.page); }
10 | },
11 |
12 | getInitialState: function() {
13 | this.setPage(1);
14 | return { current: 1, numbers: I([1]), prev: null, next: null };
15 | },
16 |
17 | prev: function() { this.setPage(this.state.prev); },
18 | next: function() { this.setPage(this.state.next); },
19 |
20 | setPage: function(i) {
21 | JSE.Actions.setDisplayFilter({
22 | name: 'page',
23 | filter: JSE.Filters.Page(this.props.pagesize, i)
24 | });
25 | },
26 |
27 | render: function() {
28 | var nope = 'javascript:void(0)';
29 | return (
30 |
31 |
32 |
33 | {this.state.prev ? Prev : null}
34 |
35 |
36 | {
37 | this.state.numbers.asMutable().map(function(i) {
38 | return (
39 |
40 | {this.state.current == i ?
41 | {i} :
42 | {i} }
43 |
44 | );
45 | }, this)
46 | }
47 |
48 |
49 |
50 | {this.state.next ? Next : null}
51 |
52 |
53 |
54 | );
55 | }
56 | });
57 |
58 | module.exports = Pagination;
59 |
--------------------------------------------------------------------------------
/assets/_js/components/Product.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var JSE = require('jekyll-store-engine');
3 | var money = require('../helpers/money');
4 |
5 | var Product = React.createClass({
6 | addToBasket: function() {
7 | JSE.Actions.setItem({ name: this.props.product.name, quantity: 1 });
8 | },
9 | addToFavourites: function() {
10 | JSE.Actions.favourite({ name: this.props.product.name });
11 | },
12 | removeFromFavourites: function() {
13 | JSE.Actions.removeFromFavourites({ name: this.props.product.name });
14 | },
15 | render: function() {
16 | var product = this.props.product;
17 | return (
18 |
19 |
20 |
21 |
22 |
23 |
24 |
{product.name}
25 |
{money(product.price)}
26 |
27 |
28 | {
29 | this.props.inBasket ?
30 | :
31 |
32 | }
33 | {
34 | this.props.inFavourites ?
35 | :
36 |
37 | }
38 |
39 |
40 |
41 | );
42 | }
43 | });
44 |
45 | module.exports = Product;
46 |
--------------------------------------------------------------------------------
/assets/_js/components/RangesButtonGroup.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var JSE = require('jekyll-store-engine');
3 |
4 | var RangesButtonGroup = React.createClass({
5 | getInitialState: function() { return { selected: [] }; },
6 |
7 | select: function(i) {
8 | var selected = this.toggle(i, this.state.selected);
9 | var ranges = this.selectedRanges(selected);
10 | var field = this.props.field;
11 | if(ranges.length > 0) {
12 | JSE.Actions.setDisplayFilter({
13 | name: field,
14 | filter: JSE.Filters.Ranges(field, ranges)
15 | });
16 | } else {
17 | JSE.Actions.removeDisplayFilter({ name: field });
18 | }
19 | },
20 |
21 | toggle: function(i, selected) {
22 | selected[i] = !selected[i];
23 | this.setState({ selected: selected });
24 | return selected;
25 | },
26 |
27 | selectedRanges: function(selected) {
28 | var ranges = [];
29 | for(var i = 0; i < selected.length; i++) {
30 | if(selected[i]) { ranges.push(this.props.ranges[i]); }
31 | }
32 | return ranges;
33 | },
34 |
35 | render: function() {
36 | return (
37 |
38 | {
39 | this.props.ranges.map(function(tag, i) {
40 | return (
41 |
45 | {this.props.labels[i]}
46 |
47 | );
48 | }, this)
49 | }
50 |
51 | );
52 | }
53 | });
54 |
55 | module.exports = RangesButtonGroup;
56 |
--------------------------------------------------------------------------------
/assets/_js/components/SearchBox.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var JSE = require('jekyll-store-engine');
3 |
4 | var SearchBox = React.createClass({
5 | update: function(e) {
6 | var txt = e.target.value;
7 | if(txt) {
8 | var filter = JSE.Filters.Search(this.props.field, txt);
9 | JSE.Actions.setDisplayFilter({ name: 'search', filter: filter });
10 | } else {
11 | JSE.Actions.removeDisplayFilter({ name: 'search' });
12 | }
13 | },
14 | render: function() {
15 | return (
16 |
17 | );
18 | }
19 | });
20 |
21 | module.exports = SearchBox;
22 |
--------------------------------------------------------------------------------
/assets/_js/components/SortButtonGroup.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var JSE = require('jekyll-store-engine');
3 |
4 | var SortButtonGroup = React.createClass({
5 | getInitialState: function() { return { selected: null, direction: null }; },
6 |
7 | handleClick: function(field) {
8 | if(this.state.selected !== field) { this.select(field); return; }
9 | if(this.state.direction === JSE.Filters.Sort.ASC){
10 | this.switchDirection(field);
11 | } else {
12 | this.deselect();
13 | }
14 | },
15 |
16 | filter: function(field, direction) {
17 | JSE.Actions.setDisplayFilter({
18 | name: 'sort',
19 | filter: JSE.Filters.Sort(field, direction)
20 | });
21 | },
22 |
23 | select: function(field) {
24 | this.setState({ selected: field, direction: JSE.Filters.Sort.ASC });
25 | this.filter(field, JSE.Filters.Sort.ASC);
26 | },
27 |
28 | switchDirection: function(field) {
29 | this.setState({ direction: JSE.Filters.Sort.DESC });
30 | this.filter(field, JSE.Filters.Sort.DESC);
31 | },
32 |
33 | deselect: function() {
34 | this.setState({ selected: null, direction: null });
35 | JSE.Actions.removeDisplayFilter({ name: 'sort' });
36 | },
37 |
38 | render: function() {
39 | return (
40 |
41 | {
42 | this.props.fields.map(function(field, i) {
43 | var selected = this.state.selected === field ? 'selected' : '';
44 | var direction = selected && this.state.direction;
45 | return (
46 |
50 | {this.props.labels[i]}
51 |
52 | );
53 | }, this)
54 | }
55 |
56 | );
57 | }
58 | });
59 |
60 | module.exports = SortButtonGroup;
61 |
--------------------------------------------------------------------------------
/assets/_js/components/TagButtonGroup.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var JSE = require('jekyll-store-engine');
3 |
4 | var TagButtonGroup = React.createClass({
5 | getInitialState: function() { return { selected: [] }; },
6 |
7 | select: function(tag) {
8 | var selected = this.toggle(tag, this.state.selected);
9 | this.setState({ selected: selected });
10 | this.createAction(selected);
11 | },
12 |
13 | toggle: function(tag, selected) {
14 | var index = selected.indexOf(tag);
15 | index >= 0 ? selected.splice(index, 1) : selected.push(tag);
16 | return selected;
17 | },
18 |
19 | createAction: function(selected) {
20 | var field = this.props.field;
21 | if(selected.length > 0) {
22 | JSE.Actions.setDisplayFilter({
23 | name: field,
24 | filter: JSE.Filters.Tags(field, selected)
25 | });
26 | } else {
27 | JSE.Actions.removeDisplayFilter({ name: field });
28 | }
29 | },
30 |
31 | render: function() {
32 | return (
33 |
34 | {
35 | this.props.tags.map(function(tag, i) {
36 | return (
37 | = 0 ? 'selected' : ''}>
41 | {tag}
42 |
43 | );
44 | }, this)
45 | }
46 |
47 | );
48 | }
49 | });
50 |
51 | module.exports = TagButtonGroup;
52 |
--------------------------------------------------------------------------------
/assets/_js/components/Visited.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Reflux = require('reflux');
3 | var JSE = require('jekyll-store-engine');
4 |
5 | var Visited = React.createClass({
6 | mixins: [
7 | Reflux.connect(JSE.Stores.Visited),
8 | require('../mixins/Products')
9 | ],
10 | render: function() {
11 | var products = this.state.visited.slice(this.props.begin, this.props.end);
12 | return products.length == 0 ? null : (
13 |
14 |
Recently Visited
15 |
{this.products(products)}
16 |
17 | );
18 | }
19 | });
20 |
21 | module.exports = Visited;
--------------------------------------------------------------------------------
/assets/_js/helpers/loadJSON.js:
--------------------------------------------------------------------------------
1 | var SuperAgent = require('superagent');
2 |
3 | function loadJSON(url, callback) {
4 | SuperAgent
5 | .get(url)
6 | .end(function(err, resource) {
7 | if(err) {
8 | console.warn('Warning: ' + url + ' failed to load.');
9 | } else {
10 | callback(resource.body);
11 | }
12 | });
13 | }
14 |
15 | module.exports = loadJSON;
16 |
--------------------------------------------------------------------------------
/assets/_js/helpers/money.js:
--------------------------------------------------------------------------------
1 | var accounting = require('accounting');
2 |
3 | function money(amount) {
4 | return amount && accounting.formatMoney(amount);
5 | }
6 |
7 | module.exports = money;
8 |
--------------------------------------------------------------------------------
/assets/_js/helpers/renderComponent.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 |
3 | function renderComponent(id, component) {
4 | var element = document.getElementById(id);
5 | if(element) {
6 | React.render(
7 | React.createElement(component, getProps(element)),
8 | element
9 | );
10 | }
11 | };
12 |
13 | function getProps(element) {
14 | return getDataAttributes(element).reduce(function(obj, attribute) {
15 | obj[attribute.name.substr(5)] = eval(attribute.value);
16 | return obj;
17 | }, {});
18 | }
19 |
20 | function getDataAttributes(element) {
21 | return [].filter.call(element.attributes, function(attribute) {
22 | return /^data-/.test(attribute.name);
23 | });
24 | }
25 |
26 | module.exports = renderComponent;
27 |
--------------------------------------------------------------------------------
/assets/_js/helpers/spinner.js:
--------------------------------------------------------------------------------
1 | var Spinner = require('spin.js');
2 |
3 | var mySpinner;
4 |
5 | exports.show = function (id) {
6 | mySpinner = new Spinner().spin(document.getElementById(id));
7 | }
8 |
9 | exports.hide = function() {
10 | mySpinner && mySpinner.stop();
11 | }
--------------------------------------------------------------------------------
/assets/_js/helpers/toggle.js:
--------------------------------------------------------------------------------
1 | function toggle(id, klass) {
2 | var element = document.getElementById(id),
3 | classes = element.className.match(/\S+/g) || [],
4 | index = classes.indexOf(klass);
5 |
6 | index >= 0 ? classes.splice(index, 1) : classes.push(klass);
7 | element.className = classes.join(' ');
8 | }
9 |
10 | module.exports = toggle;
11 |
--------------------------------------------------------------------------------
/assets/_js/index.js:
--------------------------------------------------------------------------------
1 | // Vendor
2 | window.accounting = require('accounting');
3 | window.SuperAgent = require('superagent');
4 | require('./vendor/es5-shim.min');
5 | require('./vendor/es5-sham.min');
6 | require('./vendor/html5shiv');
7 | require('./vendor/placeholders.min');
8 |
9 | // Engine
10 | window.JSE = require('jekyll-store-engine');
11 | require('jekyll-store-display');
12 | require('jekyll-store-visited');
13 | require('jekyll-store-favourites');
14 | require('jekyll-store-google-analytics');
15 |
16 | // Helpers
17 | window.toggle = require('./helpers/toggle');
18 | window.loadJSON = require('./helpers/loadJSON');
19 |
20 | // After Load
21 | var afterLoad = require('reflux').joinLeading(
22 | JSE.Stores.Products,
23 | JSE.Stores.Countries,
24 | JSE.Stores.DeliveryMethods
25 | );
26 |
27 | afterLoad.listen(function() {
28 | require('./renderComponents');
29 | require('./pages/product');
30 | require('./pages/basket');
31 | window.submitPurchase = require('./pages/checkout').submitPurchase;
32 | JSE.Actions.pageLoaded();
33 | });
34 |
--------------------------------------------------------------------------------
/assets/_js/mixins/products.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Reflux = require('reflux');
3 | var JSE = require('jekyll-store-engine');
4 | var Product = require('../components/Product.jsx');
5 |
6 | var Products = {
7 | mixins: [
8 | Reflux.connect(JSE.Stores.Basket),
9 | Reflux.connect(JSE.Stores.Favourites)
10 | ],
11 | products: function(products) {
12 | products = products.asMutable ? products.asMutable() : products;
13 | return products.map(function(product, i) {
14 | return (
15 |
19 | );
20 | }, this);
21 | }
22 | };
23 |
24 | module.exports = Products;
25 |
--------------------------------------------------------------------------------
/assets/_js/pages/basket.js:
--------------------------------------------------------------------------------
1 | var JSE = require('jekyll-store-engine');
2 |
3 | if(document.getElementById('basket-page')) {
4 | JSE.Actions.checkoutStep({ step: 1 });
5 | }
6 |
--------------------------------------------------------------------------------
/assets/_js/pages/checkout.js:
--------------------------------------------------------------------------------
1 | var JSE = require('jekyll-store-engine');
2 | var spinner = require('../helpers/spinner');
3 | var form2js = require('../vendor/form2js').form2js;
4 | var B = require('big.js');
5 | require('../vendor/paymill-dss3');
6 |
7 | if(document.getElementById('checkout-page')) {
8 | var order = JSE.Stores.Order.getInitialState().order;
9 | SuperAgent.get('{{ site.wake_up }}').end();
10 | JSE.Actions.checkoutStep({ step: 2 });
11 | paymill.embedFrame('card');
12 |
13 | JSE.Stores.Order.listen(function(payload) {
14 | order = payload.order;
15 | spinner.hide();
16 | document.getElementById('checkoutForm').className = '';
17 | });
18 |
19 | JSE.Actions.completed.listen(function() {
20 | window.location.href = '{{ site.baseurl }}/thankyou';
21 | });
22 | }
23 |
24 | exports.submitPurchase = function(event, checkoutForm) {
25 | event.preventDefault ? event.preventDefault() : event.returnValue = false;
26 | spinner.show('checkout-page');
27 | checkoutForm.className = 'hide';
28 |
29 | paymill.createTokenViaFrame({
30 | amount_int: B(order.totals.order).times(100).toFixed(),
31 | currency: '{{ site.payment.currency }}',
32 | }, function(err, res) {
33 | if(err) {
34 | var message = paymillExceptions[err.apierror];
35 | JSE.Actions.setErrors({ errors: [message] });
36 | } else {
37 | var payload = form2js(checkoutForm);
38 | payload.token = res.token;
39 | JSE.Actions.purchase(payload);
40 | }
41 | });
42 | }
43 |
44 | var paymillExceptions = {
45 | 'internal_server_error': 'Communication with PSP failed',
46 | 'invalid_public_key': 'Invalid Public Key',
47 | 'invalid_payment_data': 'Not permitted for this method of payment, credit card type, currency or country',
48 | 'unknown_error': 'Unknown Error',
49 | '3ds_cancelled': 'Password Entry of 3-D Secure password was cancelled by the user',
50 | 'field_invalid_card_number': 'Missing or invalid credit card number',
51 | 'field_invalid_card_exp_year': 'Missing or invalid expiry year',
52 | 'field_invalid_card_exp_month': 'Missing or invalid expiry month',
53 | 'field_invalid_card_exp': 'Card is no longer valid or has expired',
54 | 'field_invalid_card_cvc': 'Invalid checking number',
55 | 'field_invalid_card_holder': 'Invalid cardholder',
56 | 'field_invalid_amount_int': 'Invalid or missing amount for 3-D Secure',
57 | 'field_invalid_currency': 'Invalid or missing currency code for 3-D Secure'
58 | };
59 |
--------------------------------------------------------------------------------
/assets/_js/pages/product.js:
--------------------------------------------------------------------------------
1 | var JSE = require('jekyll-store-engine');
2 |
3 | var productPageElem = document.getElementById('product-page');
4 |
5 | if(productPageElem) {
6 | JSE.Stores.Basket.listen(function() {
7 | window.location.href = '{{ site.baseurl }}/basket';
8 | });
9 |
10 | JSE.Actions.setVisitedLimit({ limit: 4 });
11 | JSE.Actions.visit({ name: productPageElem.getAttribute('data-name') });
12 |
13 | // Load Yotpo
14 | (function e(){var e=document.createElement("script");e.type="text/javascript",e.async=true,e.src="//staticw2.yotpo.com/0aHEMLDicyiDM2Fb1ZTDuCMMharSoZrmwbq2LFhG/widget.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})();
15 | }
16 |
--------------------------------------------------------------------------------
/assets/_js/renderComponents.js:
--------------------------------------------------------------------------------
1 | var TagButtonGroup = require('./components/TagButtonGroup.jsx');
2 | var RangesButtonGroup = require('./components/RangesButtonGroup.jsx');
3 | var renderComponent = require('./helpers/renderComponent');
4 |
5 | // Layout
6 | renderComponent('basket-summary', require('./components/BasketSummary.jsx'));
7 |
8 | // Index
9 | renderComponent('search', require('./components/SearchBox.jsx'));
10 | renderComponent('sort', require('./components/SortButtonGroup.jsx'));
11 | renderComponent('type', TagButtonGroup);
12 | renderComponent('condition', TagButtonGroup);
13 | renderComponent('price-range', RangesButtonGroup);
14 | renderComponent('weight-range', RangesButtonGroup);
15 | renderComponent('display', require('./components/Display.jsx'));
16 | renderComponent('pagination', require('./components/Pagination.jsx'));
17 |
18 | // Product
19 | renderComponent('addToBasket', require('./components/AddToBasket.jsx'));
20 | renderComponent('visited', require('./components/Visited.jsx'));
21 |
22 | // Basket
23 | renderComponent('basket-page', require('./components/Basket.jsx'));
24 |
25 | // Checkout
26 | renderComponent('errors', require('./components/Errors.jsx'));
27 | renderComponent('countries', require('./components/CountriesSelect.jsx'));
28 | renderComponent('delivery', require('./components/DeliverySelect.jsx'));
29 | renderComponent('order-summary', require('./components/OrderSummary.jsx'));
30 |
31 | // Favourites
32 | renderComponent('favourites', require('./components/Favourites.jsx'));
33 |
--------------------------------------------------------------------------------
/assets/_sass/pages/_basket.scss:
--------------------------------------------------------------------------------
1 | #basket-page {
2 | input { width: 70%; }
3 | .money { font-size: 1.5em; }
4 | .continue { @extend button; }
5 | img { max-height: 50%; max-width: 70%; }
6 | table { width: 95%; margin: 1% 2.5%; }
7 |
8 | td:last-child, th:last-child {
9 | width: 10px;
10 | color: #868282;
11 | position: relative;
12 | left: -25px;
13 | font-size: 1.3em;
14 | cursor: pointer;
15 |
16 | &:hover { color: #333 };
17 | }
18 | }
19 |
20 |
--------------------------------------------------------------------------------
/assets/_sass/pages/_blog.scss:
--------------------------------------------------------------------------------
1 | #blog-page {
2 |
3 | li {
4 | margin: 25px 0;
5 | padding: 15px 35px;
6 |
7 | &:nth-child(odd) {
8 | background: #EEE;
9 | a { color: #333; }
10 | }
11 |
12 | &:nth-child(even) {
13 | background: #333;
14 | a { color: #EEE; }
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/assets/_sass/pages/_checkout.scss:
--------------------------------------------------------------------------------
1 | #checkout-page {
2 | @include media($large-screen) {
3 | section { @include span-columns(6); }
4 | }
5 | fieldset { margin: 1em; }
6 | .title { text-align: center; }
7 | select { @extend textarea; }
8 |
9 | .button-group {
10 | width: 48%;
11 | display: inline-block;
12 | vertical-align: middle;
13 | }
14 |
15 | h2 {
16 | width: 45%;
17 | display: inline-block;
18 | text-align: center;
19 | vertical-align: middle;
20 | font-size: 2em;
21 | margin-bottom: 0;
22 | }
23 |
24 | table { margin-top: -1em; }
25 |
26 | td, th { text-align: right; }
27 |
28 | #purchase button {
29 | width: 100%;
30 | font-size: 1.2em;
31 | }
32 |
33 | #warning {
34 | box-shadow: 0 0 1px 1px #FF6161;
35 | background: #FCE7E7;
36 | color: #4A4A4A;
37 | padding: 0.75em;
38 |
39 | li { letter-spacing: 0.1em; }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/assets/_sass/pages/_favourites.scss:
--------------------------------------------------------------------------------
1 | #favourites-page {
2 | padding: 10px 0;
3 |
4 | .product {
5 | @include shift(1);
6 | @include span-columns(10);
7 |
8 | @include media($medium-screen) {
9 | @include span-columns(4 of 12);
10 | @include omega(3n);
11 | @include shift(0);
12 | }
13 |
14 | @include media($large-screen) {
15 | @include omega-reset(3n);
16 | @include span-columns(3 of 12);
17 | @include omega(4n);
18 | }
19 | }
20 |
21 | #favourites {
22 | margin-bottom: 3em;
23 | }
24 |
25 | #favourites, #visited { @include row; }
26 |
27 | .no-products {
28 | text-align: center;
29 | line-height: 500px;
30 | }
31 |
32 | h2 {
33 | font-size: 2em;
34 | margin: -35px 0 5px;
35 | padding-left: 5px;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/assets/_sass/pages/_index.scss:
--------------------------------------------------------------------------------
1 | #index-page aside {
2 | margin-top: 5px;
3 | #filters { display: none; }
4 |
5 | @include media($medium-screen) {
6 | @include span-columns(3);
7 |
8 | #filters { display: initial; }
9 | h1 { display: none; }
10 | }
11 |
12 | @include media($large-screen) {
13 | @include span-columns(2);
14 | height: 750px;
15 | margin-top: 15px;
16 | }
17 |
18 | h1 {
19 | text-align: center;
20 | font-size: 1.3em;
21 | cursor: pointer;
22 | }
23 |
24 | .button-group { margin: 5px; }
25 |
26 | input {
27 | margin: 10px 5px;
28 | border-color: silver;
29 | width: 95%;
30 | }
31 |
32 | button.ascending:after { content: '\2227'; }
33 | button.descending:after { content: '\2228'; }
34 | }
35 |
36 | #display {
37 | @include media($medium-screen) {
38 | @include span-columns(9);
39 | @include omega;
40 | }
41 |
42 | @include media($large-screen) {
43 | @include span-columns(10);
44 | @include omega;
45 | }
46 |
47 | .product {
48 | @include shift(1);
49 | @include span-columns(10);
50 |
51 | @include media($medium-screen) {
52 | @include span-columns(4.5 of 9);
53 | @include omega(2n);
54 | @include shift(0);
55 | }
56 |
57 | @include media($large-screen) {
58 | @include omega-reset(2n);
59 | @include span-columns(3.33 of 10);
60 | @include omega(3n);
61 | }
62 | }
63 |
64 | .no-products {
65 | text-align: center;
66 | line-height: 750px;
67 | }
68 | }
69 |
70 | #pagination {
71 | @include shift(2);
72 | @include span-columns(9);
73 | padding: 10px 0 25px;
74 | }
--------------------------------------------------------------------------------
/assets/_sass/pages/_post.scss:
--------------------------------------------------------------------------------
1 | #post-page {
2 | h1 {
3 | font-size: 3em;
4 | margin: 0;
5 | text-align: center;
6 |
7 | @include media($large-screen) { font-size: 4em; }
8 | }
9 |
10 | .post-meta {
11 | box-shadow: 0 0 1px 1px #C3C3C3;
12 | padding: 5px;
13 | background: #eee;
14 | }
15 |
16 | img {
17 | max-width: 50px;
18 | border-radius: 50px;
19 | }
20 |
21 | img, h4, time {
22 | display: inline-block;
23 | vertical-align: middle;
24 | margin: 0;
25 | }
26 |
27 | p { margin: 35px; }
28 | }
29 |
--------------------------------------------------------------------------------
/assets/_sass/pages/_product.scss:
--------------------------------------------------------------------------------
1 | #product-page {
2 | margin-top: 15px;
3 | header { padding: 5px 10px; @include row; }
4 |
5 | h1 {
6 | font-size: 4em;
7 | background: #ECECEC;
8 | padding-left: 5px;
9 | }
10 |
11 | h2 {
12 | font-size: 3em;
13 | margin: -35px 0 5px;
14 | background: #F7F7F7;
15 | padding-left: 5px;
16 | }
17 |
18 | aside { @include span-columns(3); }
19 | article { @include span-columns(9); }
20 |
21 | #addToBasket {
22 | padding: 10px;
23 | margin: 10px 0px;
24 | border-radius: 10px;
25 | height: 3.5em;
26 | box-shadow: 0 0 1px 1px #DADADA;
27 | background: #F7F7F7;
28 | }
29 |
30 | input, button { @include span-columns(4 of 8) }
31 |
32 | .description {
33 | padding: 15px;
34 | border-radius: 15px;
35 | box-shadow: 0 0 1px 1px #DADADA;
36 | background: #F7F7F7;
37 | }
38 |
39 | article img {
40 | border: 1px solid #D7D7D7;
41 | box-shadow: 0 0 1px 1px #D7D7D7;
42 | border-radius: 15px;
43 | }
44 |
45 | #visited-products {
46 | margin-top: 5em;
47 | li {
48 | @include span-columns(4);
49 | @include omega(3n);
50 | margin-bottom: 2em;
51 | }
52 | }
53 |
54 | .row { @include row; }
55 | .yotpo { padding-bottom: 5em; }
56 | }
--------------------------------------------------------------------------------
/assets/_sass/pages/_thankyou.scss:
--------------------------------------------------------------------------------
1 | #thankyou-page {
2 | margin: 3em 2em 0;
3 | font-size: 1.5em;
4 | text-align: center;
5 |
6 | p, .title { padding: 0.5em; }
7 | img { padding: 0 2em; }
8 |
9 | @include media($large-screen) {
10 | margin: 10em 2em;
11 | text-align: left;
12 | img { float: left; width: 30%; }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/assets/_sass/shared/_layout.scss:
--------------------------------------------------------------------------------
1 | main { @include outer-container; }
2 |
3 | li.nav-link.logo {
4 | font-size: 1.4em;
5 | }
6 |
7 | img.logo {
8 | max-height: 2.5em;
9 | opacity: 0.8;
10 | }
11 |
12 | img#cart {
13 | height: 1.5em;
14 | margin: 0.3em 0 -0.35em;
15 | opacity: 0.5;
16 | }
17 |
18 | .title {
19 | font-size: 3em;
20 | margin: 5px 0 0;
21 | }
22 |
23 | .flash { margin: 0.5em 0; }
24 |
25 | .hide { display: none; }
26 | .show { display: block !important; }
27 |
--------------------------------------------------------------------------------
/assets/_sass/shared/_product.scss:
--------------------------------------------------------------------------------
1 | .product {
2 | padding: 10px;
3 |
4 | a {
5 | color: #333;
6 | &:hover { color: #333; }
7 | }
8 |
9 | img {
10 | margin: auto;
11 | display: block;
12 | }
13 |
14 | .details {
15 | @include row;
16 | background: #EDEDED;
17 | padding: 5px 5px;
18 | border-radius: 5px;
19 | box-shadow: 0 0 1px 1px #C3C3C3;
20 | margin-top: 1px;
21 | color: #666;
22 | & > div { @include span-columns(1 of 2); }
23 | &.added { background: #D7F7D1; }
24 | .details-buttons { text-align: right; }
25 | }
26 |
27 | .fa {
28 | font-size: 1.5em;
29 | padding: 5px;
30 | cursor: pointer;
31 | }
32 |
33 | .add {
34 | @extend .fa, .fa-plus;
35 | color: #B2D0FF;
36 | &:hover { color: #6BA4FD; }
37 | }
38 |
39 | i.added {
40 | @extend .fa, .fa-check;
41 | color: #56C263;
42 | }
43 |
44 | .favourite, .favourited {
45 | color: #F59D54;
46 | &:hover { color: #F97100; }
47 | }
48 |
49 | .favourite { @extend .fa, .fa-star-o; }
50 | .favourited { @extend .fa, .fa-star; }
51 | }
52 |
--------------------------------------------------------------------------------
/assets/_sass/shared/_yotpo.scss:
--------------------------------------------------------------------------------
1 | section.yotpo a {
2 | font-family: $base-font-family;
3 | color: #222 !important;
4 | &:hover { color: #222 !important; }
5 | }
6 |
7 | .yotpo .yotpo-default-button {
8 | background: #40526B !important;
9 | font-family: $base-font-family !important;
10 | }
11 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/_omega-reset.scss:
--------------------------------------------------------------------------------
1 | // ------------------------------------------------------------
2 | // Omega Reset
3 | // ------------------------------------------------------------
4 |
5 | @mixin omega-reset($nth) {
6 | &:nth-child(#{$nth}) { margin-right: flex-gutter(); }
7 | &:nth-child(#{$nth}+1) { clear: none }
8 | }
--------------------------------------------------------------------------------
/assets/_sass/vendor/base/_base.scss:
--------------------------------------------------------------------------------
1 | // Bitters 1.0.0
2 | // http://bitters.bourbon.io
3 | // Copyright 2013-2015 thoughtbot, inc.
4 | // MIT License
5 |
6 | @import "variables";
7 | @import "grid-settings";
8 | @import "buttons";
9 | @import "forms";
10 | @import "lists";
11 | @import "tables";
12 | @import "typography";
13 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/base/_buttons.scss:
--------------------------------------------------------------------------------
1 | #{$all-button-inputs},
2 | button {
3 | @include appearance(none);
4 | -webkit-font-smoothing: antialiased;
5 | background-color: $action-color;
6 | border-radius: $base-border-radius;
7 | border: none;
8 | color: #fff;
9 | cursor: pointer;
10 | display: inline-block;
11 | font-family: $base-font-family;
12 | font-size: $base-font-size;
13 | font-weight: 600;
14 | line-height: 1;
15 | padding: 0.75em 1em;
16 | text-decoration: none;
17 | user-select: none;
18 | vertical-align: middle;
19 | white-space: nowrap;
20 |
21 | &:hover,
22 | &:focus {
23 | background-color: darken($action-color, 15%);
24 | color: #fff;
25 | }
26 |
27 | &:disabled {
28 | cursor: not-allowed;
29 | opacity: 0.5;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/base/_forms.scss:
--------------------------------------------------------------------------------
1 | fieldset {
2 | background-color: lighten($base-border-color, 10%);
3 | border: $base-border;
4 | margin: 0 0 $small-spacing;
5 | padding: $base-spacing;
6 | }
7 |
8 | input,
9 | label,
10 | select {
11 | display: block;
12 | font-family: $base-font-family;
13 | font-size: $base-font-size;
14 | }
15 |
16 | label {
17 | font-weight: 600;
18 | margin-bottom: $small-spacing / 2;
19 |
20 | &.required::after {
21 | content: "*";
22 | }
23 |
24 | abbr {
25 | display: none;
26 | }
27 | }
28 |
29 | #{$all-text-inputs},
30 | select[multiple=multiple],
31 | textarea {
32 | background-color: $base-background-color;
33 | border: $base-border;
34 | border-radius: $base-border-radius;
35 | box-shadow: $form-box-shadow;
36 | box-sizing: border-box;
37 | font-family: $base-font-family;
38 | font-size: $base-font-size;
39 | margin-bottom: $base-spacing / 2;
40 | padding: $base-spacing / 3;
41 | transition: border-color;
42 | width: 100%;
43 |
44 | &:hover {
45 | border-color: darken($base-border-color, 10%);
46 | }
47 |
48 | &:focus {
49 | border-color: $action-color;
50 | box-shadow: $form-box-shadow-focus;
51 | outline: none;
52 | }
53 | }
54 |
55 | textarea {
56 | resize: vertical;
57 | }
58 |
59 | input[type="search"] {
60 | @include appearance(none);
61 | }
62 |
63 | input[type="checkbox"],
64 | input[type="radio"] {
65 | display: inline;
66 | margin-right: $small-spacing / 2;
67 | }
68 |
69 | input[type="file"] {
70 | padding-bottom: $small-spacing;
71 | width: 100%;
72 | }
73 |
74 | select {
75 | margin-bottom: $base-spacing;
76 | max-width: 100%;
77 | width: auto;
78 | }
79 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/base/_grid-settings.scss:
--------------------------------------------------------------------------------
1 | @import "vendor/neat/neat-helpers";
2 |
3 | // Neat Overrides
4 | // $column: 90px;
5 | // $gutter: 30px;
6 | // $grid-columns: 12;
7 | // $max-width: em(1088);
8 |
9 | // Neat Breakpoints
10 | $medium-screen: em(640);
11 | $large-screen: em(860);
12 |
13 | $medium-screen-up: new-breakpoint(min-width $medium-screen 4);
14 | $large-screen-up: new-breakpoint(min-width $large-screen 8);
15 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/base/_lists.scss:
--------------------------------------------------------------------------------
1 | ul,
2 | ol {
3 | list-style-type: none;
4 | margin: 0;
5 | padding: 0;
6 |
7 | &%default-ul {
8 | list-style-type: disc;
9 | margin-bottom: $small-spacing;
10 | padding-left: $base-spacing;
11 | }
12 |
13 | &%default-ol {
14 | list-style-type: decimal;
15 | margin-bottom: $small-spacing;
16 | padding-left: $base-spacing;
17 | }
18 | }
19 |
20 | dl {
21 | margin-bottom: $small-spacing;
22 |
23 | dt {
24 | font-weight: bold;
25 | margin-top: $small-spacing;
26 | }
27 |
28 | dd {
29 | margin: 0;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/base/_tables.scss:
--------------------------------------------------------------------------------
1 | table {
2 | @include font-feature-settings("kern", "liga", "tnum");
3 | border-collapse: collapse;
4 | margin: $small-spacing 0;
5 | table-layout: fixed;
6 | width: 100%;
7 | }
8 |
9 | th {
10 | border-bottom: 1px solid darken($base-border-color, 15%);
11 | font-weight: 600;
12 | padding: $small-spacing 0;
13 | text-align: left;
14 | }
15 |
16 | td {
17 | border-bottom: $base-border;
18 | padding: $small-spacing 0;
19 | }
20 |
21 | tr,
22 | td,
23 | th {
24 | vertical-align: middle;
25 | }
26 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/base/_typography.scss:
--------------------------------------------------------------------------------
1 | body {
2 | @include font-feature-settings("kern", "liga", "pnum");
3 | -webkit-font-smoothing: antialiased;
4 | color: $base-font-color;
5 | font-family: $base-font-family;
6 | font-size: $base-font-size;
7 | line-height: $base-line-height;
8 | }
9 |
10 | h1,
11 | h2,
12 | h3,
13 | h4,
14 | h5,
15 | h6 {
16 | font-family: $heading-font-family;
17 | font-size: $base-font-size;
18 | line-height: $heading-line-height;
19 | margin: 0 0 $small-spacing;
20 | }
21 |
22 | p {
23 | margin: 0 0 $small-spacing;
24 | }
25 |
26 | a {
27 | color: $action-color;
28 | text-decoration: none;
29 | transition: color 0.1s linear;
30 |
31 | &:active,
32 | &:focus,
33 | &:hover {
34 | color: darken($action-color, 15%);
35 | }
36 |
37 | &:active,
38 | &:focus {
39 | outline: none;
40 | }
41 | }
42 |
43 | hr {
44 | border-bottom: $base-border;
45 | border-left: none;
46 | border-right: none;
47 | border-top: none;
48 | margin: $base-spacing 0;
49 | }
50 |
51 | img,
52 | picture {
53 | margin: 0;
54 | max-width: 100%;
55 | }
56 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/base/_variables.scss:
--------------------------------------------------------------------------------
1 | // Typography
2 | $base-font-family: $calibri;
3 | $heading-font-family: $base-font-family;
4 |
5 | // Font Sizes
6 | $base-font-size: 1em;
7 |
8 | // Line height
9 | $base-line-height: 1.5;
10 | $heading-line-height: 1.2;
11 |
12 | // Other Sizes
13 | $base-border-radius: 3px;
14 | $base-spacing: $base-line-height * 1em;
15 | $small-spacing: $base-spacing / 2;
16 | $base-z-index: 0;
17 |
18 | // Colors
19 | $blue: #477dca;
20 | $dark-gray: #333;
21 | $medium-gray: #999;
22 | $light-gray: #ddd;
23 |
24 | // Font Colors
25 | $base-background-color: #fff;
26 | $base-font-color: $dark-gray;
27 | $action-color: $blue;
28 |
29 | // Border
30 | $base-border-color: $light-gray;
31 | $base-border: 1px solid $base-border-color;
32 |
33 | // Forms
34 | $form-box-shadow: inset 0 1px 3px rgba(#000, 0.06);
35 | $form-box-shadow-focus: $form-box-shadow, 0 0 5px adjust-color($action-color, $lightness: -5%, $alpha: -0.3);
36 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/_bourbon-deprecated-upcoming.scss:
--------------------------------------------------------------------------------
1 | //************************************************************************//
2 | // These mixins/functions are deprecated
3 | // They will be removed in the next MAJOR version release
4 | //************************************************************************//
5 | @mixin inline-block {
6 | display: inline-block;
7 | @warn "inline-block mixin is deprecated and will be removed in the next major version release";
8 | }
9 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/_bourbon.scss:
--------------------------------------------------------------------------------
1 | // Settings
2 | @import "settings/prefixer";
3 | @import "settings/px-to-em";
4 | @import "settings/asset-pipeline";
5 |
6 | // Custom Helpers
7 | @import "helpers/convert-units";
8 | @import "helpers/gradient-positions-parser";
9 | @import "helpers/is-num";
10 | @import "helpers/linear-angle-parser";
11 | @import "helpers/linear-gradient-parser";
12 | @import "helpers/linear-positions-parser";
13 | @import "helpers/linear-side-corner-parser";
14 | @import "helpers/radial-arg-parser";
15 | @import "helpers/radial-positions-parser";
16 | @import "helpers/radial-gradient-parser";
17 | @import "helpers/render-gradients";
18 | @import "helpers/shape-size-stripper";
19 | @import "helpers/str-to-num";
20 |
21 | // Custom Functions
22 | @import "functions/assign";
23 | @import "functions/color-lightness";
24 | @import "functions/flex-grid";
25 | @import "functions/golden-ratio";
26 | @import "functions/grid-width";
27 | @import "functions/modular-scale";
28 | @import "functions/px-to-em";
29 | @import "functions/px-to-rem";
30 | @import "functions/strip-units";
31 | @import "functions/tint-shade";
32 | @import "functions/transition-property-name";
33 | @import "functions/unpack";
34 |
35 | // CSS3 Mixins
36 | @import "css3/animation";
37 | @import "css3/appearance";
38 | @import "css3/backface-visibility";
39 | @import "css3/background";
40 | @import "css3/background-image";
41 | @import "css3/border-image";
42 | @import "css3/border-radius";
43 | @import "css3/box-sizing";
44 | @import "css3/calc";
45 | @import "css3/columns";
46 | @import "css3/filter";
47 | @import "css3/flex-box";
48 | @import "css3/font-face";
49 | @import "css3/font-feature-settings";
50 | @import "css3/hyphens";
51 | @import "css3/hidpi-media-query";
52 | @import "css3/image-rendering";
53 | @import "css3/keyframes";
54 | @import "css3/linear-gradient";
55 | @import "css3/perspective";
56 | @import "css3/radial-gradient";
57 | @import "css3/transform";
58 | @import "css3/transition";
59 | @import "css3/user-select";
60 | @import "css3/placeholder";
61 |
62 | // Addons & other mixins
63 | @import "addons/button";
64 | @import "addons/clearfix";
65 | @import "addons/directional-values";
66 | @import "addons/ellipsis";
67 | @import "addons/font-family";
68 | @import "addons/hide-text";
69 | @import "addons/html5-input-types";
70 | @import "addons/position";
71 | @import "addons/prefixer";
72 | @import "addons/retina-image";
73 | @import "addons/size";
74 | @import "addons/timing-functions";
75 | @import "addons/triangle";
76 | @import "addons/word-wrap";
77 |
78 | // Soon to be deprecated Mixins
79 | @import "bourbon-deprecated-upcoming";
80 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_clearfix.scss:
--------------------------------------------------------------------------------
1 | // Modern micro clearfix provides an easy way to contain floats without adding additional markup.
2 | //
3 | // Example usage:
4 | //
5 | // // Contain all floats within .wrapper
6 | // .wrapper {
7 | // @include clearfix;
8 | // .content,
9 | // .sidebar {
10 | // float : left;
11 | // }
12 | // }
13 |
14 | @mixin clearfix {
15 | &:after {
16 | content:"";
17 | display:table;
18 | clear:both;
19 | }
20 | }
21 |
22 | // Acknowledgements
23 | // Beat *that* clearfix: [Thierry Koblentz](http://www.css-101.org/articles/clearfix/latest-new-clearfix-so-far.php)
24 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_directional-values.scss:
--------------------------------------------------------------------------------
1 | // directional-property mixins are shorthands
2 | // for writing properties like the following
3 | //
4 | // @include margin(null 0 10px);
5 | // ------
6 | // margin-right: 0;
7 | // margin-bottom: 10px;
8 | // margin-left: 0;
9 | //
10 | // - or -
11 | //
12 | // @include border-style(dotted null);
13 | // ------
14 | // border-top-style: dotted;
15 | // border-bottom-style: dotted;
16 | //
17 | // ------
18 | //
19 | // Note: You can also use false instead of null
20 |
21 | @function collapse-directionals($vals) {
22 | $output: null;
23 |
24 | $A: nth( $vals, 1 );
25 | $B: if( length($vals) < 2, $A, nth($vals, 2));
26 | $C: if( length($vals) < 3, $A, nth($vals, 3));
27 | $D: if( length($vals) < 2, $A, nth($vals, if( length($vals) < 4, 2, 4) ));
28 |
29 | @if $A == 0 { $A: 0 }
30 | @if $B == 0 { $B: 0 }
31 | @if $C == 0 { $C: 0 }
32 | @if $D == 0 { $D: 0 }
33 |
34 | @if $A == $B and $A == $C and $A == $D { $output: $A }
35 | @else if $A == $C and $B == $D { $output: $A $B }
36 | @else if $B == $D { $output: $A $B $C }
37 | @else { $output: $A $B $C $D }
38 |
39 | @return $output;
40 | }
41 |
42 | @function contains-falsy($list) {
43 | @each $item in $list {
44 | @if not $item {
45 | @return true;
46 | }
47 | }
48 |
49 | @return false;
50 | }
51 |
52 | @mixin directional-property($pre, $suf, $vals) {
53 | // Property Names
54 | $top: $pre + "-top" + if($suf, "-#{$suf}", "");
55 | $bottom: $pre + "-bottom" + if($suf, "-#{$suf}", "");
56 | $left: $pre + "-left" + if($suf, "-#{$suf}", "");
57 | $right: $pre + "-right" + if($suf, "-#{$suf}", "");
58 | $all: $pre + if($suf, "-#{$suf}", "");
59 |
60 | $vals: collapse-directionals($vals);
61 |
62 | @if contains-falsy($vals) {
63 | @if nth($vals, 1) { #{$top}: nth($vals, 1); }
64 |
65 | @if length($vals) == 1 {
66 | @if nth($vals, 1) { #{$right}: nth($vals, 1); }
67 | } @else {
68 | @if nth($vals, 2) { #{$right}: nth($vals, 2); }
69 | }
70 |
71 | // prop: top/bottom right/left
72 | @if length($vals) == 2 {
73 | @if nth($vals, 1) { #{$bottom}: nth($vals, 1); }
74 | @if nth($vals, 2) { #{$left}: nth($vals, 2); }
75 |
76 | // prop: top right/left bottom
77 | } @else if length($vals) == 3 {
78 | @if nth($vals, 3) { #{$bottom}: nth($vals, 3); }
79 | @if nth($vals, 2) { #{$left}: nth($vals, 2); }
80 |
81 | // prop: top right bottom left
82 | } @else if length($vals) == 4 {
83 | @if nth($vals, 3) { #{$bottom}: nth($vals, 3); }
84 | @if nth($vals, 4) { #{$left}: nth($vals, 4); }
85 | }
86 |
87 | // prop: top/right/bottom/left
88 | } @else {
89 | #{$all}: $vals;
90 | }
91 | }
92 |
93 | @mixin margin($vals...) {
94 | @include directional-property(margin, false, $vals...);
95 | }
96 |
97 | @mixin padding($vals...) {
98 | @include directional-property(padding, false, $vals...);
99 | }
100 |
101 | @mixin border-style($vals...) {
102 | @include directional-property(border, style, $vals...);
103 | }
104 |
105 | @mixin border-color($vals...) {
106 | @include directional-property(border, color, $vals...);
107 | }
108 |
109 | @mixin border-width($vals...) {
110 | @include directional-property(border, width, $vals...);
111 | }
112 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_ellipsis.scss:
--------------------------------------------------------------------------------
1 | @mixin ellipsis($width: 100%) {
2 | display: inline-block;
3 | max-width: $width;
4 | overflow: hidden;
5 | text-overflow: ellipsis;
6 | white-space: nowrap;
7 | }
8 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_font-family.scss:
--------------------------------------------------------------------------------
1 | $georgia: Georgia, Cambria, "Times New Roman", Times, serif;
2 | $helvetica: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
3 | $lucida-grande: "Lucida Grande", Tahoma, Verdana, Arial, sans-serif;
4 | $monospace: "Bitstream Vera Sans Mono", Consolas, Courier, monospace;
5 | $verdana: Verdana, Geneva, sans-serif;
6 | $calibri: Calibri, Candara, Segoe, "Segoe UI", Optima, Arial, sans-serif;
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_hide-text.scss:
--------------------------------------------------------------------------------
1 | @mixin hide-text {
2 | overflow: hidden;
3 |
4 | &:before {
5 | content: "";
6 | display: block;
7 | width: 0;
8 | height: 100%;
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_html5-input-types.scss:
--------------------------------------------------------------------------------
1 | //************************************************************************//
2 | // Generate a variable ($all-text-inputs) with a list of all html5
3 | // input types that have a text-based input, excluding textarea.
4 | // http://diveintohtml5.org/forms.html
5 | //************************************************************************//
6 | $inputs-list: 'input[type="email"]',
7 | 'input[type="number"]',
8 | 'input[type="password"]',
9 | 'input[type="search"]',
10 | 'input[type="tel"]',
11 | 'input[type="text"]',
12 | 'input[type="url"]',
13 |
14 | // Webkit & Gecko may change the display of these in the future
15 | 'input[type="color"]',
16 | 'input[type="date"]',
17 | 'input[type="datetime"]',
18 | 'input[type="datetime-local"]',
19 | 'input[type="month"]',
20 | 'input[type="time"]',
21 | 'input[type="week"]';
22 |
23 | // Bare inputs
24 | //************************************************************************//
25 | $all-text-inputs: assign-inputs($inputs-list);
26 |
27 | // Hover Pseudo-class
28 | //************************************************************************//
29 | $all-text-inputs-hover: assign-inputs($inputs-list, hover);
30 |
31 | // Focus Pseudo-class
32 | //************************************************************************//
33 | $all-text-inputs-focus: assign-inputs($inputs-list, focus);
34 |
35 |
36 |
37 | // You must use interpolation on the variable:
38 | // #{$all-text-inputs}
39 | // #{$all-text-inputs-hover}
40 | // #{$all-text-inputs-focus}
41 |
42 | // Example
43 | //************************************************************************//
44 | // #{$all-text-inputs}, textarea {
45 | // border: 1px solid red;
46 | // }
47 |
48 |
49 |
50 | //************************************************************************//
51 | // Generate a variable ($all-button-inputs) with a list of all html5
52 | // input types that have a button-based input, excluding button.
53 | //************************************************************************//
54 | $inputs-button-list: 'input[type="button"]',
55 | 'input[type="reset"]',
56 | 'input[type="submit"]';
57 |
58 | // Bare inputs
59 | //************************************************************************//
60 | $all-button-inputs: assign-inputs($inputs-button-list);
61 |
62 | // Hover Pseudo-class
63 | //************************************************************************//
64 | $all-button-inputs-hover: assign-inputs($inputs-button-list, hover);
65 |
66 | // Focus Pseudo-class
67 | //************************************************************************//
68 | $all-button-inputs-focus: assign-inputs($inputs-button-list, focus);
69 |
70 | // Active Pseudo-class
71 | //************************************************************************//
72 | $all-button-inputs-active: assign-inputs($inputs-button-list, active);
73 |
74 |
75 |
76 | // You must use interpolation on the variable:
77 | // #{$all-button-inputs}
78 | // #{$all-button-inputs-hover}
79 | // #{$all-button-inputs-focus}
80 | // #{$all-button-inputs-active}
81 |
82 | // Example
83 | //************************************************************************//
84 | // #{$all-button-inputs}, button {
85 | // border: 1px solid red;
86 | // }
87 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_position.scss:
--------------------------------------------------------------------------------
1 | @mixin position ($position: relative, $coordinates: null null null null) {
2 |
3 | @if type-of($position) == list {
4 | $coordinates: $position;
5 | $position: relative;
6 | }
7 |
8 | $coordinates: unpack($coordinates);
9 |
10 | $top: nth($coordinates, 1);
11 | $right: nth($coordinates, 2);
12 | $bottom: nth($coordinates, 3);
13 | $left: nth($coordinates, 4);
14 |
15 | position: $position;
16 |
17 | @if ($top and $top == auto) or (type-of($top) == number) {
18 | top: $top;
19 | }
20 |
21 | @if ($right and $right == auto) or (type-of($right) == number) {
22 | right: $right;
23 | }
24 |
25 | @if ($bottom and $bottom == auto) or (type-of($bottom) == number) {
26 | bottom: $bottom;
27 | }
28 |
29 | @if ($left and $left == auto) or (type-of($left) == number) {
30 | left: $left;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_prefixer.scss:
--------------------------------------------------------------------------------
1 | //************************************************************************//
2 | // Example: @include prefixer(border-radius, $radii, webkit ms spec);
3 | //************************************************************************//
4 | // Variables located in /settings/_prefixer.scss
5 |
6 | @mixin prefixer ($property, $value, $prefixes) {
7 | @each $prefix in $prefixes {
8 | @if $prefix == webkit {
9 | @if $prefix-for-webkit {
10 | -webkit-#{$property}: $value;
11 | }
12 | }
13 | @else if $prefix == moz {
14 | @if $prefix-for-mozilla {
15 | -moz-#{$property}: $value;
16 | }
17 | }
18 | @else if $prefix == ms {
19 | @if $prefix-for-microsoft {
20 | -ms-#{$property}: $value;
21 | }
22 | }
23 | @else if $prefix == o {
24 | @if $prefix-for-opera {
25 | -o-#{$property}: $value;
26 | }
27 | }
28 | @else if $prefix == spec {
29 | @if $prefix-for-spec {
30 | #{$property}: $value;
31 | }
32 | }
33 | @else {
34 | @warn "Unrecognized prefix: #{$prefix}";
35 | }
36 | }
37 | }
38 |
39 | @mixin disable-prefix-for-all() {
40 | $prefix-for-webkit: false !global;
41 | $prefix-for-mozilla: false !global;
42 | $prefix-for-microsoft: false !global;
43 | $prefix-for-opera: false !global;
44 | $prefix-for-spec: false !global;
45 | }
46 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_retina-image.scss:
--------------------------------------------------------------------------------
1 | @mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $retina-suffix: _2x, $asset-pipeline: $asset-pipeline) {
2 | @if $asset-pipeline {
3 | background-image: image-url("#{$filename}.#{$extension}");
4 | }
5 | @else {
6 | background-image: url("#{$filename}.#{$extension}");
7 | }
8 |
9 | @include hidpi {
10 | @if $asset-pipeline {
11 | @if $retina-filename {
12 | background-image: image-url("#{$retina-filename}.#{$extension}");
13 | }
14 | @else {
15 | background-image: image-url("#{$filename}#{$retina-suffix}.#{$extension}");
16 | }
17 | }
18 |
19 | @else {
20 | @if $retina-filename {
21 | background-image: url("#{$retina-filename}.#{$extension}");
22 | }
23 | @else {
24 | background-image: url("#{$filename}#{$retina-suffix}.#{$extension}");
25 | }
26 | }
27 |
28 | background-size: $background-size;
29 |
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_size.scss:
--------------------------------------------------------------------------------
1 | @mixin size($size) {
2 | $height: nth($size, 1);
3 | $width: $height;
4 |
5 | @if length($size) > 1 {
6 | $height: nth($size, 2);
7 | }
8 |
9 | @if $height == auto or (type-of($height) == number and not unitless($height)) {
10 | height: $height;
11 | }
12 |
13 | @if $width == auto or (type-of($width) == number and not unitless($width)) {
14 | width: $width;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_timing-functions.scss:
--------------------------------------------------------------------------------
1 | // CSS cubic-bezier timing functions. Timing functions courtesy of jquery.easie (github.com/jaukia/easie)
2 | // Timing functions are the same as demo'ed here: http://jqueryui.com/resources/demos/effect/easing.html
3 |
4 | // EASE IN
5 | $ease-in-quad: cubic-bezier(0.550, 0.085, 0.680, 0.530);
6 | $ease-in-cubic: cubic-bezier(0.550, 0.055, 0.675, 0.190);
7 | $ease-in-quart: cubic-bezier(0.895, 0.030, 0.685, 0.220);
8 | $ease-in-quint: cubic-bezier(0.755, 0.050, 0.855, 0.060);
9 | $ease-in-sine: cubic-bezier(0.470, 0.000, 0.745, 0.715);
10 | $ease-in-expo: cubic-bezier(0.950, 0.050, 0.795, 0.035);
11 | $ease-in-circ: cubic-bezier(0.600, 0.040, 0.980, 0.335);
12 | $ease-in-back: cubic-bezier(0.600, -0.280, 0.735, 0.045);
13 |
14 | // EASE OUT
15 | $ease-out-quad: cubic-bezier(0.250, 0.460, 0.450, 0.940);
16 | $ease-out-cubic: cubic-bezier(0.215, 0.610, 0.355, 1.000);
17 | $ease-out-quart: cubic-bezier(0.165, 0.840, 0.440, 1.000);
18 | $ease-out-quint: cubic-bezier(0.230, 1.000, 0.320, 1.000);
19 | $ease-out-sine: cubic-bezier(0.390, 0.575, 0.565, 1.000);
20 | $ease-out-expo: cubic-bezier(0.190, 1.000, 0.220, 1.000);
21 | $ease-out-circ: cubic-bezier(0.075, 0.820, 0.165, 1.000);
22 | $ease-out-back: cubic-bezier(0.175, 0.885, 0.320, 1.275);
23 |
24 | // EASE IN OUT
25 | $ease-in-out-quad: cubic-bezier(0.455, 0.030, 0.515, 0.955);
26 | $ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1.000);
27 | $ease-in-out-quart: cubic-bezier(0.770, 0.000, 0.175, 1.000);
28 | $ease-in-out-quint: cubic-bezier(0.860, 0.000, 0.070, 1.000);
29 | $ease-in-out-sine: cubic-bezier(0.445, 0.050, 0.550, 0.950);
30 | $ease-in-out-expo: cubic-bezier(1.000, 0.000, 0.000, 1.000);
31 | $ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.150, 0.860);
32 | $ease-in-out-back: cubic-bezier(0.680, -0.550, 0.265, 1.550);
33 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_triangle.scss:
--------------------------------------------------------------------------------
1 | @mixin triangle ($size, $color, $direction) {
2 | height: 0;
3 | width: 0;
4 |
5 | $width: nth($size, 1);
6 | $height: nth($size, length($size));
7 |
8 | $foreground-color: nth($color, 1);
9 | $background-color: if(length($color) == 2, nth($color, 2), transparent);
10 |
11 | @if ($direction == up) or ($direction == down) or ($direction == right) or ($direction == left) {
12 |
13 | $width: $width / 2;
14 | $height: if(length($size) > 1, $height, $height/2);
15 |
16 | @if $direction == up {
17 | border-left: $width solid $background-color;
18 | border-right: $width solid $background-color;
19 | border-bottom: $height solid $foreground-color;
20 |
21 | } @else if $direction == right {
22 | border-top: $width solid $background-color;
23 | border-bottom: $width solid $background-color;
24 | border-left: $height solid $foreground-color;
25 |
26 | } @else if $direction == down {
27 | border-left: $width solid $background-color;
28 | border-right: $width solid $background-color;
29 | border-top: $height solid $foreground-color;
30 |
31 | } @else if $direction == left {
32 | border-top: $width solid $background-color;
33 | border-bottom: $width solid $background-color;
34 | border-right: $height solid $foreground-color;
35 | }
36 | }
37 |
38 | @else if ($direction == up-right) or ($direction == up-left) {
39 | border-top: $height solid $foreground-color;
40 |
41 | @if $direction == up-right {
42 | border-left: $width solid $background-color;
43 |
44 | } @else if $direction == up-left {
45 | border-right: $width solid $background-color;
46 | }
47 | }
48 |
49 | @else if ($direction == down-right) or ($direction == down-left) {
50 | border-bottom: $height solid $foreground-color;
51 |
52 | @if $direction == down-right {
53 | border-left: $width solid $background-color;
54 |
55 | } @else if $direction == down-left {
56 | border-right: $width solid $background-color;
57 | }
58 | }
59 |
60 | @else if ($direction == inset-up) {
61 | border-width: $height $width;
62 | border-style: solid;
63 | border-color: $background-color $background-color $foreground-color;
64 | }
65 |
66 | @else if ($direction == inset-down) {
67 | border-width: $height $width;
68 | border-style: solid;
69 | border-color: $foreground-color $background-color $background-color;
70 | }
71 |
72 | @else if ($direction == inset-right) {
73 | border-width: $width $height;
74 | border-style: solid;
75 | border-color: $background-color $background-color $background-color $foreground-color;
76 | }
77 |
78 | @else if ($direction == inset-left) {
79 | border-width: $width $height;
80 | border-style: solid;
81 | border-color: $background-color $foreground-color $background-color $background-color;
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/addons/_word-wrap.scss:
--------------------------------------------------------------------------------
1 | @mixin word-wrap($wrap: break-word) {
2 | word-wrap: $wrap;
3 |
4 | @if $wrap == break-word {
5 | overflow-wrap: break-word;
6 | word-break: break-all;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_animation.scss:
--------------------------------------------------------------------------------
1 | // http://www.w3.org/TR/css3-animations/#the-animation-name-property-
2 | // Each of these mixins support comma separated lists of values, which allows different transitions for individual properties to be described in a single style rule. Each value in the list corresponds to the value at that same position in the other properties.
3 |
4 | // Official animation shorthand property.
5 | @mixin animation ($animations...) {
6 | @include prefixer(animation, $animations, webkit moz spec);
7 | }
8 |
9 | // Individual Animation Properties
10 | @mixin animation-name ($names...) {
11 | @include prefixer(animation-name, $names, webkit moz spec);
12 | }
13 |
14 |
15 | @mixin animation-duration ($times...) {
16 | @include prefixer(animation-duration, $times, webkit moz spec);
17 | }
18 |
19 |
20 | @mixin animation-timing-function ($motions...) {
21 | // ease | linear | ease-in | ease-out | ease-in-out
22 | @include prefixer(animation-timing-function, $motions, webkit moz spec);
23 | }
24 |
25 |
26 | @mixin animation-iteration-count ($values...) {
27 | // infinite |
28 | @include prefixer(animation-iteration-count, $values, webkit moz spec);
29 | }
30 |
31 |
32 | @mixin animation-direction ($directions...) {
33 | // normal | alternate
34 | @include prefixer(animation-direction, $directions, webkit moz spec);
35 | }
36 |
37 |
38 | @mixin animation-play-state ($states...) {
39 | // running | paused
40 | @include prefixer(animation-play-state, $states, webkit moz spec);
41 | }
42 |
43 |
44 | @mixin animation-delay ($times...) {
45 | @include prefixer(animation-delay, $times, webkit moz spec);
46 | }
47 |
48 |
49 | @mixin animation-fill-mode ($modes...) {
50 | // none | forwards | backwards | both
51 | @include prefixer(animation-fill-mode, $modes, webkit moz spec);
52 | }
53 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_appearance.scss:
--------------------------------------------------------------------------------
1 | @mixin appearance ($value) {
2 | @include prefixer(appearance, $value, webkit moz ms o spec);
3 | }
4 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_backface-visibility.scss:
--------------------------------------------------------------------------------
1 | //************************************************************************//
2 | // Backface-visibility mixin
3 | //************************************************************************//
4 | @mixin backface-visibility($visibility) {
5 | @include prefixer(backface-visibility, $visibility, webkit spec);
6 | }
7 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_background-image.scss:
--------------------------------------------------------------------------------
1 | //************************************************************************//
2 | // Background-image property for adding multiple background images with
3 | // gradients, or for stringing multiple gradients together.
4 | //************************************************************************//
5 |
6 | @mixin background-image($images...) {
7 | $webkit-images: ();
8 | $spec-images: ();
9 |
10 | @each $image in $images {
11 | $webkit-image: ();
12 | $spec-image: ();
13 |
14 | @if (type-of($image) == string) {
15 | $url-str: str-slice($image, 0, 3);
16 | $gradient-type: str-slice($image, 0, 6);
17 |
18 | @if $url-str == "url" {
19 | $webkit-image: $image;
20 | $spec-image: $image;
21 | }
22 |
23 | @else if $gradient-type == "linear" {
24 | $gradients: _linear-gradient-parser($image);
25 | $webkit-image: map-get($gradients, webkit-image);
26 | $spec-image: map-get($gradients, spec-image);
27 | }
28 |
29 | @else if $gradient-type == "radial" {
30 | $gradients: _radial-gradient-parser($image);
31 | $webkit-image: map-get($gradients, webkit-image);
32 | $spec-image: map-get($gradients, spec-image);
33 | }
34 | }
35 |
36 | $webkit-images: append($webkit-images, $webkit-image, comma);
37 | $spec-images: append($spec-images, $spec-image, comma);
38 | }
39 |
40 | background-image: $webkit-images;
41 | background-image: $spec-images;
42 | }
43 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_background.scss:
--------------------------------------------------------------------------------
1 | //************************************************************************//
2 | // Background property for adding multiple backgrounds using shorthand
3 | // notation.
4 | //************************************************************************//
5 |
6 | @mixin background($backgrounds...) {
7 | $webkit-backgrounds: ();
8 | $spec-backgrounds: ();
9 |
10 | @each $background in $backgrounds {
11 | $webkit-background: ();
12 | $spec-background: ();
13 | $background-type: type-of($background);
14 |
15 | @if $background-type == string or list {
16 | $background-str: if($background-type == list, nth($background, 1), $background);
17 |
18 | $url-str: str-slice($background-str, 0, 3);
19 | $gradient-type: str-slice($background-str, 0, 6);
20 |
21 | @if $url-str == "url" {
22 | $webkit-background: $background;
23 | $spec-background: $background;
24 | }
25 |
26 | @else if $gradient-type == "linear" {
27 | $gradients: _linear-gradient-parser("#{$background}");
28 | $webkit-background: map-get($gradients, webkit-image);
29 | $spec-background: map-get($gradients, spec-image);
30 | }
31 |
32 | @else if $gradient-type == "radial" {
33 | $gradients: _radial-gradient-parser("#{$background}");
34 | $webkit-background: map-get($gradients, webkit-image);
35 | $spec-background: map-get($gradients, spec-image);
36 | }
37 |
38 | @else {
39 | $webkit-background: $background;
40 | $spec-background: $background;
41 | }
42 | }
43 |
44 | @else {
45 | $webkit-background: $background;
46 | $spec-background: $background;
47 | }
48 |
49 | $webkit-backgrounds: append($webkit-backgrounds, $webkit-background, comma);
50 | $spec-backgrounds: append($spec-backgrounds, $spec-background, comma);
51 | }
52 |
53 | background: $webkit-backgrounds;
54 | background: $spec-backgrounds;
55 | }
56 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_border-image.scss:
--------------------------------------------------------------------------------
1 | @mixin border-image($borders...) {
2 | $webkit-borders: ();
3 | $spec-borders: ();
4 |
5 | @each $border in $borders {
6 | $webkit-border: ();
7 | $spec-border: ();
8 | $border-type: type-of($border);
9 |
10 | @if $border-type == string or list {
11 | $border-str: if($border-type == list, nth($border, 1), $border);
12 |
13 | $url-str: str-slice($border-str, 0, 3);
14 | $gradient-type: str-slice($border-str, 0, 6);
15 |
16 | @if $url-str == "url" {
17 | $webkit-border: $border;
18 | $spec-border: $border;
19 | }
20 |
21 | @else if $gradient-type == "linear" {
22 | $gradients: _linear-gradient-parser("#{$border}");
23 | $webkit-border: map-get($gradients, webkit-image);
24 | $spec-border: map-get($gradients, spec-image);
25 | }
26 |
27 | @else if $gradient-type == "radial" {
28 | $gradients: _radial-gradient-parser("#{$border}");
29 | $webkit-border: map-get($gradients, webkit-image);
30 | $spec-border: map-get($gradients, spec-image);
31 | }
32 |
33 | @else {
34 | $webkit-border: $border;
35 | $spec-border: $border;
36 | }
37 | }
38 |
39 | @else {
40 | $webkit-border: $border;
41 | $spec-border: $border;
42 | }
43 |
44 | $webkit-borders: append($webkit-borders, $webkit-border, comma);
45 | $spec-borders: append($spec-borders, $spec-border, comma);
46 | }
47 |
48 | -webkit-border-image: $webkit-borders;
49 | border-image: $spec-borders;
50 | border-style: solid;
51 | }
52 |
53 | //Examples:
54 | // @include border-image(url("image.png"));
55 | // @include border-image(url("image.png") 20 stretch);
56 | // @include border-image(linear-gradient(45deg, orange, yellow));
57 | // @include border-image(linear-gradient(45deg, orange, yellow) stretch);
58 | // @include border-image(linear-gradient(45deg, orange, yellow) 20 30 40 50 stretch round);
59 | // @include border-image(radial-gradient(top, cover, orange, yellow, orange));
60 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_border-radius.scss:
--------------------------------------------------------------------------------
1 | //************************************************************************//
2 | // Shorthand Border-radius mixins
3 | //************************************************************************//
4 | @mixin border-top-radius($radii) {
5 | @include prefixer(border-top-left-radius, $radii, spec);
6 | @include prefixer(border-top-right-radius, $radii, spec);
7 | }
8 |
9 | @mixin border-bottom-radius($radii) {
10 | @include prefixer(border-bottom-left-radius, $radii, spec);
11 | @include prefixer(border-bottom-right-radius, $radii, spec);
12 | }
13 |
14 | @mixin border-left-radius($radii) {
15 | @include prefixer(border-top-left-radius, $radii, spec);
16 | @include prefixer(border-bottom-left-radius, $radii, spec);
17 | }
18 |
19 | @mixin border-right-radius($radii) {
20 | @include prefixer(border-top-right-radius, $radii, spec);
21 | @include prefixer(border-bottom-right-radius, $radii, spec);
22 | }
23 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_box-sizing.scss:
--------------------------------------------------------------------------------
1 | @mixin box-sizing ($box) {
2 | // content-box | border-box | inherit
3 | @include prefixer(box-sizing, $box, webkit moz spec);
4 | }
5 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_calc.scss:
--------------------------------------------------------------------------------
1 | @mixin calc($property, $value) {
2 | #{$property}: -webkit-calc(#{$value});
3 | #{$property}: calc(#{$value});
4 | }
5 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_columns.scss:
--------------------------------------------------------------------------------
1 | @mixin columns($arg: auto) {
2 | // ||
3 | @include prefixer(columns, $arg, webkit moz spec);
4 | }
5 |
6 | @mixin column-count($int: auto) {
7 | // auto || integer
8 | @include prefixer(column-count, $int, webkit moz spec);
9 | }
10 |
11 | @mixin column-gap($length: normal) {
12 | // normal || length
13 | @include prefixer(column-gap, $length, webkit moz spec);
14 | }
15 |
16 | @mixin column-fill($arg: auto) {
17 | // auto || length
18 | @include prefixer(column-fill, $arg, webkit moz spec);
19 | }
20 |
21 | @mixin column-rule($arg) {
22 | // || ||
23 | @include prefixer(column-rule, $arg, webkit moz spec);
24 | }
25 |
26 | @mixin column-rule-color($color) {
27 | @include prefixer(column-rule-color, $color, webkit moz spec);
28 | }
29 |
30 | @mixin column-rule-style($style: none) {
31 | // none | hidden | dashed | dotted | double | groove | inset | inset | outset | ridge | solid
32 | @include prefixer(column-rule-style, $style, webkit moz spec);
33 | }
34 |
35 | @mixin column-rule-width ($width: none) {
36 | @include prefixer(column-rule-width, $width, webkit moz spec);
37 | }
38 |
39 | @mixin column-span($arg: none) {
40 | // none || all
41 | @include prefixer(column-span, $arg, webkit moz spec);
42 | }
43 |
44 | @mixin column-width($length: auto) {
45 | // auto || length
46 | @include prefixer(column-width, $length, webkit moz spec);
47 | }
48 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_filter.scss:
--------------------------------------------------------------------------------
1 | @mixin filter($function: none) {
2 | // [
3 | @include prefixer(perspective, $depth, webkit moz spec);
4 | }
5 |
6 | @mixin perspective-origin($value: 50% 50%) {
7 | @include prefixer(perspective-origin, $value, webkit moz spec);
8 | }
9 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_placeholder.scss:
--------------------------------------------------------------------------------
1 | @mixin placeholder {
2 | $placeholders: ":-webkit-input" ":-moz" "-moz" "-ms-input";
3 | @each $placeholder in $placeholders {
4 | &:#{$placeholder}-placeholder {
5 | @content;
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_radial-gradient.scss:
--------------------------------------------------------------------------------
1 | // Requires Sass 3.1+
2 | @mixin radial-gradient($G1, $G2,
3 | $G3: null, $G4: null,
4 | $G5: null, $G6: null,
5 | $G7: null, $G8: null,
6 | $G9: null, $G10: null,
7 | $pos: null,
8 | $shape-size: null,
9 | $fallback: null) {
10 |
11 | $data: _radial-arg-parser($G1, $G2, $pos, $shape-size);
12 | $G1: nth($data, 1);
13 | $G2: nth($data, 2);
14 | $pos: nth($data, 3);
15 | $shape-size: nth($data, 4);
16 |
17 | $full: $G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10;
18 |
19 | // Strip deprecated cover/contain for spec
20 | $shape-size-spec: _shape-size-stripper($shape-size);
21 |
22 | // Set $G1 as the default fallback color
23 | $first-color: nth($full, 1);
24 | $fallback-color: nth($first-color, 1);
25 |
26 | @if (type-of($fallback) == color) or ($fallback == "transparent") {
27 | $fallback-color: $fallback;
28 | }
29 |
30 | // Add Commas and spaces
31 | $shape-size: if($shape-size, '#{$shape-size}, ', null);
32 | $pos: if($pos, '#{$pos}, ', null);
33 | $pos-spec: if($pos, 'at #{$pos}', null);
34 | $shape-size-spec: if(($shape-size-spec != ' ') and ($pos == null), '#{$shape-size-spec}, ', '#{$shape-size-spec} ');
35 |
36 | background-color: $fallback-color;
37 | background-image: -webkit-radial-gradient(unquote(#{$pos}#{$shape-size}#{$full}));
38 | background-image: unquote("radial-gradient(#{$shape-size-spec}#{$pos-spec}#{$full})");
39 | }
40 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_transform.scss:
--------------------------------------------------------------------------------
1 | @mixin transform($property: none) {
2 | // none |
3 | @include prefixer(transform, $property, webkit moz ms o spec);
4 | }
5 |
6 | @mixin transform-origin($axes: 50%) {
7 | // x-axis - left | center | right | length | %
8 | // y-axis - top | center | bottom | length | %
9 | // z-axis - length
10 | @include prefixer(transform-origin, $axes, webkit moz ms o spec);
11 | }
12 |
13 | @mixin transform-style ($style: flat) {
14 | @include prefixer(transform-style, $style, webkit moz ms o spec);
15 | }
16 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_transition.scss:
--------------------------------------------------------------------------------
1 | // Shorthand mixin. Supports multiple parentheses-deliminated values for each variable.
2 | // Example: @include transition (all 2s ease-in-out);
3 | // @include transition (opacity 1s ease-in 2s, width 2s ease-out);
4 | // @include transition-property (transform, opacity);
5 |
6 | @mixin transition ($properties...) {
7 | // Fix for vendor-prefix transform property
8 | $needs-prefixes: false;
9 | $webkit: ();
10 | $moz: ();
11 | $spec: ();
12 |
13 | // Create lists for vendor-prefixed transform
14 | @each $list in $properties {
15 | @if nth($list, 1) == "transform" {
16 | $needs-prefixes: true;
17 | $list1: -webkit-transform;
18 | $list2: -moz-transform;
19 | $list3: ();
20 |
21 | @each $var in $list {
22 | $list3: join($list3, $var);
23 |
24 | @if $var != "transform" {
25 | $list1: join($list1, $var);
26 | $list2: join($list2, $var);
27 | }
28 | }
29 |
30 | $webkit: append($webkit, $list1);
31 | $moz: append($moz, $list2);
32 | $spec: append($spec, $list3);
33 | }
34 |
35 | // Create lists for non-prefixed transition properties
36 | @else {
37 | $webkit: append($webkit, $list, comma);
38 | $moz: append($moz, $list, comma);
39 | $spec: append($spec, $list, comma);
40 | }
41 | }
42 |
43 | @if $needs-prefixes {
44 | -webkit-transition: $webkit;
45 | -moz-transition: $moz;
46 | transition: $spec;
47 | }
48 | @else {
49 | @if length($properties) >= 1 {
50 | @include prefixer(transition, $properties, webkit moz spec);
51 | }
52 |
53 | @else {
54 | $properties: all 0.15s ease-out 0s;
55 | @include prefixer(transition, $properties, webkit moz spec);
56 | }
57 | }
58 | }
59 |
60 | @mixin transition-property ($properties...) {
61 | -webkit-transition-property: transition-property-names($properties, 'webkit');
62 | -moz-transition-property: transition-property-names($properties, 'moz');
63 | transition-property: transition-property-names($properties, false);
64 | }
65 |
66 | @mixin transition-duration ($times...) {
67 | @include prefixer(transition-duration, $times, webkit moz spec);
68 | }
69 |
70 | @mixin transition-timing-function ($motions...) {
71 | // ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier()
72 | @include prefixer(transition-timing-function, $motions, webkit moz spec);
73 | }
74 |
75 | @mixin transition-delay ($times...) {
76 | @include prefixer(transition-delay, $times, webkit moz spec);
77 | }
78 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/css3/_user-select.scss:
--------------------------------------------------------------------------------
1 | @mixin user-select($arg: none) {
2 | @include prefixer(user-select, $arg, webkit moz ms spec);
3 | }
4 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_assign.scss:
--------------------------------------------------------------------------------
1 | @function assign-inputs($inputs, $pseudo: null) {
2 | $list : ();
3 |
4 | @each $input in $inputs {
5 | $input: unquote($input);
6 | $input: if($pseudo, $input + ":" + $pseudo, $input);
7 | $list: append($list, $input, comma);
8 | }
9 |
10 | @return $list;
11 | }
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_color-lightness.scss:
--------------------------------------------------------------------------------
1 | // Programatically determines whether a color is light or dark
2 | // Returns a boolean
3 | // More details here http://robots.thoughtbot.com/closer-look-color-lightness
4 |
5 | @function is-light($hex-color) {
6 | $-local-red: red(rgba($hex-color, 1.0));
7 | $-local-green: green(rgba($hex-color, 1.0));
8 | $-local-blue: blue(rgba($hex-color, 1.0));
9 |
10 | $-local-lightness: ($-local-red * 0.2126 + $-local-green * 0.7152 + $-local-blue * 0.0722) / 255;
11 |
12 | @return $-local-lightness > .6;
13 | }
14 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_flex-grid.scss:
--------------------------------------------------------------------------------
1 | // Flexible grid
2 | @function flex-grid($columns, $container-columns: $fg-max-columns) {
3 | $width: $columns * $fg-column + ($columns - 1) * $fg-gutter;
4 | $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
5 | @return percentage($width / $container-width);
6 | }
7 |
8 | // Flexible gutter
9 | @function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) {
10 | $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
11 | @return percentage($gutter / $container-width);
12 | }
13 |
14 | // The $fg-column, $fg-gutter and $fg-max-columns variables must be defined in your base stylesheet to properly use the flex-grid function.
15 | // This function takes the fluid grid equation (target / context = result) and uses columns to help define each.
16 | //
17 | // The calculation presumes that your column structure will be missing the last gutter:
18 | //
19 | // -- column -- gutter -- column -- gutter -- column
20 | //
21 | // $fg-column: 60px; // Column Width
22 | // $fg-gutter: 25px; // Gutter Width
23 | // $fg-max-columns: 12; // Total Columns For Main Container
24 | //
25 | // div {
26 | // width: flex-grid(4); // returns (315px / 995px) = 31.65829%;
27 | // margin-left: flex-gutter(); // returns (25px / 995px) = 2.51256%;
28 | //
29 | // p {
30 | // width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%;
31 | // float: left;
32 | // margin: flex-gutter(4); // returns (25px / 315px) = 7.936508%;
33 | // }
34 | //
35 | // blockquote {
36 | // float: left;
37 | // width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%;
38 | // }
39 | // }
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_golden-ratio.scss:
--------------------------------------------------------------------------------
1 | @function golden-ratio($value, $increment) {
2 | @return modular-scale($value, $increment, $golden)
3 | }
4 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_grid-width.scss:
--------------------------------------------------------------------------------
1 | @function grid-width($n) {
2 | @return $n * $gw-column + ($n - 1) * $gw-gutter;
3 | }
4 |
5 | // The $gw-column and $gw-gutter variables must be defined in your base stylesheet to properly use the grid-width function.
6 | //
7 | // $gw-column: 100px; // Column Width
8 | // $gw-gutter: 40px; // Gutter Width
9 | //
10 | // div {
11 | // width: grid-width(4); // returns 520px;
12 | // margin-left: $gw-gutter; // returns 40px;
13 | // }
14 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_modular-scale.scss:
--------------------------------------------------------------------------------
1 | // Scaling Variables
2 | $golden: 1.618;
3 | $minor-second: 1.067;
4 | $major-second: 1.125;
5 | $minor-third: 1.2;
6 | $major-third: 1.25;
7 | $perfect-fourth: 1.333;
8 | $augmented-fourth: 1.414;
9 | $perfect-fifth: 1.5;
10 | $minor-sixth: 1.6;
11 | $major-sixth: 1.667;
12 | $minor-seventh: 1.778;
13 | $major-seventh: 1.875;
14 | $octave: 2;
15 | $major-tenth: 2.5;
16 | $major-eleventh: 2.667;
17 | $major-twelfth: 3;
18 | $double-octave: 4;
19 |
20 | @function modular-scale($value, $increment, $ratio) {
21 | $v1: nth($value, 1);
22 | $v2: nth($value, length($value));
23 | $value: $v1;
24 |
25 | // scale $v2 to just above $v1
26 | @while $v2 > $v1 {
27 | $v2: ($v2 / $ratio); // will be off-by-1
28 | }
29 | @while $v2 < $v1 {
30 | $v2: ($v2 * $ratio); // will fix off-by-1
31 | }
32 |
33 | // check AFTER scaling $v2 to prevent double-counting corner-case
34 | $double-stranded: $v2 > $v1;
35 |
36 | @if $increment > 0 {
37 | @for $i from 1 through $increment {
38 | @if $double-stranded and ($v1 * $ratio) > $v2 {
39 | $value: $v2;
40 | $v2: ($v2 * $ratio);
41 | } @else {
42 | $v1: ($v1 * $ratio);
43 | $value: $v1;
44 | }
45 | }
46 | }
47 |
48 | @if $increment < 0 {
49 | // adjust $v2 to just below $v1
50 | @if $double-stranded {
51 | $v2: ($v2 / $ratio);
52 | }
53 |
54 | @for $i from $increment through -1 {
55 | @if $double-stranded and ($v1 / $ratio) < $v2 {
56 | $value: $v2;
57 | $v2: ($v2 / $ratio);
58 | } @else {
59 | $v1: ($v1 / $ratio);
60 | $value: $v1;
61 | }
62 | }
63 | }
64 |
65 | @return $value;
66 | }
67 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_px-to-em.scss:
--------------------------------------------------------------------------------
1 | // Convert pixels to ems
2 | // eg. for a relational value of 12px write em(12) when the parent is 16px
3 | // if the parent is another value say 24px write em(12, 24)
4 |
5 | @function em($pxval, $base: $em-base) {
6 | @if not unitless($pxval) {
7 | $pxval: strip-units($pxval);
8 | }
9 | @if not unitless($base) {
10 | $base: strip-units($base);
11 | }
12 | @return ($pxval / $base) * 1em;
13 | }
14 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_px-to-rem.scss:
--------------------------------------------------------------------------------
1 | // Convert pixels to rems
2 | // eg. for a relational value of 12px write rem(12)
3 | // Assumes $em-base is the font-size of
4 |
5 | @function rem($pxval) {
6 | @if not unitless($pxval) {
7 | $pxval: strip-units($pxval);
8 | }
9 |
10 | $base: $em-base;
11 | @if not unitless($base) {
12 | $base: strip-units($base);
13 | }
14 | @return ($pxval / $base) * 1rem;
15 | }
16 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_strip-units.scss:
--------------------------------------------------------------------------------
1 | // Srtips the units from a value. e.g. 12px -> 12
2 |
3 | @function strip-units($val) {
4 | @return ($val / ($val * 0 + 1));
5 | }
6 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_tint-shade.scss:
--------------------------------------------------------------------------------
1 | // Add percentage of white to a color
2 | @function tint($color, $percent){
3 | @return mix(white, $color, $percent);
4 | }
5 |
6 | // Add percentage of black to a color
7 | @function shade($color, $percent){
8 | @return mix(black, $color, $percent);
9 | }
10 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_transition-property-name.scss:
--------------------------------------------------------------------------------
1 | // Return vendor-prefixed property names if appropriate
2 | // Example: transition-property-names((transform, color, background), moz) -> -moz-transform, color, background
3 | //************************************************************************//
4 | @function transition-property-names($props, $vendor: false) {
5 | $new-props: ();
6 |
7 | @each $prop in $props {
8 | $new-props: append($new-props, transition-property-name($prop, $vendor), comma);
9 | }
10 |
11 | @return $new-props;
12 | }
13 |
14 | @function transition-property-name($prop, $vendor: false) {
15 | // put other properties that need to be prefixed here aswell
16 | @if $vendor and $prop == transform {
17 | @return unquote('-'+$vendor+'-'+$prop);
18 | }
19 | @else {
20 | @return $prop;
21 | }
22 | }
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/functions/_unpack.scss:
--------------------------------------------------------------------------------
1 | // Convert shorthand to the 4-value syntax
2 |
3 | @function unpack($shorthand) {
4 | @if length($shorthand) == 1 {
5 | @return nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1);
6 | }
7 | @else if length($shorthand) == 2 {
8 | @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 1) nth($shorthand, 2);
9 | }
10 | @else if length($shorthand) == 3 {
11 | @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 3) nth($shorthand, 2);
12 | }
13 | @else {
14 | @return $shorthand;
15 | }
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_convert-units.scss:
--------------------------------------------------------------------------------
1 | //************************************************************************//
2 | // Helper function for str-to-num fn.
3 | // Source: http://sassmeister.com/gist/9647408
4 | //************************************************************************//
5 | @function _convert-units($number, $unit) {
6 | $strings: 'px' 'cm' 'mm' '%' 'ch' 'pica' 'in' 'em' 'rem' 'pt' 'pc' 'ex' 'vw' 'vh' 'vmin' 'vmax', 'deg', 'rad', 'grad', 'turn';
7 | $units: 1px 1cm 1mm 1% 1ch 1pica 1in 1em 1rem 1pt 1pc 1ex 1vw 1vh 1vmin 1vmax, 1deg, 1rad, 1grad, 1turn;
8 | $index: index($strings, $unit);
9 |
10 | @if not $index {
11 | @warn "Unknown unit `#{$unit}`.";
12 | @return false;
13 | }
14 | @return $number * nth($units, $index);
15 | }
16 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_gradient-positions-parser.scss:
--------------------------------------------------------------------------------
1 | @function _gradient-positions-parser($gradient-type, $gradient-positions) {
2 | @if $gradient-positions
3 | and ($gradient-type == linear)
4 | and (type-of($gradient-positions) != color) {
5 | $gradient-positions: _linear-positions-parser($gradient-positions);
6 | }
7 | @else if $gradient-positions
8 | and ($gradient-type == radial)
9 | and (type-of($gradient-positions) != color) {
10 | $gradient-positions: _radial-positions-parser($gradient-positions);
11 | }
12 | @return $gradient-positions;
13 | }
14 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_is-num.scss:
--------------------------------------------------------------------------------
1 | //************************************************************************//
2 | // Helper for linear-gradient-parser
3 | //************************************************************************//
4 | @function _is-num($char) {
5 | $values: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 0 1 2 3 4 5 6 7 8 9;
6 | $index: index($values, $char);
7 | @return if($index, true, false);
8 | }
9 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_linear-angle-parser.scss:
--------------------------------------------------------------------------------
1 | // Private function for linear-gradient-parser
2 | @function _linear-angle-parser($image, $first-val, $prefix, $suffix) {
3 | $offset: null;
4 | $unit-short: str-slice($first-val, str-length($first-val) - 2, str-length($first-val));
5 | $unit-long: str-slice($first-val, str-length($first-val) - 3, str-length($first-val));
6 |
7 | @if ($unit-long == "grad") or
8 | ($unit-long == "turn") {
9 | $offset: if($unit-long == "grad", -100grad * 3, -0.75turn);
10 | }
11 |
12 | @else if ($unit-short == "deg") or
13 | ($unit-short == "rad") {
14 | $offset: if($unit-short == "deg", -90 * 3, 1.6rad);
15 | }
16 |
17 | @if $offset {
18 | $num: _str-to-num($first-val);
19 |
20 | @return (
21 | webkit-image: -webkit- + $prefix + ($offset - $num) + $suffix,
22 | spec-image: $image
23 | );
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_linear-gradient-parser.scss:
--------------------------------------------------------------------------------
1 | @function _linear-gradient-parser($image) {
2 | $image: unquote($image);
3 | $gradients: ();
4 | $start: str-index($image, "(");
5 | $end: str-index($image, ",");
6 | $first-val: str-slice($image, $start + 1, $end - 1);
7 |
8 | $prefix: str-slice($image, 0, $start);
9 | $suffix: str-slice($image, $end, str-length($image));
10 |
11 | $has-multiple-vals: str-index($first-val, " ");
12 | $has-single-position: unquote(_position-flipper($first-val) + "");
13 | $has-angle: _is-num(str-slice($first-val, 0, 0));
14 |
15 | @if $has-multiple-vals {
16 | $gradients: _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals);
17 | }
18 |
19 | @else if $has-single-position != "" {
20 | $pos: unquote($has-single-position + "");
21 |
22 | $gradients: (
23 | webkit-image: -webkit- + $image,
24 | spec-image: $prefix + "to " + $pos + $suffix
25 | );
26 | }
27 |
28 | @else if $has-angle {
29 | // Rotate degree for webkit
30 | $gradients: _linear-angle-parser($image, $first-val, $prefix, $suffix);
31 | }
32 |
33 | @else {
34 | $gradients: (
35 | webkit-image: -webkit- + $image,
36 | spec-image: $image
37 | );
38 | }
39 |
40 | @return $gradients;
41 | }
42 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_linear-positions-parser.scss:
--------------------------------------------------------------------------------
1 | @function _linear-positions-parser($pos) {
2 | $type: type-of(nth($pos, 1));
3 | $spec: null;
4 | $degree: null;
5 | $side: null;
6 | $corner: null;
7 | $length: length($pos);
8 | // Parse Side and corner positions
9 | @if ($length > 1) {
10 | @if nth($pos, 1) == "to" { // Newer syntax
11 | $side: nth($pos, 2);
12 |
13 | @if $length == 2 { // eg. to top
14 | // Swap for backwards compatability
15 | $degree: _position-flipper(nth($pos, 2));
16 | }
17 | @else if $length == 3 { // eg. to top left
18 | $corner: nth($pos, 3);
19 | }
20 | }
21 | @else if $length == 2 { // Older syntax ("top left")
22 | $side: _position-flipper(nth($pos, 1));
23 | $corner: _position-flipper(nth($pos, 2));
24 | }
25 |
26 | @if ("#{$side} #{$corner}" == "left top") or ("#{$side} #{$corner}" == "top left") {
27 | $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
28 | }
29 | @else if ("#{$side} #{$corner}" == "right top") or ("#{$side} #{$corner}" == "top right") {
30 | $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
31 | }
32 | @else if ("#{$side} #{$corner}" == "right bottom") or ("#{$side} #{$corner}" == "bottom right") {
33 | $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
34 | }
35 | @else if ("#{$side} #{$corner}" == "left bottom") or ("#{$side} #{$corner}" == "bottom left") {
36 | $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
37 | }
38 | $spec: to $side $corner;
39 | }
40 | @else if $length == 1 {
41 | // Swap for backwards compatability
42 | @if $type == string {
43 | $degree: $pos;
44 | $spec: to _position-flipper($pos);
45 | }
46 | @else {
47 | $degree: -270 - $pos; //rotate the gradient opposite from spec
48 | $spec: $pos;
49 | }
50 | }
51 | $degree: unquote($degree + ",");
52 | $spec: unquote($spec + ",");
53 | @return $degree $spec;
54 | }
55 |
56 | @function _position-flipper($pos) {
57 | @return if($pos == left, right, null)
58 | if($pos == right, left, null)
59 | if($pos == top, bottom, null)
60 | if($pos == bottom, top, null);
61 | }
62 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_linear-side-corner-parser.scss:
--------------------------------------------------------------------------------
1 | // Private function for linear-gradient-parser
2 | @function _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals) {
3 | $val-1: str-slice($first-val, 0, $has-multiple-vals - 1 );
4 | $val-2: str-slice($first-val, $has-multiple-vals + 1, str-length($first-val));
5 | $val-3: null;
6 | $has-val-3: str-index($val-2, " ");
7 |
8 | @if $has-val-3 {
9 | $val-3: str-slice($val-2, $has-val-3 + 1, str-length($val-2));
10 | $val-2: str-slice($val-2, 0, $has-val-3 - 1);
11 | }
12 |
13 | $pos: _position-flipper($val-1) _position-flipper($val-2) _position-flipper($val-3);
14 | $pos: unquote($pos + "");
15 |
16 | // Use old spec for webkit
17 | @if $val-1 == "to" {
18 | @return (
19 | webkit-image: -webkit- + $prefix + $pos + $suffix,
20 | spec-image: $image
21 | );
22 | }
23 |
24 | // Bring the code up to spec
25 | @else {
26 | @return (
27 | webkit-image: -webkit- + $image,
28 | spec-image: $prefix + "to " + $pos + $suffix
29 | );
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_radial-arg-parser.scss:
--------------------------------------------------------------------------------
1 | @function _radial-arg-parser($G1, $G2, $pos, $shape-size) {
2 | @each $value in $G1, $G2 {
3 | $first-val: nth($value, 1);
4 | $pos-type: type-of($first-val);
5 | $spec-at-index: null;
6 |
7 | // Determine if spec was passed to mixin
8 | @if type-of($value) == list {
9 | $spec-at-index: if(index($value, at), index($value, at), false);
10 | }
11 | @if $spec-at-index {
12 | @if $spec-at-index > 1 {
13 | @for $i from 1 through ($spec-at-index - 1) {
14 | $shape-size: $shape-size nth($value, $i);
15 | }
16 | @for $i from ($spec-at-index + 1) through length($value) {
17 | $pos: $pos nth($value, $i);
18 | }
19 | }
20 | @else if $spec-at-index == 1 {
21 | @for $i from ($spec-at-index + 1) through length($value) {
22 | $pos: $pos nth($value, $i);
23 | }
24 | }
25 | $G1: null;
26 | }
27 |
28 | // If not spec calculate correct values
29 | @else {
30 | @if ($pos-type != color) or ($first-val != "transparent") {
31 | @if ($pos-type == number)
32 | or ($first-val == "center")
33 | or ($first-val == "top")
34 | or ($first-val == "right")
35 | or ($first-val == "bottom")
36 | or ($first-val == "left") {
37 |
38 | $pos: $value;
39 |
40 | @if $pos == $G1 {
41 | $G1: null;
42 | }
43 | }
44 |
45 | @else if
46 | ($first-val == "ellipse")
47 | or ($first-val == "circle")
48 | or ($first-val == "closest-side")
49 | or ($first-val == "closest-corner")
50 | or ($first-val == "farthest-side")
51 | or ($first-val == "farthest-corner")
52 | or ($first-val == "contain")
53 | or ($first-val == "cover") {
54 |
55 | $shape-size: $value;
56 |
57 | @if $value == $G1 {
58 | $G1: null;
59 | }
60 |
61 | @else if $value == $G2 {
62 | $G2: null;
63 | }
64 | }
65 | }
66 | }
67 | }
68 | @return $G1, $G2, $pos, $shape-size;
69 | }
70 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_radial-gradient-parser.scss:
--------------------------------------------------------------------------------
1 | @function _radial-gradient-parser($image) {
2 | $image: unquote($image);
3 | $gradients: ();
4 | $start: str-index($image, "(");
5 | $end: str-index($image, ",");
6 | $first-val: str-slice($image, $start + 1, $end - 1);
7 |
8 | $prefix: str-slice($image, 0, $start);
9 | $suffix: str-slice($image, $end, str-length($image));
10 |
11 | $is-spec-syntax: str-index($first-val, "at");
12 |
13 | @if $is-spec-syntax and $is-spec-syntax > 1 {
14 | $keyword: str-slice($first-val, 1, $is-spec-syntax - 2);
15 | $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val));
16 | $pos: append($pos, $keyword, comma);
17 |
18 | $gradients: (
19 | webkit-image: -webkit- + $prefix + $pos + $suffix,
20 | spec-image: $image
21 | )
22 | }
23 |
24 | @else if $is-spec-syntax == 1 {
25 | $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val));
26 |
27 | $gradients: (
28 | webkit-image: -webkit- + $prefix + $pos + $suffix,
29 | spec-image: $image
30 | )
31 | }
32 |
33 | @else if str-index($image, "cover") or str-index($image, "contain") {
34 | @warn "Radial-gradient needs to be updated to conform to latest spec.";
35 |
36 | $gradients: (
37 | webkit-image: null,
38 | spec-image: $image
39 | )
40 | }
41 |
42 | @else {
43 | $gradients: (
44 | webkit-image: -webkit- + $image,
45 | spec-image: $image
46 | )
47 | }
48 |
49 | @return $gradients;
50 | }
51 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_radial-positions-parser.scss:
--------------------------------------------------------------------------------
1 | @function _radial-positions-parser($gradient-pos) {
2 | $shape-size: nth($gradient-pos, 1);
3 | $pos: nth($gradient-pos, 2);
4 | $shape-size-spec: _shape-size-stripper($shape-size);
5 |
6 | $pre-spec: unquote(if($pos, "#{$pos}, ", null))
7 | unquote(if($shape-size, "#{$shape-size},", null));
8 | $pos-spec: if($pos, "at #{$pos}", null);
9 |
10 | $spec: "#{$shape-size-spec} #{$pos-spec}";
11 |
12 | // Add comma
13 | @if ($spec != ' ') {
14 | $spec: "#{$spec},"
15 | }
16 |
17 | @return $pre-spec $spec;
18 | }
19 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_render-gradients.scss:
--------------------------------------------------------------------------------
1 | // User for linear and radial gradients within background-image or border-image properties
2 |
3 | @function _render-gradients($gradient-positions, $gradients, $gradient-type, $vendor: false) {
4 | $pre-spec: null;
5 | $spec: null;
6 | $vendor-gradients: null;
7 | @if $gradient-type == linear {
8 | @if $gradient-positions {
9 | $pre-spec: nth($gradient-positions, 1);
10 | $spec: nth($gradient-positions, 2);
11 | }
12 | }
13 | @else if $gradient-type == radial {
14 | $pre-spec: nth($gradient-positions, 1);
15 | $spec: nth($gradient-positions, 2);
16 | }
17 |
18 | @if $vendor {
19 | $vendor-gradients: -#{$vendor}-#{$gradient-type}-gradient(#{$pre-spec} $gradients);
20 | }
21 | @else if $vendor == false {
22 | $vendor-gradients: "#{$gradient-type}-gradient(#{$spec} #{$gradients})";
23 | $vendor-gradients: unquote($vendor-gradients);
24 | }
25 | @return $vendor-gradients;
26 | }
27 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_shape-size-stripper.scss:
--------------------------------------------------------------------------------
1 | @function _shape-size-stripper($shape-size) {
2 | $shape-size-spec: null;
3 | @each $value in $shape-size {
4 | @if ($value == "cover") or ($value == "contain") {
5 | $value: null;
6 | }
7 | $shape-size-spec: "#{$shape-size-spec} #{$value}";
8 | }
9 | @return $shape-size-spec;
10 | }
11 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/helpers/_str-to-num.scss:
--------------------------------------------------------------------------------
1 | //************************************************************************//
2 | // Helper function for linear/radial-gradient-parsers.
3 | // Source: http://sassmeister.com/gist/9647408
4 | //************************************************************************//
5 | @function _str-to-num($string) {
6 | // Matrices
7 | $strings: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9';
8 | $numbers: 0 1 2 3 4 5 6 7 8 9;
9 |
10 | // Result
11 | $result: 0;
12 | $divider: 0;
13 | $minus: false;
14 |
15 | // Looping through all characters
16 | @for $i from 1 through str-length($string) {
17 | $character: str-slice($string, $i, $i);
18 | $index: index($strings, $character);
19 |
20 | @if $character == '-' {
21 | $minus: true;
22 | }
23 |
24 | @else if $character == '.' {
25 | $divider: 1;
26 | }
27 |
28 | @else {
29 | @if not $index {
30 | $result: if($minus, $result * -1, $result);
31 | @return _convert-units($result, str-slice($string, $i));
32 | }
33 |
34 | $number: nth($numbers, $index);
35 |
36 | @if $divider == 0 {
37 | $result: $result * 10;
38 | }
39 |
40 | @else {
41 | // Move the decimal dot to the left
42 | $divider: $divider * 10;
43 | $number: $number / $divider;
44 | }
45 |
46 | $result: $result + $number;
47 | }
48 | }
49 | @return if($minus, $result * -1, $result);
50 | }
51 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/settings/_asset-pipeline.scss:
--------------------------------------------------------------------------------
1 | $asset-pipeline: false !default;
2 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/settings/_prefixer.scss:
--------------------------------------------------------------------------------
1 | // Variable settings for /addons/prefixer.scss
2 | $prefix-for-webkit: true !default;
3 | $prefix-for-mozilla: true !default;
4 | $prefix-for-microsoft: true !default;
5 | $prefix-for-opera: true !default;
6 | $prefix-for-spec: true !default; // required for keyframe mixin
7 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/bourbon/settings/_px-to-em.scss:
--------------------------------------------------------------------------------
1 | $em-base: 16px !default;
2 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/_animated.scss:
--------------------------------------------------------------------------------
1 | // Spinning Icons
2 | // --------------------------
3 |
4 | .#{$fa-css-prefix}-spin {
5 | -webkit-animation: fa-spin 2s infinite linear;
6 | animation: fa-spin 2s infinite linear;
7 | }
8 |
9 | .#{$fa-css-prefix}-pulse {
10 | -webkit-animation: fa-spin 1s infinite steps(8);
11 | animation: fa-spin 1s infinite steps(8);
12 | }
13 |
14 | @-webkit-keyframes fa-spin {
15 | 0% {
16 | -webkit-transform: rotate(0deg);
17 | transform: rotate(0deg);
18 | }
19 | 100% {
20 | -webkit-transform: rotate(359deg);
21 | transform: rotate(359deg);
22 | }
23 | }
24 |
25 | @keyframes fa-spin {
26 | 0% {
27 | -webkit-transform: rotate(0deg);
28 | transform: rotate(0deg);
29 | }
30 | 100% {
31 | -webkit-transform: rotate(359deg);
32 | transform: rotate(359deg);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em $fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .pull-right { float: right; }
11 | .pull-left { float: left; }
12 |
13 | .#{$fa-css-prefix} {
14 | &.pull-left { margin-right: .3em; }
15 | &.pull-right { margin-left: .3em; }
16 | }
17 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/_core.scss:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix} {
5 | display: inline-block;
6 | font: normal normal normal #{$fa-font-size-base}/1 FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 | transform: translate(0, 0); // ensures no half-pixel rendering in firefox
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .#{$fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/_larger.scss:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .#{$fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .#{$fa-css-prefix}-2x { font-size: 2em; }
11 | .#{$fa-css-prefix}-3x { font-size: 3em; }
12 | .#{$fa-css-prefix}-4x { font-size: 4em; }
13 | .#{$fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/_list.scss:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: $fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .#{$fa-css-prefix}-li {
11 | position: absolute;
12 | left: -$fa-li-width;
13 | width: $fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.#{$fa-css-prefix}-lg {
17 | left: -$fa-li-width + (4em / 14);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | @mixin fa-icon() {
5 | display: inline-block;
6 | font: normal normal normal #{$fa-font-size-base}/1 FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 | transform: translate(0, 0); // ensures no half-pixel rendering in firefox
12 |
13 | }
14 |
15 | @mixin fa-icon-rotate($degrees, $rotation) {
16 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
17 | -webkit-transform: rotate($degrees);
18 | -ms-transform: rotate($degrees);
19 | transform: rotate($degrees);
20 | }
21 |
22 | @mixin fa-icon-flip($horiz, $vert, $rotation) {
23 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
24 | -webkit-transform: scale($horiz, $vert);
25 | -ms-transform: scale($horiz, $vert);
26 | transform: scale($horiz, $vert);
27 | }
28 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/_path.scss:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
13 | font-weight: normal;
14 | font-style: normal;
15 | }
16 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/_rotated-flipped.scss:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
7 |
8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
10 |
11 | // Hook for IE8-9
12 | // -------------------------
13 |
14 | :root .#{$fa-css-prefix}-rotate-90,
15 | :root .#{$fa-css-prefix}-rotate-180,
16 | :root .#{$fa-css-prefix}-rotate-270,
17 | :root .#{$fa-css-prefix}-flip-horizontal,
18 | :root .#{$fa-css-prefix}-flip-vertical {
19 | filter: none;
20 | }
21 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/_stacked.scss:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; }
21 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/font-awesome/font-awesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables";
7 | @import "mixins";
8 | @import "path";
9 | @import "core";
10 | @import "larger";
11 | @import "fixed-width";
12 | @import "list";
13 | @import "bordered-pulled";
14 | @import "animated";
15 | @import "rotated-flipped";
16 | @import "stacked";
17 | @import "icons";
18 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/_neat-helpers.scss:
--------------------------------------------------------------------------------
1 | // Functions
2 | @import "functions/private";
3 | @import "functions/new-breakpoint";
4 |
5 | // Settings
6 | @import "settings/grid";
7 | @import "settings/visual-grid";
8 | @import "settings/disable-warnings";
9 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/_neat.scss:
--------------------------------------------------------------------------------
1 | /* Neat 1.7.0
2 | * http://neat.bourbon.io
3 | * Copyright 2012-2014 thoughtbot, inc.
4 | * MIT License */
5 |
6 | // Helpers
7 | @import "neat-helpers";
8 |
9 | // Grid
10 | @import "grid/private";
11 | @import "grid/box-sizing";
12 | @import "grid/omega";
13 | @import "grid/outer-container";
14 | @import "grid/span-columns";
15 | @import "grid/row";
16 | @import "grid/shift";
17 | @import "grid/pad";
18 | @import "grid/fill-parent";
19 | @import "grid/media";
20 | @import "grid/to-deprecate";
21 | @import "grid/visual-grid";
22 | @import "grid/display-context";
23 | @import "grid/direction-context";
24 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/functions/_new-breakpoint.scss:
--------------------------------------------------------------------------------
1 | /// Returns a media context (media query / grid context) that can be stored in a variable and passed to `media()` as a single-keyword argument. Media contexts defined using `new-breakpoint` are used by the visual grid, as long as they are defined before importing Neat.
2 | ///
3 | /// @param {List} $query
4 | /// A list of media query features and values. Each `$feature` should have a corresponding `$value`.
5 | ///
6 | /// If there is only a single `$value` in `$query`, `$default-feature` is going to be used.
7 | ///
8 | /// The number of total columns in the grid can be set by passing `$columns` at the end of the list (overrides `$total-columns`). For a list of valid values for `$feature`, click [here](http://www.w3.org/TR/css3-mediaqueries/#media1).
9 | ///
10 | /// @param {Number (unitless)} $total-columns ($grid-columns)
11 | /// - Number of columns to use in the new grid context. Can be set as a shorthand in the first parameter.
12 | ///
13 | /// @example scss - Usage
14 | /// $mobile: new-breakpoint(max-width 480px 4);
15 | ///
16 | /// .element {
17 | /// @include media($mobile) {
18 | /// @include span-columns(4);
19 | /// }
20 | /// }
21 | ///
22 | /// @example css - CSS Output
23 | /// @media screen and (max-width: 480px) {
24 | /// .element {
25 | /// display: block;
26 | /// float: left;
27 | /// margin-right: 7.42297%;
28 | /// width: 100%;
29 | /// }
30 | /// .element:last-child {
31 | /// margin-right: 0;
32 | /// }
33 | /// }
34 |
35 | @function new-breakpoint($query: $feature $value $columns, $total-columns: $grid-columns) {
36 | @if length($query) == 1 {
37 | $query: $default-feature nth($query, 1) $total-columns;
38 | }
39 |
40 | @else if is-even(length($query)) {
41 | $query: append($query, $total-columns);
42 | }
43 |
44 | @if not belongs-to($query, $visual-grid-breakpoints) {
45 | $visual-grid-breakpoints: append($visual-grid-breakpoints, $query, comma) !global;
46 | }
47 |
48 | @return $query;
49 | }
50 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/functions/_private.scss:
--------------------------------------------------------------------------------
1 | // Checks if a number is even
2 | @function is-even($int) {
3 | @return $int % 2 == 0
4 | }
5 |
6 | // Checks if an element belongs to a list or not
7 | @function belongs-to($tested-item, $list) {
8 | @return not not-belongs-to($tested-item, $list);
9 | }
10 |
11 | @function not-belongs-to($tested-item, $list) {
12 | @return not index($list, $tested-item);
13 | }
14 |
15 | // Contains display value
16 | @function contains-display-value($query) {
17 | @return belongs-to(table, $query)
18 | or belongs-to(block, $query)
19 | or belongs-to(inline-block, $query)
20 | or belongs-to(inline, $query);
21 | }
22 |
23 | // Parses the first argument of span-columns()
24 | @function container-span($span: $span) {
25 | @if length($span) == 3 {
26 | $container-columns: nth($span, 3);
27 | @return $container-columns;
28 | } @else if length($span) == 2 {
29 | $container-columns: nth($span, 2);
30 | @return $container-columns;
31 | }
32 |
33 | @return $grid-columns;
34 | }
35 |
36 | @function container-shift($shift: $shift) {
37 | $parent-columns: $grid-columns !default !global;
38 |
39 | @if length($shift) == 3 {
40 | $container-columns: nth($shift, 3);
41 | @return $container-columns;
42 | } @else if length($shift) == 2 {
43 | $container-columns: nth($shift, 2);
44 | @return $container-columns;
45 | }
46 |
47 | @return $parent-columns;
48 | }
49 |
50 | // Generates a striped background
51 | @function gradient-stops($grid-columns, $color: $visual-grid-color) {
52 | $transparent: rgba(0,0,0,0);
53 |
54 | $column-width: flex-grid(1, $grid-columns);
55 | $gutter-width: flex-gutter($grid-columns);
56 | $column-offset: $column-width;
57 |
58 | $values: ($transparent 0, $color 0);
59 |
60 | @for $i from 1 to $grid-columns*2 {
61 | @if is-even($i) {
62 | $values: append($values, $transparent $column-offset, comma);
63 | $values: append($values, $color $column-offset, comma);
64 | $column-offset: $column-offset + $column-width;
65 | } @else {
66 | $values: append($values, $color $column-offset, comma);
67 | $values: append($values, $transparent $column-offset, comma);
68 | $column-offset: $column-offset + $gutter-width;
69 | }
70 | }
71 |
72 | @return $values;
73 | }
74 |
75 | // Layout direction
76 | @function get-direction($layout, $default) {
77 | $direction: null;
78 |
79 | @if to-upper-case($layout) == "LTR" or to-upper-case($layout) == "RTL" {
80 | $direction: direction-from-layout($layout);
81 | } @else {
82 | $direction: direction-from-layout($default);
83 | }
84 |
85 | @return $direction;
86 | }
87 |
88 | @function direction-from-layout($layout) {
89 | $direction: null;
90 |
91 | @if to-upper-case($layout) == "LTR" {
92 | $direction: right;
93 | } @else {
94 | $direction: left;
95 | }
96 |
97 | @return $direction;
98 | }
99 |
100 | @function get-opposite-direction($direction) {
101 | $opposite-direction: left;
102 |
103 | @if $direction == "left" {
104 | $opposite-direction: right;
105 | }
106 |
107 | @return $opposite-direction;
108 | }
109 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_box-sizing.scss:
--------------------------------------------------------------------------------
1 | @if $border-box-sizing == true {
2 | html { // http://bit.ly/1qk2tVR
3 | @include box-sizing(border-box);
4 | }
5 |
6 | * {
7 | &, &:before, &:after {
8 | @include box-sizing(inherit);
9 | }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_direction-context.scss:
--------------------------------------------------------------------------------
1 | /// Changes the direction property used by other mixins called in the code block argument.
2 | ///
3 | /// @param {String} $direction (left-to-right)
4 | /// Layout direction to be used within the block. Can be `left-to-right` or `right-to-left`.
5 | ///
6 | /// @example scss - Usage
7 | /// @include direction(right-to-left) {
8 | /// .right-to-left-block {
9 | /// @include span-columns(6);
10 | /// }
11 | /// }
12 | ///
13 | /// @example css - CSS Output
14 | /// .right-to-left-block {
15 | /// float: right;
16 | /// ...
17 | /// }
18 |
19 | @mixin direction-context($direction: left-to-right) {
20 | $scope-direction: $layout-direction;
21 |
22 | @if to-lower-case($direction) == "left-to-right" {
23 | $layout-direction: LTR !global;
24 | } @else if to-lower-case($direction) == "right-to-left" {
25 | $layout-direction: RTL !global;
26 | }
27 |
28 | @content;
29 |
30 | $layout-direction: $scope-direction !global;
31 | }
32 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_display-context.scss:
--------------------------------------------------------------------------------
1 | /// Changes the display property used by other mixins called in the code block argument.
2 | ///
3 | /// @param {String} $display (block)
4 | /// Display value to be used within the block. Can be `table` or `block`.
5 | ///
6 | /// @example scss
7 | /// @include display(table) {
8 | /// .display-table {
9 | /// @include span-columns(6);
10 | /// }
11 | /// }
12 | ///
13 | /// @example css
14 | /// .display-table {
15 | /// display: table-cell;
16 | /// ...
17 | /// }
18 |
19 | @mixin display-context($display: block) {
20 | $scope-display: $container-display-table;
21 | $container-display-table: $display == table !global;
22 |
23 | @content;
24 |
25 | $container-display-table: $scope-display !global;
26 | }
27 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_fill-parent.scss:
--------------------------------------------------------------------------------
1 | /// Forces the element to fill its parent container.
2 | ///
3 | /// @example scss - Usage
4 | /// .element {
5 | /// @include fill-parent;
6 | /// }
7 | ///
8 | /// @example css - CSS Output
9 | /// .element {
10 | /// width: 100%;
11 | /// -webkit-box-sizing: border-box;
12 | /// -moz-box-sizing: border-box;
13 | /// box-sizing: border-box;
14 | /// }
15 |
16 | @mixin fill-parent() {
17 | width: 100%;
18 |
19 | @if $border-box-sizing == false {
20 | @include box-sizing(border-box);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_media.scss:
--------------------------------------------------------------------------------
1 | /// Outputs a media-query block with an optional grid context (the total number of columns used in the grid).
2 | ///
3 | /// @param {List} $query
4 | /// A list of media query features and values, where each `$feature` should have a corresponding `$value`.
5 | /// For a list of valid values for `$feature`, click [here](http://www.w3.org/TR/css3-mediaqueries/#media1).
6 | ///
7 | /// If there is only a single `$value` in `$query`, `$default-feature` is going to be used.
8 | ///
9 | /// The number of total columns in the grid can be set by passing `$columns` at the end of the list (overrides `$total-columns`).
10 | ///
11 | ///
12 | /// @param {Number (unitless)} $total-columns ($grid-columns)
13 | /// - Number of columns to use in the new grid context. Can be set as a shorthand in the first parameter.
14 | ///
15 | /// @example scss - Usage
16 | /// .responsive-element {
17 | /// @include media(769px) {
18 | /// @include span-columns(6);
19 | /// }
20 | /// }
21 | ///
22 | /// .new-context-element {
23 | /// @include media(min-width 320px max-width 480px, 6) {
24 | /// @include span-columns(6);
25 | /// }
26 | /// }
27 | ///
28 | /// @example css - CSS Output
29 | /// @media screen and (min-width: 769px) {
30 | /// .responsive-element {
31 | /// display: block;
32 | /// float: left;
33 | /// margin-right: 2.35765%;
34 | /// width: 48.82117%;
35 | /// }
36 | ///
37 | /// .responsive-element:last-child {
38 | /// margin-right: 0;
39 | /// }
40 | /// }
41 | ///
42 | /// @media screen and (min-width: 320px) and (max-width: 480px) {
43 | /// .new-context-element {
44 | /// display: block;
45 | /// float: left;
46 | /// margin-right: 4.82916%;
47 | /// width: 100%;
48 | /// }
49 | ///
50 | /// .new-context-element:last-child {
51 | /// margin-right: 0;
52 | /// }
53 | /// }
54 |
55 | @mixin media($query: $feature $value $columns, $total-columns: $grid-columns) {
56 | @if length($query) == 1 {
57 | @media screen and ($default-feature: nth($query, 1)) {
58 | $default-grid-columns: $grid-columns;
59 | $grid-columns: $total-columns !global;
60 | @content;
61 | $grid-columns: $default-grid-columns !global;
62 | }
63 | }
64 |
65 | @else {
66 | $loop-to: length($query);
67 | $media-query: 'screen and ';
68 | $default-grid-columns: $grid-columns;
69 | $grid-columns: $total-columns !global;
70 |
71 | @if not is-even(length($query)) {
72 | $grid-columns: nth($query, $loop-to) !global;
73 | $loop-to: $loop-to - 1;
74 | }
75 |
76 | $i: 1;
77 | @while $i <= $loop-to {
78 | $media-query: $media-query + '(' + nth($query, $i) + ': ' + nth($query, $i + 1) + ') ';
79 |
80 | @if ($i + 1) != $loop-to {
81 | $media-query: $media-query + 'and ';
82 | }
83 |
84 | $i: $i + 2;
85 | }
86 |
87 | @media #{$media-query} {
88 | @content;
89 | $grid-columns: $default-grid-columns !global;
90 | }
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_omega.scss:
--------------------------------------------------------------------------------
1 | /// Removes the element's gutter margin, regardless of its position in the grid hierarchy or display property. It can target a specific element, or every `nth-child` occurrence. Works only with `block` layouts.
2 | ///
3 | /// @param {List} $query (block)
4 | /// List of arguments. Supported arguments are `nth-child` selectors (targets a specific pseudo element) and `auto` (targets `last-child`).
5 | ///
6 | /// When passed an `nth-child` argument of type `*n` with `block` display, the omega mixin automatically adds a clear to the `*n+1` th element. Note that composite arguments such as `2n+1` do not support this feature.
7 | ///
8 | /// **Deprecation warning**: The omega mixin will no longer take a `$direction` argument. To change the layout direction, use `row($direction)` or set `$default-layout-direction` instead.
9 | ///
10 | /// @example scss - Usage
11 | /// .element {
12 | /// @include omega;
13 | /// }
14 | ///
15 | /// .nth-element {
16 | /// @include omega(4n);
17 | /// }
18 | ///
19 | /// @example css - CSS Output
20 | /// .element {
21 | /// margin-right: 0;
22 | /// }
23 | ///
24 | /// .nth-element:nth-child(4n) {
25 | /// margin-right: 0;
26 | /// }
27 | ///
28 | /// .nth-element:nth-child(4n+1) {
29 | /// clear: left;
30 | /// }
31 |
32 | @mixin omega($query: block, $direction: default) {
33 | $table: belongs-to(table, $query);
34 | $auto: belongs-to(auto, $query);
35 |
36 | @if $direction != default {
37 | @include -neat-warn("The omega mixin will no longer take a $direction argument. To change the layout direction, use the direction(){...} mixin.");
38 | } @else {
39 | $direction: get-direction($layout-direction, $default-layout-direction);
40 | }
41 |
42 | @if $table {
43 | @include -neat-warn("The omega mixin no longer removes padding in table layouts.");
44 | }
45 |
46 | @if length($query) == 1 {
47 | @if $auto {
48 | &:last-child {
49 | margin-#{$direction}: 0;
50 | }
51 | }
52 |
53 | @else if contains-display-value($query) and $table == false {
54 | margin-#{$direction}: 0;
55 | }
56 |
57 | @else {
58 | @include nth-child($query, $direction);
59 | }
60 | }
61 |
62 | @else if length($query) == 2 {
63 | @if $auto {
64 | &:last-child {
65 | margin-#{$direction}: 0;
66 | }
67 | }
68 |
69 | @else {
70 | @include nth-child(nth($query, 1), $direction);
71 | }
72 | }
73 |
74 | @else {
75 | @include -neat-warn("Too many arguments passed to the omega() mixin.");
76 | }
77 | }
78 |
79 | @mixin nth-child($query, $direction) {
80 | $opposite-direction: get-opposite-direction($direction);
81 |
82 | &:nth-child(#{$query}) {
83 | margin-#{$direction}: 0;
84 | }
85 |
86 | @if type-of($query) == number {
87 | &:nth-child(#{$query}+1) {
88 | clear: $opposite-direction;
89 | }
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_outer-container.scss:
--------------------------------------------------------------------------------
1 | /// Makes an element a outer container by centring it in the viewport, clearing its floats, and setting its `max-width`.
2 | /// Although optional, using `outer-container` is recommended. The mixin can be called on more than one element per page, as long as they are not nested.
3 | ///
4 | /// @param {Number (unit)} $local-max-width ($max-width)
5 | /// Max width to be applied to the element. Can be a percentage or a measure.
6 | ///
7 | /// @example scss - Usage
8 | /// .element {
9 | /// @include outer-container(100%);
10 | /// }
11 | ///
12 | /// @example css - CSS Output
13 | /// .element {
14 | /// *zoom: 1;
15 | /// max-width: 100%;
16 | /// margin-left: auto;
17 | /// margin-right: auto;
18 | /// }
19 | ///
20 | /// .element:before, .element:after {
21 | /// content: " ";
22 | /// display: table;
23 | /// }
24 | ///
25 | /// .element:after {
26 | /// clear: both;
27 | /// }
28 |
29 | @mixin outer-container($local-max-width: $max-width) {
30 | @include clearfix;
31 | max-width: $local-max-width;
32 | margin: {
33 | left: auto;
34 | right: auto;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_pad.scss:
--------------------------------------------------------------------------------
1 | /// Adds padding to the element.
2 | ///
3 | /// @param {List} $padding (flex-gutter())
4 | /// A list of padding value(s) to use. Passing `default` in the list will result in using the gutter width as a padding value.
5 | ///
6 | /// @example scss - Usage
7 | /// .element {
8 | /// @include pad(30px -20px 10px default);
9 | /// }
10 | ///
11 | /// @example css - CSS Output
12 | /// .element {
13 | /// padding: 30px -20px 10px 2.35765%;
14 | /// }
15 |
16 | @mixin pad($padding: flex-gutter()) {
17 | $padding-list: null;
18 | @each $value in $padding {
19 | $value: if($value == 'default', flex-gutter(), $value);
20 | $padding-list: join($padding-list, $value);
21 | }
22 | padding: $padding-list;
23 | }
24 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_private.scss:
--------------------------------------------------------------------------------
1 | $parent-columns: $grid-columns !default;
2 | $fg-column: $column;
3 | $fg-gutter: $gutter;
4 | $fg-max-columns: $grid-columns;
5 | $container-display-table: false !default;
6 | $layout-direction: LTR !default;
7 |
8 | @function flex-grid($columns, $container-columns: $fg-max-columns) {
9 | $width: $columns * $fg-column + ($columns - 1) * $fg-gutter;
10 | $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
11 | @return percentage($width / $container-width);
12 | }
13 |
14 | @function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) {
15 | $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
16 | @return percentage($gutter / $container-width);
17 | }
18 |
19 | @function grid-width($n) {
20 | @return $n * $gw-column + ($n - 1) * $gw-gutter;
21 | }
22 |
23 | @function get-parent-columns($columns) {
24 | @if $columns != $grid-columns {
25 | $parent-columns: $columns !global;
26 | } @else {
27 | $parent-columns: $grid-columns !global;
28 | }
29 |
30 | @return $parent-columns;
31 | }
32 |
33 | @function is-display-table($container-is-display-table, $display) {
34 | @return $container-is-display-table == true or $display == table;
35 | }
36 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_row.scss:
--------------------------------------------------------------------------------
1 | /// Designates the element as a row of columns in the grid layout. It clears the floats on the element and sets its display property. Rows can't be nested, but there can be more than one row element—with different display properties—per layout.
2 | ///
3 | /// @param {String} $display (default)
4 | /// Sets the display property of the element and the display context that will be used by its children. Can be `block` or `table`.
5 | ///
6 | /// @param {String} $direction ($default-layout-direction)
7 | /// Sets the layout direction. Can be `LTR` (left-to-right) or `RTL` (right-to-left).
8 | ///
9 | /// @example scss - Usage
10 | /// .element {
11 | /// @include row();
12 | /// }
13 | ///
14 | /// @example css - CSS Output
15 | /// .element {
16 | /// *zoom: 1;
17 | /// display: block;
18 | /// }
19 | ///
20 | /// .element:before, .element:after {
21 | /// content: " ";
22 | /// display: table;
23 | /// }
24 | ///
25 | /// .element:after {
26 | /// clear: both;
27 | /// }
28 |
29 | @mixin row($display: default, $direction: $default-layout-direction) {
30 | @if $direction != $default-layout-direction {
31 | @include -neat-warn("The $direction argument will be deprecated in future versions in favor of the direction(){...} mixin.");
32 | }
33 |
34 | $layout-direction: $direction !global;
35 |
36 | @if $display != default {
37 | @include -neat-warn("The $display argument will be deprecated in future versions in favor of the display(){...} mixin.");
38 | }
39 |
40 | @if $display == table {
41 | display: table;
42 | @include fill-parent;
43 | table-layout: fixed;
44 | $container-display-table: true !global;
45 | }
46 |
47 | @else {
48 | @include clearfix;
49 | display: block;
50 | $container-display-table: false !global;
51 | }
52 | }
53 |
54 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_shift.scss:
--------------------------------------------------------------------------------
1 | /// Translates an element horizontally by a number of columns. Positive arguments shift the element to the active layout direction, while negative ones shift it to the opposite direction.
2 | ///
3 | /// @param {Number (unitless)} $n-columns (1)
4 | /// Number of columns by which the element shifts.
5 | ///
6 | /// @example scss - Usage
7 | /// .element {
8 | /// @include shift(-3);
9 | /// }
10 | ///
11 | /// @example css - CSS output
12 | /// .element {
13 | /// margin-left: -25.58941%;
14 | /// }
15 |
16 | @mixin shift($n-columns: 1) {
17 | @include shift-in-context($n-columns);
18 | }
19 |
20 | /// Translates an element horizontally by a number of columns, in a specific nesting context.
21 | ///
22 | /// @param {List} $shift
23 | /// A list containing the number of columns to shift (`$columns`) and the number of columns of the parent element (`$container-columns`).
24 | ///
25 | /// The two values can be separated with any string such as `of`, `/`, etc.
26 | ///
27 | /// @example scss - Usage
28 | /// .element {
29 | /// @include shift(-3 of 6);
30 | /// }
31 | ///
32 | /// @example css - CSS output
33 | /// .element {
34 | /// margin-left: -52.41458%;
35 | /// }
36 |
37 | @mixin shift-in-context($shift: $columns of $container-columns) {
38 | $n-columns: nth($shift, 1);
39 | $parent-columns: container-shift($shift) !global;
40 |
41 | $direction: get-direction($layout-direction, $default-layout-direction);
42 | $opposite-direction: get-opposite-direction($direction);
43 |
44 | margin-#{$opposite-direction}: $n-columns * flex-grid(1, $parent-columns) + $n-columns * flex-gutter($parent-columns);
45 |
46 | // Reset nesting context
47 | $parent-columns: $grid-columns !global;
48 | }
49 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_span-columns.scss:
--------------------------------------------------------------------------------
1 | /// Specifies the number of columns an element should span. If the selector is nested the number of columns of its parent element should be passed as an argument as well.
2 | ///
3 | /// @param {List} $span
4 | /// A list containing `$columns`, the unitless number of columns the element spans (required), and `$container-columns`, the number of columns the parent element spans (optional).
5 | ///
6 | /// If only one value is passed, it is assumed that it's `$columns` and that that `$container-columns` is equal to `$grid-columns`, the total number of columns in the grid.
7 | ///
8 | /// The values can be separated with any string such as `of`, `/`, etc.
9 | ///
10 | /// @param {String} $display (block)
11 | /// Sets the display property of the element. By default it sets the display propert of the element to `block`.
12 | ///
13 | /// If passed `block-collapse`, it also removes the margin gutter by adding it to the element width.
14 | ///
15 | /// If passed `table`, it sets the display property to `table-cell` and calculates the width of the element without taking gutters into consideration. The result does not align with the block-based grid.
16 | ///
17 | /// @example scss - Usage
18 | /// .element {
19 | /// @include span-columns(6);
20 | ///
21 | /// .nested-element {
22 | /// @include span-columns(2 of 6);
23 | /// }
24 | /// }
25 | ///
26 | /// @example css - CSS Output
27 | /// .element {
28 | /// display: block;
29 | /// float: left;
30 | /// margin-right: 2.35765%;
31 | /// width: 48.82117%;
32 | /// }
33 | ///
34 | /// .element:last-child {
35 | /// margin-right: 0;
36 | /// }
37 | ///
38 | /// .element .nested-element {
39 | /// display: block;
40 | /// float: left;
41 | /// margin-right: 4.82916%;
42 | /// width: 30.11389%;
43 | /// }
44 | ///
45 | /// .element .nested-element:last-child {
46 | /// margin-right: 0;
47 | /// }
48 |
49 | @mixin span-columns($span: $columns of $container-columns, $display: block) {
50 | $columns: nth($span, 1);
51 | $container-columns: container-span($span);
52 |
53 | $parent-columns: get-parent-columns($container-columns) !global;
54 |
55 | $direction: get-direction($layout-direction, $default-layout-direction);
56 | $opposite-direction: get-opposite-direction($direction);
57 |
58 | $display-table: is-display-table($container-display-table, $display);
59 |
60 | @if $display-table {
61 | display: table-cell;
62 | width: percentage($columns / $container-columns);
63 | } @else {
64 | float: #{$opposite-direction};
65 |
66 | @if $display != no-display {
67 | display: block;
68 | }
69 |
70 | @if $display == collapse {
71 | @include -neat-warn("The 'collapse' argument will be deprecated. Use 'block-collapse' instead.");
72 | }
73 |
74 | @if $display == collapse or $display == block-collapse {
75 | width: flex-grid($columns, $container-columns) + flex-gutter($container-columns);
76 |
77 | &:last-child {
78 | width: flex-grid($columns, $container-columns);
79 | }
80 |
81 | } @else {
82 | margin-#{$direction}: flex-gutter($container-columns);
83 | width: flex-grid($columns, $container-columns);
84 |
85 | &:last-child {
86 | margin-#{$direction}: 0;
87 | }
88 | }
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_to-deprecate.scss:
--------------------------------------------------------------------------------
1 | @mixin breakpoint($query:$feature $value $columns, $total-columns: $grid-columns) {
2 | @include -neat-warn("The breakpoint() mixin was renamed to media() in Neat 1.0. Please update your project with the new syntax before the next version bump.");
3 |
4 | @if length($query) == 1 {
5 | @media screen and ($default-feature: nth($query, 1)) {
6 | $default-grid-columns: $grid-columns;
7 | $grid-columns: $total-columns;
8 | @content;
9 | $grid-columns: $default-grid-columns;
10 | }
11 | }
12 |
13 | @else if length($query) == 2 {
14 | @media screen and (nth($query, 1): nth($query, 2)) {
15 | $default-grid-columns: $grid-columns;
16 | $grid-columns: $total-columns;
17 | @content;
18 | $grid-columns: $default-grid-columns;
19 | }
20 | }
21 |
22 | @else if length($query) == 3 {
23 | @media screen and (nth($query, 1): nth($query, 2)) {
24 | $default-grid-columns: $grid-columns;
25 | $grid-columns: nth($query, 3);
26 | @content;
27 | $grid-columns: $default-grid-columns;
28 | }
29 | }
30 |
31 | @else if length($query) == 4 {
32 | @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) {
33 | $default-grid-columns: $grid-columns;
34 | $grid-columns: $total-columns;
35 | @content;
36 | $grid-columns: $default-grid-columns;
37 | }
38 | }
39 |
40 | @else if length($query) == 5 {
41 | @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) {
42 | $default-grid-columns: $grid-columns;
43 | $grid-columns: nth($query, 5);
44 | @content;
45 | $grid-columns: $default-grid-columns;
46 | }
47 | }
48 |
49 | @else {
50 | @include -neat-warn("Wrong number of arguments for breakpoint(). Read the documentation for more details.");
51 | }
52 | }
53 |
54 | @mixin nth-omega($nth, $display: block, $direction: default) {
55 | @include -neat-warn("The nth-omega() mixin is deprecated. Please use omega() instead.");
56 | @include omega($nth $display, $direction);
57 | }
58 |
59 | /// Resets the active display property to `block`. Particularly useful when changing the display property in a single row.
60 | ///
61 | /// @example scss - Usage
62 | /// .element {
63 | /// @include row(table);
64 | /// // Context changed to table display
65 | /// }
66 | ///
67 | /// @include reset-display;
68 | /// // Context is reset to block display
69 |
70 | @mixin reset-display {
71 | $container-display-table: false !global;
72 | @include -neat-warn("Resetting $display will be deprecated in future versions in favor of the display(){...} mixin.");
73 | }
74 |
75 | /// Resets the active layout direction to the default value set in `$default-layout-direction`. Particularly useful when changing the layout direction in a single row.
76 | ///
77 | /// @example scss - Usage
78 | /// .element {
79 | /// @include row($direction: RTL);
80 | /// // Context changed to right-to-left
81 | /// }
82 | ///
83 | /// @include reset-layout-direction;
84 | /// // Context is reset to left-to-right
85 |
86 | @mixin reset-layout-direction {
87 | $layout-direction: $default-layout-direction !global;
88 | @include -neat-warn("Resetting $direction will be deprecated in future versions in favor of the direction(){...} mixin.");
89 | }
90 |
91 | /// Resets both the active layout direction and the active display property.
92 | ///
93 | /// @example scss - Usage
94 | /// .element {
95 | /// @include row(table, RTL);
96 | /// // Context changed to table table and right-to-left
97 | /// }
98 | ///
99 | /// @include reset-all;
100 | /// // Context is reset to block display and left-to-right
101 |
102 | @mixin reset-all {
103 | @include reset-display;
104 | @include reset-layout-direction;
105 | }
106 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/grid/_visual-grid.scss:
--------------------------------------------------------------------------------
1 | @mixin grid-column-gradient($values...) {
2 | background-image: -webkit-linear-gradient(left, $values);
3 | background-image: -moz-linear-gradient(left, $values);
4 | background-image: -ms-linear-gradient(left, $values);
5 | background-image: -o-linear-gradient(left, $values);
6 | background-image: unquote("linear-gradient(to left, #{$values})");
7 | }
8 |
9 | @if $visual-grid == true or $visual-grid == yes {
10 | body:before {
11 | content: '';
12 | display: inline-block;
13 | @include grid-column-gradient(gradient-stops($grid-columns));
14 | height: 100%;
15 | left: 0;
16 | margin: 0 auto;
17 | max-width: $max-width;
18 | opacity: $visual-grid-opacity;
19 | position: fixed;
20 | right: 0;
21 | width: 100%;
22 | pointer-events: none;
23 |
24 | @if $visual-grid-index == back {
25 | z-index: -1;
26 | }
27 |
28 | @else if $visual-grid-index == front {
29 | z-index: 9999;
30 | }
31 |
32 | @each $breakpoint in $visual-grid-breakpoints {
33 | @if $breakpoint {
34 | @include media($breakpoint) {
35 | @include grid-column-gradient(gradient-stops($grid-columns));
36 | }
37 | }
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/settings/_disable-warnings.scss:
--------------------------------------------------------------------------------
1 | /// Disable all deprecation warnings. Defaults to `false`. Set with a `!global` flag.
2 | ///
3 | /// @type Bool
4 |
5 | $disable-warnings: false !default;
6 |
7 | @mixin -neat-warn($message) {
8 | @if $disable-warnings == false {
9 | @warn "#{$message}";
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/settings/_grid.scss:
--------------------------------------------------------------------------------
1 | /// Sets the relative width of a single grid column. The unit used should be the same one used to define `$gutter`. To learn more about golden-ratio() see [Bourbon docs](http://bourbon.io/docs/#golden-ratio). Set with a `!global` flag.
2 | ///
3 | /// @type Number (Unit)
4 |
5 | $column: golden-ratio(1em, 3) !default;
6 |
7 | /// Sets the relative width of a single grid gutter. The unit used should be the same one used to define `$column`. To learn more about golden-ratio() see [Bourbon docs](http://bourbon.io/docs/#golden-ratio). Set with the `!global` flag.
8 | ///
9 | /// @type Number (Unit)
10 |
11 | $gutter: golden-ratio(1em, 1) !default;
12 |
13 | /// Sets the total number of columns in the grid. Its value can be overridden inside a media query using the `media()` mixin. Set with the `!global` flag.
14 | ///
15 | /// @type Number (Unitless)
16 |
17 | $grid-columns: 12 !default;
18 |
19 | /// Sets the max-width property of the element that includes `outer-container()`. To learn more about `em()` see [Bourbon docs](http://bourbon.io/docs/#px-to-em). Set with the `!global` flag.
20 | ///
21 | /// @type Number (Unit)
22 | ///
23 | $max-width: em(1088) !default;
24 |
25 | /// When set to true, it sets the box-sizing property of all elements to `border-box`. Set with a `!global` flag.
26 | ///
27 | /// @type Bool
28 | ///
29 | /// @example css - CSS Output
30 | /// html {
31 | /// -webkit-box-sizing: border-box;
32 | /// -moz-box-sizing: border-box;
33 | /// box-sizing: border-box; }
34 | ///
35 | /// *, *:before, *:after {
36 | /// -webkit-box-sizing: inherit;
37 | /// -moz-box-sizing: inherit;
38 | /// box-sizing: inherit;
39 | /// }
40 |
41 | $border-box-sizing: true !default;
42 |
43 | /// Sets the default [media feature](http://www.w3.org/TR/css3-mediaqueries/#media) that `media()` and `new-breakpoint()` revert to when only a breakpoint value is passed. Set with a `!global` flag.
44 | ///
45 | /// @type String
46 |
47 | $default-feature: min-width; // Default @media feature for the breakpoint() mixin
48 |
49 | ///Sets the default layout direction of the grid. Can be `LTR` or `RTL`. Set with a `!global` flag.
50 | ///
51 | ///@type String
52 |
53 | $default-layout-direction: LTR !default;
54 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/neat/settings/_visual-grid.scss:
--------------------------------------------------------------------------------
1 | /// Displays the visual grid when set to true. The overlaid grid may be few pixels off depending on the browser's rendering engine and pixel rounding algorithm. Set with the `!global` flag.
2 | ///
3 | /// @type Bool
4 |
5 | $visual-grid: false !default;
6 |
7 | /// Sets the visual grid color. Set with `!global` flag.
8 | ///
9 | /// @type Color
10 |
11 | $visual-grid-color: #EEE !default;
12 |
13 | /// Sets the `z-index` property of the visual grid. Can be `back` (behind content) or `front` (in front of content). Set with `!global` flag.
14 | ///
15 | /// @type String
16 |
17 | $visual-grid-index: back !default;
18 |
19 | /// Sets the opacity property of the visual grid. Set with `!global` flag.
20 | ///
21 | /// @type Number (unitless)
22 |
23 | $visual-grid-opacity: 0.4 !default;
24 |
25 | $visual-grid-breakpoints: () !default;
26 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/refills/_base.scss:
--------------------------------------------------------------------------------
1 | @import 'centered_navigation';
2 | @import 'button_group';
3 | @import 'pagination';
4 | @import 'footer';
5 | @import 'flashes';
--------------------------------------------------------------------------------
/assets/_sass/vendor/refills/_button_group.scss:
--------------------------------------------------------------------------------
1 | .button-group {
2 | ///////////////////////////////////////////////////////////////////////////////////
3 | $base-border-color: gainsboro !default;
4 | $base-border-radius: 3px !default;
5 | $base-line-height: 1.5em !default;
6 | $base-spacing: 1.5em !default;
7 | $base-font-size: 1em !default;
8 | $base-background-color: white !default;
9 | $base-accent-color: #477DCA !default;
10 | $base-link-color: $base-accent-color !default;
11 | $dark-gray: #333 !default;
12 | $large-screen: em(860) !default;
13 | $base-font-color: $dark-gray !default;
14 | //////////////////////////////////////////////////////////////////////////////////
15 |
16 | $button-group-background: #EDEDED;
17 | $button-group-color: #666;
18 | $button-group-border: 1px solid silver;
19 | $button-group-inner-border: 1px solid lighten(silver, 18%);
20 | $button-group-background-checked: $base-accent-color;
21 | $button-group-color-checked: white;
22 | $button-group-border-checked: darken($button-group-background-checked, 15%);
23 |
24 | margin-bottom: 0;
25 |
26 | button {
27 | background: $button-group-background;
28 | border-left: $button-group-border;
29 | border-radius: 0;
30 | border-right: $button-group-border;
31 | color: $button-group-color;
32 | cursor: pointer;
33 | display: inline-block;
34 | font-size: $base-font-size;
35 | font-weight: normal;
36 | line-height: 1;
37 | padding: 0.75em 1em;
38 | width: 100%;
39 | outline: none;
40 |
41 | &:focus,
42 | &:hover {
43 | background-color: darken($button-group-background, 3%);
44 | }
45 |
46 | &:first-child {
47 | border-top-left-radius: $base-border-radius;
48 | border-top-right-radius: $base-border-radius;
49 | border-top: $button-group-border;
50 | }
51 |
52 | &:last-child {
53 | border-bottom-left-radius: $base-border-radius;
54 | border-bottom-right-radius: $base-border-radius;
55 | border-bottom: $button-group-border;
56 | }
57 |
58 | &.selected {
59 | background: $button-group-background-checked;
60 | border: 1px solid $button-group-border-checked;
61 | box-shadow: inset 0 1px 2px darken($button-group-background-checked, 10%);
62 | color: $button-group-color-checked;
63 | }
64 | }
65 |
66 | &.horizontal {
67 | @include media($large-screen) {
68 | button {
69 | border-bottom: $button-group-border;
70 | border-left: 0;
71 | border-right: $button-group-inner-border;
72 | border-top: $button-group-border;
73 | width: auto;
74 |
75 | &:first-child {
76 | border-bottom-left-radius: $base-border-radius;
77 | border-left: $button-group-border;
78 | border-top-left-radius: $base-border-radius;
79 | border-top-right-radius: 0;
80 | }
81 |
82 | &:last-child {
83 | border-bottom-left-radius: 0;
84 | border-bottom-right-radius: $base-border-radius;
85 | border-right: $button-group-border;
86 | border-top-right-radius: $base-border-radius;
87 | }
88 | }
89 | }
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/refills/_centered_navigation.scss:
--------------------------------------------------------------------------------
1 | #nav {
2 | ///////////////////////////////////////////////////////////////////////////////////
3 | $base-border-radius: 3px !default;
4 | $dark-gray: #333 !default;
5 | $large-screen: em(860) !default;
6 | $base-font-color: $dark-gray !default;
7 | //////////////////////////////////////////////////////////////////////////////////
8 |
9 | $nav-padding: 1em;
10 | $nav-logo-height: 2em;
11 | $nav-background: #E8E8E8;
12 | $nav-color: transparentize($base-font-color, 0.3);
13 | $nav-color-hover: $base-font-color;
14 | $nav-height: 60px;
15 | $nav-item-padding: 1em;
16 | $nav-submenu-padding: 1em;
17 | $nav-submenu-width: 12em;
18 | $nav-item-nudge: 2.2em;
19 | $horizontal-bar-mode: $large-screen;
20 |
21 | background-color: #FFFFFF;
22 | border-bottom: 5px solid #F5F5F5;
23 | min-height: $nav-height;
24 | width: 100%;
25 | z-index: 9999;
26 |
27 | #mobile-logo {
28 | display: inline;
29 | float: left;
30 | max-height: $nav-height;
31 | padding-left: $nav-padding;
32 |
33 | img {
34 | max-height: $nav-height;
35 | opacity: .6;
36 | padding: .8em 0;
37 | }
38 |
39 | @include media($horizontal-bar-mode) {
40 | display: none;
41 | }
42 | }
43 |
44 | #nav-mobile-menu {
45 | color: $nav-color;
46 | display: block;
47 | float: right;
48 | font-weight: 700;
49 | line-height: $nav-height;
50 | margin: 0;
51 | padding-right: $nav-submenu-padding;
52 | text-decoration: none;
53 | text-transform: uppercase;
54 | cursor: pointer;
55 |
56 | @include media ($horizontal-bar-mode) {
57 | display: none;
58 | }
59 |
60 | &:focus,
61 | &:hover {
62 | color: $nav-color-hover;
63 | }
64 | }
65 |
66 | #nav-wrapper {
67 | @include outer-container;
68 | @include clearfix;
69 | position: relative;
70 | z-index: 999;
71 | }
72 |
73 | #nav-menu {
74 | -webkit-transform-style: preserve-3d; // stop webkit flicker
75 | clear: both;
76 | display: none;
77 | margin: 0 auto;
78 | overflow: visible;
79 | padding: 0;
80 | width: 100%;
81 | z-index: 99999;
82 |
83 | @include media ($horizontal-bar-mode) {
84 | display: block;
85 | text-align: center;
86 | }
87 | }
88 |
89 | .nav-link:first-child {
90 | @include media($horizontal-bar-mode) {
91 | margin-left: $nav-item-nudge;
92 | }
93 | }
94 |
95 | .nav-link {
96 | background: $nav-background;
97 | display: block;
98 | line-height: $nav-height;
99 | overflow: hidden;
100 | padding-right: $nav-submenu-padding;
101 | text-align: right;
102 | width: 100%;
103 | z-index: 9999;
104 |
105 | a {
106 | color: $nav-color;
107 | display: inline-block;
108 | outline: none;
109 | text-decoration: none;
110 |
111 | &:focus,
112 | &:hover {
113 | color: $nav-color-hover;
114 | }
115 | }
116 |
117 | @include media($horizontal-bar-mode) {
118 | background: transparent;
119 | display: inline;
120 | line-height: $nav-height;
121 |
122 | a {
123 | padding-right: $nav-item-padding;
124 | }
125 | }
126 | }
127 |
128 | li.logo.nav-link {
129 | display: none;
130 | line-height: 0;
131 |
132 | @include media($large-screen) {
133 | display: inline;
134 | }
135 | }
136 |
137 | .logo img {
138 | margin-bottom: -$nav-logo-height / 3;
139 | max-height: $nav-logo-height;
140 | opacity: 0.6;
141 | }
142 | }
143 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/refills/_flashes.scss:
--------------------------------------------------------------------------------
1 | $base-spacing: 1.5em !default;
2 | $alert-color: #fff6bf !default;
3 | $error-color: #fbe3e4 !default;
4 | $notice-color: #e5edf8 !default;
5 | $success-color: #e6efc2 !default;
6 |
7 | @mixin flash($color) {
8 | background-color: $color;
9 | color: darken($color, 60%);
10 | display: block;
11 | font-weight: 600;
12 | margin-bottom: $base-spacing / 2;
13 | padding: $base-spacing / 2;
14 | text-align: center;
15 |
16 | a {
17 | color: darken($color, 70%);
18 | text-decoration: underline;
19 |
20 | &:focus,
21 | &:hover {
22 | color: darken($color, 90%);
23 | }
24 | }
25 | }
26 |
27 | .flash-alert {
28 | @include flash($alert-color);
29 | }
30 |
31 | .flash-error {
32 | @include flash($error-color);
33 | }
34 |
35 | .flash-notice {
36 | @include flash($notice-color);
37 | }
38 |
39 | .flash-success {
40 | @include flash($success-color);
41 | }
42 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/refills/_footer.scss:
--------------------------------------------------------------------------------
1 | .wrapper-for-content-outside-of-footer {
2 | min-height: 100%;
3 | height: auto !important;
4 | height: 100%;
5 | margin: 0 auto -4em;
6 | }
7 |
8 | html, body {
9 | height: 100%;
10 | }
11 |
12 | .wrapper-for-content-outside-of-footer:after {
13 | content: "";
14 | display: block;
15 | }
16 |
17 | .footer-2, .wrapper-for-content-outside-of-footer:after {
18 | height: 17em;
19 |
20 | @include media($large-screen) {
21 | height: 4em;
22 | }
23 | }
24 |
25 | .footer-2 {
26 | ///////////////////////////////////////////////////////////////////////////////////
27 | $base-spacing: 1.5em !default;
28 | $base-accent-color: #477DCA !default;
29 | $medium-screen: em(640) !default;
30 | $large-screen: em(860) !default;
31 |
32 | ul {
33 | margin: 0;
34 | padding: 0;
35 | line-height: 1.5em;
36 | }
37 |
38 | li {
39 | list-style: none;
40 | }
41 |
42 | a {
43 | text-decoration: none;
44 | }
45 | //////////////////////////////////////////////////////////////////////////////////
46 |
47 | $footer-background: desaturate(darken($base-accent-color, 20%), 30%);
48 | $footer-color: white;
49 | $footer-link-color: transparentize($footer-color, 0.6);
50 | $footer-disclaimer-color: transparentize($footer-color, 0.6);
51 |
52 | background: $footer-background;
53 | padding: $base-spacing;
54 | width: 100%;
55 | display: inline-block;
56 |
57 | .footer-logo {
58 | margin-right: 1em;
59 | margin-bottom: 1em;
60 |
61 | @include media($large-screen) {
62 | float: left;
63 | margin-bottom: 0;
64 | }
65 | }
66 |
67 | .footer-logo img {
68 | height: 1.6em;
69 | }
70 |
71 | ul {
72 | margin-bottom: 1em;
73 |
74 | @include media($large-screen) {
75 | float: left;
76 | line-height: 1.8em;
77 | margin-left: 1em;
78 | margin-bottom: 0;
79 | }
80 | }
81 |
82 | ul li {
83 | font-weight: 800;
84 | padding-right: 1em;
85 |
86 | @include media($large-screen) {
87 | display: inline;
88 | text-align: left;
89 | }
90 | }
91 |
92 | ul li a {
93 | color: $footer-link-color;
94 |
95 | &:focus,
96 | &:hover {
97 | color: transparentize($footer-color, 0);
98 | }
99 | }
100 |
101 | .footer-secondary-links {
102 | @include media($large-screen) {
103 | float: right;
104 | }
105 |
106 | li {
107 | font-size: 0.8em;
108 | font-weight: 400;
109 | }
110 |
111 | ul.footer-social {
112 | margin-top: 1em;
113 |
114 | @include media($large-screen) {
115 | float: right;
116 | margin-top: 0;
117 | }
118 |
119 | li {
120 | font-size: 1em;
121 | float: left;
122 | line-height: 0;
123 | padding-right: 0.7em;
124 |
125 | &:last-child {
126 | padding-right: 0;
127 | }
128 | }
129 |
130 | img {
131 | height: 1.6em;
132 | opacity: 0.7;
133 | padding: 1px;
134 |
135 | &:focus,
136 | &:hover {
137 | opacity: 1;
138 | }
139 | }
140 | }
141 | }
142 | }
143 |
--------------------------------------------------------------------------------
/assets/_sass/vendor/refills/_pagination.scss:
--------------------------------------------------------------------------------
1 | #pagination {
2 | ///////////////////////////////////////////////////////////////////////////////////
3 | $base-border-color: gainsboro !default;
4 | $base-border-radius: 3px !default;
5 | $base-spacing: 1.5em !default;
6 | $base-accent-color: #477DCA !default;
7 | $base-link-color: $base-accent-color !default;
8 | $dark-gray: #333 !default;
9 | $large-screen: em(860) !default;
10 | $base-font-color: $dark-gray !default;
11 |
12 | ul {
13 | margin: 0;
14 | padding: 0;
15 | }
16 |
17 | li {
18 | list-style: none;
19 | }
20 |
21 | a {
22 | text-decoration: none;
23 | }
24 | //////////////////////////////////////////////////////////////////////////////////
25 |
26 | $pagination-border-color: $base-border-color;
27 | $pagination-border: 1px solid $pagination-border-color;
28 | $pagination-background: lighten($pagination-border-color, 10);
29 | $pagination-hover-background: lighten($pagination-background, 5);
30 | $pagination-color: $base-font-color;
31 |
32 | text-align: center;
33 |
34 | ul {
35 | display: inline;
36 | text-align: center;
37 |
38 | li {
39 | display: inline;
40 | }
41 |
42 | ul li {
43 | display: none;
44 |
45 | &:nth-child(1),
46 | &:nth-child(2),
47 | &:nth-child(3) {
48 | display: inline;
49 | }
50 |
51 | @include media($large-screen) {
52 | display: inline;
53 | }
54 | }
55 |
56 | li a {
57 | @include transition (all 0.2s ease-in-out);
58 | background: $pagination-background;
59 | border-radius: $base-border-radius;
60 | border: $pagination-border;
61 | color: $pagination-color;
62 | outline: none;
63 | padding: ($base-spacing / 4) ($gutter / 2);
64 |
65 | &:hover {
66 | background: $pagination-hover-background;
67 | color: $base-link-color;
68 | }
69 |
70 | &:active {
71 | background: $pagination-background;
72 | }
73 |
74 | &.selected {
75 | background-color: $pagination-border-color;
76 |
77 | &:hover,
78 | &:focus {
79 | color: $pagination-color;
80 | }
81 | }
82 | }
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/assets/app.js:
--------------------------------------------------------------------------------
1 | ---
2 | ---
3 |
4 | {% include_relative _js/compiled.js %}
5 |
6 | // Settings
7 | accounting.settings.currency = {{ site.accounting | replace: '=>', ':' }};
8 | PAYMILL_PUBLIC_KEY = '{{ site.paymillPublicKey }}';
9 | JSE.Actions.setTrackingId({ id: '{{ site.tracking_id }}' });
10 | JSE.Actions.setAddress({{ site.defaultAddress | replace: '=>', ':' }});
11 | JSE.Actions.setPaymentOptions({{ site.payment | replace: '=>', ':' }});
12 |
13 | // Data
14 | loadJSON('{{ site.baseurl }}/products.json', function(products){
15 | JSE.Actions.loadProducts({ products: products });
16 | });
17 |
18 | JSE.Actions.loadCountries({
19 | countries: {{ site.data.countries | replace: '=>', ':' }}
20 | });
21 |
22 | JSE.Actions.loadDeliveryMethods({
23 | methods: {{ site.data.delivery-methods | replace: '=>', ':' }}
24 | });
25 |
--------------------------------------------------------------------------------
/assets/app.scss:
--------------------------------------------------------------------------------
1 | ---
2 | layout: compress
3 | ---
4 | @charset 'utf-8';
5 | @import 'vendor/normalize';
6 |
7 | @import 'vendor/bourbon/bourbon';
8 | @import 'vendor/base/base';
9 | @import 'vendor/neat/neat';
10 | @import 'vendor/refills/base';
11 | @import 'vendor/omega-reset';
12 |
13 | @import 'vendor/font-awesome/font-awesome';
14 |
15 | @import 'shared/layout';
16 | @import 'shared/product';
17 | @import 'shared/yotpo';
18 | @import 'pages/index';
19 | @import 'pages/product';
20 | @import 'pages/basket';
21 | @import 'pages/checkout';
22 | @import 'pages/thankyou';
23 | @import 'pages/favourites';
24 | @import 'pages/blog';
25 | @import 'pages/post';
26 |
27 |
--------------------------------------------------------------------------------
/json/countries.json:
--------------------------------------------------------------------------------
1 | ---
2 | layout: compress
3 | permalink: /countries.json
4 | ---
5 |
6 | {{ site.data.countries | replace: '=>', ':' }}
7 |
--------------------------------------------------------------------------------
/json/delivery-methods.json:
--------------------------------------------------------------------------------
1 | ---
2 | layout: compress
3 | permalink: /delivery-methods.json
4 | ---
5 |
6 | {{ site.data.delivery-methods | replace: '=>', ':' }}
7 |
--------------------------------------------------------------------------------
/json/products.json:
--------------------------------------------------------------------------------
1 | ---
2 | layout: compress
3 | permalink: /products.json
4 | ---
5 |
6 | [
7 | {% for product in site.products %}
8 | {
9 | "name": "{{ product.name }}",
10 | "price": {{ product.price }},
11 | "weight": {{ product.weight }},
12 | "designer": "{{ product.designer }}",
13 | "type": "{{ product.type }}",
14 | "condition": "{{ product.condition }}",
15 | "image": "{{ product.image }}",
16 | "big_image": "{{ product.big_image }}",
17 | "url": "{{ product.url }}"
18 | }
19 | {% if forloop.last %}{% else %},{% endif %}
20 | {% endfor %}
21 | ]
22 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jekyll-store-front",
3 | "description": "Jekyll Frontend for the Jekyll-Store ecommerce solution",
4 | "scripts": {
5 | "watch": "watchify -t reactify ./assets/_js/index.js -o ./assets/_js/compiled.js -v",
6 | "build": "browserify -t reactify ./assets/_js/index.js | uglifyjs -c -m > ./assets/_js/compiled.js",
7 | "serve": "bundle exec jekyll serve --baseurl ''"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "https://github.com/jekyll-store/front.git"
12 | },
13 | "author": "Max White",
14 | "license": "ISC",
15 | "bugs": {
16 | "url": "https://github.com/jekyll-store/front/issues"
17 | },
18 | "homepage": "https://github.com/jekyll-store/front",
19 | "dependencies": {
20 | "accounting": "^0.4.1",
21 | "big.js": "^3.0.1",
22 | "browserify": "^11.0.1",
23 | "jekyll-store-display": "0.1.0",
24 | "jekyll-store-engine": "0.3.2",
25 | "jekyll-store-favourites": "0.2.0",
26 | "jekyll-store-google-analytics": "0.0.2",
27 | "jekyll-store-visited": "0.1.0",
28 | "react": "^0.13.1",
29 | "reactify": "^1.1.0",
30 | "reflux": "^0.2.7",
31 | "spin.js": "^2.0.2",
32 | "superagent": "^1.2.0",
33 | "uglifyjs": "^2.4.10",
34 | "watchify": "^3.1.1"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/pages/basket.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | permalink: /basket/
4 | title: Basket
5 | ---
6 |
7 |
8 |
--------------------------------------------------------------------------------
/pages/blog.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | permalink: /blog/
4 | title: Blog
5 | ---
6 |
7 |
8 |
19 |
--------------------------------------------------------------------------------
/pages/checkout.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | permalink: /checkout/
4 | title: Checkout
5 | ---
6 |
7 |
8 | Checkout
9 |
10 |
44 |
45 |
--------------------------------------------------------------------------------
/pages/favourites.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | permalink: /favourites/
4 | title: Favourites
5 | ---
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/pages/index.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | permalink: /
4 | title: Home
5 | ---
6 |
7 |
8 |
9 | Filters
10 |
11 |
12 |
15 |
18 |
21 |
25 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/pages/thankyou.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | permalink: /thankyou/
4 | title: Thank You
5 | ---
6 |
7 |
8 |
9 | Thank You
10 |
11 | Your purchase was successfully processed.
12 | A confirmation email will be sent to you via email.
13 |
14 |
--------------------------------------------------------------------------------