├── .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 %}{% 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 | 16 | 17 |
18 | {{ content }} 19 |
20 | 21 | 22 |
23 | 36 | 37 |
-------------------------------------------------------------------------------- /_layouts/product.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
8 |
9 |

{{ page.name }}

10 |

11 | £ 12 | {{ page.price }} 13 |

14 |
15 |
16 | 35 |
36 | {{ page.name | escape }} 38 |
39 |
{{ content }}
40 |
41 |
42 |
43 |
48 |
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 |
16 | 19 | 20 |
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 | 17 | 18 | { 19 | Object.keys(this.state.basket).map(function(name, i) { 20 | return ; 21 | }, this) 22 | } 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
ProductPriceQuatityCost
Item Total
{money(this.state.order.totals.price)}
Checkout
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 | {item.name} 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 | Cart 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 | 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 | 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 | 13 | { 14 | this.state.order.adjustments.asMutable().map(function(adjustment, i) { 15 | return( 16 | 17 | 18 | 19 | 20 | ); 21 | }) 22 | } 23 | 24 | 25 |
Item Total{money(this.state.order.totals.price)}
{adjustment.label}{money(adjustment.amount)}
Total{money(this.state.order.totals.order)}
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 | {product.name} 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 | 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 | 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 | 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 |
    11 |
    12 |
    13 | 14 | 15 | 17 | 19 | 20 | 21 |
    22 | 24 |
    25 |
    26 |
    27 |
    28 |
    29 |
    30 |

    This is demo site. Please use one of the following test card numbers:

    31 |
      32 |
    • 4111111111111111
    • 33 |
    • 5500000000000004
    • 34 |
    35 |
    36 |
    37 |
    38 |
    39 |
    40 | 41 |
    42 |
    43 |
    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 | 31 |
    32 | 33 |
    -------------------------------------------------------------------------------- /pages/thankyou.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | permalink: /thankyou/ 4 | title: Thank You 5 | --- 6 | 7 |
    8 | Logo 9 |

    Thank You

    10 |

    11 | Your purchase was successfully processed. 12 | A confirmation email will be sent to you via email. 13 |

    14 |
    --------------------------------------------------------------------------------