solidify 0.0.1.alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +40 -0
  5. data/.travis.yml +10 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/Gemfile +3 -0
  8. data/Guardfile +51 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +75 -0
  11. data/Rakefile +42 -0
  12. data/app/controllers/concerns/solidify/liquid.rb +26 -0
  13. data/app/controllers/solidify/addresses_controller.rb +15 -0
  14. data/app/controllers/solidify/carts_controller.rb +15 -0
  15. data/app/controllers/solidify/collections_controller.rb +26 -0
  16. data/app/controllers/solidify/customers_controller.rb +16 -0
  17. data/app/controllers/solidify/home_controller.rb +15 -0
  18. data/app/controllers/solidify/liquid_controller.rb +25 -0
  19. data/app/controllers/solidify/orders_controller.rb +19 -0
  20. data/app/controllers/solidify/pages_controller.rb +22 -0
  21. data/app/controllers/solidify/products_controller.rb +34 -0
  22. data/app/controllers/solidify/registrations_controller.rb +25 -0
  23. data/app/controllers/solidify/responders/solidify/liquid_responder.rb +29 -0
  24. data/app/controllers/solidify/search_controller.rb +41 -0
  25. data/app/controllers/solidify/sessions_controller.rb +15 -0
  26. data/app/drops/rails_settings/scoped_settings_drop.rb +11 -0
  27. data/app/drops/solidify/errors_drop.rb +14 -0
  28. data/app/drops/solidify/link_drop.rb +15 -0
  29. data/app/drops/solidify/link_list_drop.rb +7 -0
  30. data/app/drops/solidify/nil_drop.rb +7 -0
  31. data/app/drops/solidify/page_drop.rb +7 -0
  32. data/app/drops/solidify/search_drop.rb +7 -0
  33. data/app/drops/spree/address_drop.rb +28 -0
  34. data/app/drops/spree/image_drop.rb +32 -0
  35. data/app/drops/spree/line_item_drop.rb +98 -0
  36. data/app/drops/spree/option_type_drop.rb +4 -0
  37. data/app/drops/spree/order_drop.rb +64 -0
  38. data/app/drops/spree/product_drop.rb +97 -0
  39. data/app/drops/spree/taxon_drop.rb +53 -0
  40. data/app/drops/spree/user_drop.rb +54 -0
  41. data/app/drops/spree/variant_drop.rb +111 -0
  42. data/app/fields/spree/address_fields.rb +18 -0
  43. data/app/fields/spree/image_fields.rb +12 -0
  44. data/app/fields/spree/line_item_fields.rb +21 -0
  45. data/app/fields/spree/order_fields.rb +22 -0
  46. data/app/fields/spree/product_fields.rb +22 -0
  47. data/app/fields/spree/taxon_fields.rb +18 -0
  48. data/app/fields/spree/user_fields.rb +14 -0
  49. data/app/fields/spree/variant_fields.rb +19 -0
  50. data/app/filters/solidify/additional_filters.rb +22 -0
  51. data/app/filters/solidify/html_filters.rb +16 -0
  52. data/app/filters/solidify/money_filters.rb +39 -0
  53. data/app/filters/solidify/string_filters.rb +47 -0
  54. data/app/filters/solidify/url_filters.rb +59 -0
  55. data/app/helpers/solidify/liquid_helper.rb +111 -0
  56. data/app/helpers/solidify/shop_helper.rb +7 -0
  57. data/app/models/concerns/solidify/address.rb +15 -0
  58. data/app/models/concerns/solidify/full_name.rb +11 -0
  59. data/app/models/concerns/solidify/handle.rb +25 -0
  60. data/app/models/concerns/solidify/inventory_policy.rb +7 -0
  61. data/app/models/concerns/solidify/validation_cancel.rb +33 -0
  62. data/app/models/concerns/spree/order_state.rb +19 -0
  63. data/app/models/solidify/asset.rb +12 -0
  64. data/app/models/solidify/link.rb +10 -0
  65. data/app/models/solidify/link_list.rb +7 -0
  66. data/app/models/solidify/page.rb +5 -0
  67. data/app/models/solidify/setting.rb +8 -0
  68. data/app/models/solidify/theme.rb +19 -0
  69. data/app/models/spree/address_decorator.rb +13 -0
  70. data/app/models/spree/image_decorator.rb +7 -0
  71. data/app/models/spree/line_item_decorator.rb +7 -0
  72. data/app/models/spree/order_decorator.rb +10 -0
  73. data/app/models/spree/product_decorator.rb +8 -0
  74. data/app/models/spree/taxon_decorator.rb +20 -0
  75. data/app/models/spree/user_decorator.rb +9 -0
  76. data/app/models/spree/variant_decorator.rb +11 -0
  77. data/app/poro/solidify/search.rb +14 -0
  78. data/app/services/solidify/app_specific_string_io.rb +15 -0
  79. data/app/services/solidify/asset_compiler.rb +11 -0
  80. data/app/services/solidify/asset_postprocessor.rb +53 -0
  81. data/app/services/solidify/collections_all_builder.rb +12 -0
  82. data/app/services/solidify/link_list_seeder.rb +26 -0
  83. data/app/services/solidify/liquid_asset_compiler.rb +19 -0
  84. data/app/services/solidify/scss_asset_compiler.rb +15 -0
  85. data/app/services/solidify/shop_settings_seeder.rb +26 -0
  86. data/app/services/solidify/theme_mechanic.rb +30 -0
  87. data/app/uploaders/solidify/asset_uploader.rb +10 -0
  88. data/app/views/solidify/global/content_for_header.html.erb +0 -0
  89. data/app/views/solidify/themes/skeleton-theme/README.md +54 -0
  90. data/app/views/solidify/themes/skeleton-theme/assets/arrow-down.svg.liquid +3 -0
  91. data/app/views/solidify/themes/skeleton-theme/assets/cart.svg.liquid +4 -0
  92. data/app/views/solidify/themes/skeleton-theme/assets/shop.js.liquid +75 -0
  93. data/app/views/solidify/themes/skeleton-theme/assets/shopify_common.js +14 -0
  94. data/app/views/solidify/themes/skeleton-theme/assets/style.scss.liquid +768 -0
  95. data/app/views/solidify/themes/skeleton-theme/config/settings.html +217 -0
  96. data/app/views/solidify/themes/skeleton-theme/config/settings_data.json +26 -0
  97. data/app/views/solidify/themes/skeleton-theme/layout/theme.liquid +181 -0
  98. data/app/views/solidify/themes/skeleton-theme/snippets/article-grid-item.liquid +73 -0
  99. data/app/views/solidify/themes/skeleton-theme/snippets/collection-grid-item.liquid +46 -0
  100. data/app/views/solidify/themes/skeleton-theme/snippets/collection-listing.liquid +46 -0
  101. data/app/views/solidify/themes/skeleton-theme/snippets/open-graph-tags.liquid +35 -0
  102. data/app/views/solidify/themes/skeleton-theme/snippets/product-grid-item.liquid +70 -0
  103. data/app/views/solidify/themes/skeleton-theme/snippets/site-nav.liquid +57 -0
  104. data/app/views/solidify/themes/skeleton-theme/snippets/social-links.liquid +42 -0
  105. data/app/views/solidify/themes/skeleton-theme/snippets/twitter-card.liquid +41 -0
  106. data/app/views/solidify/themes/skeleton-theme/templates/404.liquid +2 -0
  107. data/app/views/solidify/themes/skeleton-theme/templates/article.liquid +160 -0
  108. data/app/views/solidify/themes/skeleton-theme/templates/blog.grid.liquid +30 -0
  109. data/app/views/solidify/themes/skeleton-theme/templates/blog.liquid +92 -0
  110. data/app/views/solidify/themes/skeleton-theme/templates/cart.liquid +123 -0
  111. data/app/views/solidify/themes/skeleton-theme/templates/collection.liquid +102 -0
  112. data/app/views/solidify/themes/skeleton-theme/templates/customers/account.liquid +57 -0
  113. data/app/views/solidify/themes/skeleton-theme/templates/customers/activate_account.liquid +26 -0
  114. data/app/views/solidify/themes/skeleton-theme/templates/customers/addresses.liquid +173 -0
  115. data/app/views/solidify/themes/skeleton-theme/templates/customers/login.liquid +90 -0
  116. data/app/views/solidify/themes/skeleton-theme/templates/customers/order.liquid +103 -0
  117. data/app/views/solidify/themes/skeleton-theme/templates/customers/register.liquid +32 -0
  118. data/app/views/solidify/themes/skeleton-theme/templates/customers/reset_password.liquid +27 -0
  119. data/app/views/solidify/themes/skeleton-theme/templates/index.liquid +39 -0
  120. data/app/views/solidify/themes/skeleton-theme/templates/list-collections.liquid +19 -0
  121. data/app/views/solidify/themes/skeleton-theme/templates/page.liquid +16 -0
  122. data/app/views/solidify/themes/skeleton-theme/templates/product.liquid +202 -0
  123. data/app/views/solidify/themes/skeleton-theme/templates/search.liquid +72 -0
  124. data/bin/rails +12 -0
  125. data/config/app.yml +0 -0
  126. data/config/initializers/carrierwave.rb +25 -0
  127. data/config/initializers/devise.rb +286 -0
  128. data/config/initializers/form_tag.rb +43 -0
  129. data/config/initializers/liquid.rb +213 -0
  130. data/config/initializers/sass.rb +15 -0
  131. data/config/initializers/spree.rb +7 -0
  132. data/config/initializers/theme_settings.rb +29 -0
  133. data/config/routes.rb +52 -0
  134. data/config/spring.rb +2 -0
  135. data/db/migrate/20170223064316_create_solidify_assets.solidify.rb +14 -0
  136. data/db/migrate/20170223064317_create_solidify_themes.solidify.rb +10 -0
  137. data/db/migrate/20170223064318_create_solidify_link_lists.solidify.rb +12 -0
  138. data/db/migrate/20170223064319_create_solidify_links.solidify.rb +13 -0
  139. data/db/migrate/20170223064320_create_solidify_settings.solidify.rb +22 -0
  140. data/db/migrate/20170223064321_create_solidify_pages.solidify.rb +16 -0
  141. data/db/migrate/20170223064322_add_attributes_to_spree_users.solidify.rb +7 -0
  142. data/db/migrate/20170223064323_add_handle_to_spree_taxons.solidify.rb +7 -0
  143. data/db/migrate/20170228115149_add_state_and_country_fields_to_spree_addresses.solidify.rb +7 -0
  144. data/lib/generators/solidify/install/install_generator.rb +23 -0
  145. data/lib/solidify.rb +11 -0
  146. data/lib/solidify/configuration.rb +21 -0
  147. data/lib/solidify/engine.rb +24 -0
  148. data/lib/solidify/testing_support/factories.rb +5 -0
  149. data/lib/solidify/testing_support/factories/assets.rb +75 -0
  150. data/lib/solidify/testing_support/factories/solidify_pages.rb +10 -0
  151. data/lib/solidify/testing_support/factories/spree_addresses.rb +9 -0
  152. data/lib/solidify/testing_support/factories/spree_line_items.rb +10 -0
  153. data/lib/solidify/testing_support/factories/spree_orders.rb +9 -0
  154. data/lib/solidify/testing_support/factories/spree_products.rb +8 -0
  155. data/lib/solidify/testing_support/factories/spree_taxons.rb +7 -0
  156. data/lib/solidify/testing_support/factories/spree_variants.rb +7 -0
  157. data/lib/solidify/testing_support/factories/themes.rb +7 -0
  158. data/lib/solidify/version.rb +3 -0
  159. data/lib/tasks/download_theme.rake +18 -0
  160. data/lib/tasks/seed_default_theme.rake +8 -0
  161. data/lib/tasks/seed_everything.rake +12 -0
  162. data/lib/tasks/seed_link_list.rake +8 -0
  163. data/lib/tasks/seed_shop_settings.rake +8 -0
  164. data/solidify.gemspec +61 -0
  165. metadata +668 -0
@@ -0,0 +1,46 @@
1
+ {% comment %}If no value is passed to the snippet, we will set the snippet variable to a sensible default.{% endcomment %}
2
+ {% if collection-grid-item == '' %}{% assign collection-grid-item = 'three-per-row' %}{% endif %}
3
+
4
+ <li class="{{ collection-grid-item }} centered">
5
+
6
+ <div class="coll-image-wrap">
7
+ <a href="{{ collection.url }}">
8
+ {% if collection.image %}
9
+ <img src="{{ collection | img_url: 'grande' }}" alt="{{ collection.image.alt | escape }}" />
10
+ {% else %}
11
+ <img src="{{ collection.products.first | img_url: 'grande' }}" alt="{{ collection.title | escape }}" />
12
+ {% endif %}
13
+ </a>
14
+ </div><!-- .coll-image-wrap -->
15
+
16
+ <div class="coll-caption">
17
+ <a class="coll-title" href="{{ collection.url }}">
18
+ {{ collection.title }}
19
+ </a>
20
+ <span class="coll-item-count">
21
+ {{ collection.all_products_count }} {{ collection.all_products_count | pluralize:'item','items' }}
22
+ </span>
23
+ </div><!-- .coll-caption -->
24
+
25
+ </li>
26
+
27
+ {% comment %}
28
+ You don't need to use a clearing div. Use whatever it is you use to clear
29
+ floated elements. The code that follows just just shows you how to use a cycle element.
30
+ Notice that we named it ( 'clear' ). We need to name it because there's another cycle
31
+ element in this file ( we called that other one 'last' ). If you have more than one
32
+ cycle element in a rendered view, you'll need to name all of them.
33
+ The cycle element is documented here: http://docs.shopify.com/themes/liquid-basics/logic#cycle
34
+ {% endcomment %}
35
+
36
+ {% if collection-grid-item == 'six-per-row' %}
37
+ {% cycle 'clear': '', '', '', '', '', '<div style="clear:both"></div>' %}
38
+ {% elsif collection-grid-item == 'five-per-row' %}
39
+ {% cycle 'clear': '', '', '', '', '<div style="clear:both"></div>' %}
40
+ {% elsif collection-grid-item == 'four-per-row' %}
41
+ {% cycle 'clear': '', '', '', '<div style="clear:both"></div>' %}
42
+ {% elsif collection-grid-item == 'three-per-row' %}
43
+ {% cycle 'clear': '', '', '<div style="clear:both"></div>' %}
44
+ {% elsif collection-grid-item == 'two-per-row' %}
45
+ {% cycle 'clear': '', '<div style="clear:both"></div>' %}
46
+ {% endif %}
@@ -0,0 +1,46 @@
1
+ {% comment %}
2
+ Be prepared to use this snippet to showcase collections specified in a link list as per this solution here:
3
+ "Featuring collections using a Link List" http://docs.shopify.com/support/your-store/collections/featuring-collections-using-link-lists
4
+ If this snippet is called with an argument, we'll assume it is the handle of a link list, and we will use that list.
5
+ If this snippet is not called with an argument, we'll assume we are on the /collections page and will list all collections in the shop, all except the 'frontpage' and 'all' collections.
6
+ Merchants often create an 'all' collection to control their Catalog page at /collections/all as per these instructions:
7
+ "Taking Control of your Catalog Page" http://docs.shopify.com/support/your-store/collections/taking-control-of-your-catalog-page
8
+ and don't want that collection to appear on their /collections page.
9
+ {% endcomment %}
10
+
11
+ {% assign products_per_page = settings.products_per_row | times: settings.number_of_rows %}
12
+ {% assign numbers = 'one, two, three, four, five, six' | split: ',' %}
13
+ {% assign products_per_row = settings.products_per_row | minus: 1 %}
14
+ {% assign products_per_row = numbers[products_per_row] | strip | append: '-per-row' %}
15
+
16
+ {% assign using_link_list = false %}
17
+
18
+ {% if collection-listing != '' and linklists[collection-listing].handle == collection-listing and linklists[collection-listing].links.size > 0 %}
19
+ {% assign using_link_list = true %}
20
+ {% endif %}
21
+
22
+ <h1>{% if using_link_list %}{{ linklists[collection-listing].title }}{% else %}Collections{% endif %}</h1>
23
+
24
+ {% if using_link_list %}
25
+ <ul class="grid clearfix">
26
+ {% for link in linklists[collection-listing].links %}
27
+ {% if link.type == 'collection_link' %}
28
+ {% assign collection = link.object %}
29
+ {% include 'collection-grid-item' with products_per_row %}
30
+ {% endif %}
31
+ {% endfor %}
32
+ </ul>
33
+ {% else %}
34
+ {% paginate collections by products_per_page %}
35
+ <ul class="grid clearfix">
36
+ {% for collection in collections %}
37
+ {% include 'collection-grid-item' with products_per_row %}
38
+ {% endfor %}
39
+ </ul>
40
+ {% if paginate.pages > 1 %}
41
+ <div id="pagination">
42
+ {{ paginate | default_pagination }}
43
+ </div>
44
+ {% endif %}
45
+ {% endpaginate %}
46
+ {% endif %}
@@ -0,0 +1,35 @@
1
+ {% if template contains 'product' %}
2
+ <meta property="og:type" content="product" />
3
+ <meta property="og:title" content="{{ product.title | strip_html | escape }}" />
4
+ {% for image in product.images %}
5
+ <meta property="og:image" content="http:{{ image | img_url: 'grande' }}" />
6
+ <meta property="og:image:secure_url" content="https:{{ image | img_url: 'grande' }}" />
7
+ {% endfor %}
8
+ <meta property="og:price:amount" content="{{ product.price | money_without_currency }}" />
9
+ <meta property="og:price:currency" content="{{ shop.currency }}" />
10
+ {% elsif template contains 'article' %}
11
+ <meta property="og:type" content="article" />
12
+ <meta property="og:title" content="{{ article.title | strip_html | escape }}" />
13
+ {% assign img_tag = '<' | append: 'img' %}
14
+ {% if article.content contains img_tag %}
15
+ {% assign src = article.content | split: 'src="' %}
16
+ {% assign src = src[1] | split: '"' | first | remove: 'https:' | remove: 'http:' %}
17
+ {% if src %}
18
+ <meta property="og:image" content="http:{{ src }}" />
19
+ <meta property="og:image:secure_url" content="https:{{ src }}" />
20
+ {% endif %}
21
+ {% endif %}
22
+ {% else %}
23
+ {% if settings.use_logo %}
24
+ <meta property="og:image" content="http:{{ 'logo.png' | asset_url }}" />
25
+ <meta property="og:image:secure_url" content="https:{{ 'logo.png' | asset_url }}" />
26
+ {% endif %}
27
+ <meta property="og:title" content="{{ page_title | escape }}" />
28
+ <meta property="og:type" content="website" />
29
+ {% endif %}
30
+
31
+ {% if page_description %}
32
+ <meta property="og:description" content="{{ page_description }}" />
33
+ {% endif %}
34
+ <meta property="og:url" content="{{ canonical_url }}" />
35
+ <meta property="og:site_name" content="{{ shop.name }}" />
@@ -0,0 +1,70 @@
1
+ {% comment %}
2
+ It may be a good idea to provide a theme setting that lets a merchant decide how many products to show per row
3
+ on collection pages. Or, it may be a good idea to provide a control on the store front which lets a shopper decide
4
+ whether items be presented in a grid or in a list.
5
+ That information about the presentation can be passed on to the product-grid-item.liquid snippet via the 'with' argument.
6
+ Use of the 'with' argument is explained here: http://docs.shopify.com/themes/theme-templates/snippets.
7
+ The information can then be referred to by accessing the variable which goes by the same name as the snippet,
8
+ in this case product-grid-item. If the 'with' argument is not used, the snippet variable is set to an empty string.
9
+ Here, for the sake of teaching, we will use 2 presentation options:
10
+ - 3 products per row, when passing the value 'three-per-row' to the snippet
11
+ - 4 products per row, when passing the value 'four-per-row' to the snippet
12
+ {% endcomment %}
13
+
14
+ {% comment %}If no value is passed to the snippet, we will set the snippet variable to a sensible default.{% endcomment %}
15
+ {% if product-grid-item == '' %}{% assign product-grid-item = 'three-per-row' %}{% endif %}
16
+
17
+ {% comment %}Is this product on sale?{% endcomment %}
18
+ {% assign on_sale = false %}
19
+ {% if product.compare_at_price > product.price %}
20
+ {% assign on_sale = true %}
21
+ {% endif %}
22
+
23
+ <li class="{{ product-grid-item }}{% unless product.available %} sold-out{% endunless %}{% if on_sale %} on-sale{% endif %}{% if product-grid-item == 'four-per-row' %}{% cycle 'last': '', '', '', ' last-in-row' %}{% elsif product-grid-item == 'three-per-row' %}{% cycle 'last': '', '', ' last-in-row' %}{% endif %} centered">
24
+
25
+ <div class="prod-image-wrap">
26
+ <a href="{{ product.url | within: collection }}">
27
+ <img src="{{ product | img_url: 'grande' }}" alt="{{ product.featured_image.alt | escape }}" />
28
+ </a>
29
+ </div><!-- .prod-image-wrap -->
30
+
31
+ <div class="prod-caption">
32
+ <a href="{{ product.url | within: collection }}">
33
+ {{ product.title }}
34
+ </a>
35
+ <span class="prod-price">
36
+ {% if product.price_varies %}From{% endif %}
37
+ {{ product.price | money }}
38
+ {% if on_sale %}
39
+ <s class="compare-at-price">{{ product.compare_at_price | money }}</s>
40
+ {% endif %}
41
+ </span>
42
+ {% comment %}
43
+ All themes by Shopify should support the Product Reviews app out of the box.
44
+ https://apps.shopify.com/product-reviews
45
+ {% endcomment %}
46
+ <span class="shopify-product-reviews-badge" data-id="{{ product.id }}"></span>
47
+ </div><!-- .prod-caption -->
48
+
49
+ </li>
50
+
51
+ {% comment %}
52
+ You don't need to use a clearing div. Use whatever it is you use to clear
53
+ floated elements. The code that follows just just shows you how to use a cycle element.
54
+ Notice that we named it ( 'clear' ). We need to name it because there's another cycle
55
+ element in this file ( we called that other one 'last' ). If you have more than one
56
+ cycle element in a rendered view, you'll need to name all of them.
57
+ The cycle element is documented here: http://docs.shopify.com/themes/liquid-basics/logic#cycle
58
+ {% endcomment %}
59
+
60
+ {% if product-grid-item == 'six-per-row' %}
61
+ {% cycle 'clear': '', '', '', '', '', '<div style="clear:both"></div>' %}
62
+ {% elsif product-grid-item == 'five-per-row' %}
63
+ {% cycle 'clear': '', '', '', '', '<div style="clear:both"></div>' %}
64
+ {% elsif product-grid-item == 'four-per-row' %}
65
+ {% cycle 'clear': '', '', '', '<div style="clear:both"></div>' %}
66
+ {% elsif product-grid-item == 'three-per-row' %}
67
+ {% cycle 'clear': '', '', '<div style="clear:both"></div>' %}
68
+ {% elsif product-grid-item == 'two-per-row' %}
69
+ {% cycle 'clear': '', '<div style="clear:both"></div>' %}
70
+ {% endif %}
@@ -0,0 +1,57 @@
1
+ {% comment %}
2
+ A word on drop-down menus: Shopify has no concept of them.
3
+ Drop-down menus in Shopify themes are a hack that relies on a naming convention.
4
+ To create a drop-down menu, the merchant must create a link list that has the same name as the link he wants the drop-down for.
5
+ For example, if he wants a drop-down under a 'Shop by brand' link (say, he has such link in his Main Menu), he needs to create a linklist called 'Shop by brand', and populate it with links. Once he has done that, there'll be a drop-down under 'Shop by brand'.
6
+ Shopify has a visual how-to guide here: http://docs.shopify.com/manual/your-website/navigation/create-drop-down-menu.
7
+ The naming convention hack won't work well if a shop's navigation uses non-English characters. There's a much more verbose coding solution that handles non-English characters here: http://docs.shopify.com/manual/configuration/store-customization/currencies-and-translations/translations/can-i-have-drop-down-menus-that-use-non-english-characters.
8
+ A word on sub-categories: Shopify manages sub-categories using product tags: http://docs.shopify.com/manual/configuration/store-customization/page-specific/collections/subcategories
9
+ {% endcomment %}
10
+
11
+ <nav role="navigation" class="left">
12
+ <ul class="nav">
13
+ {% for link in linklists.main-menu.links %}
14
+ {% assign has_sub_menu = false %}
15
+ {% assign has_sub_categories = false %}
16
+ {% assign parent_link_active = false %}
17
+ {% assign child_list_handle = link.title | handle %}
18
+ {% if linklists[child_list_handle] and linklists[child_list_handle].links.size > 0 %}
19
+ {% assign has_sub_menu = true %}
20
+ {% for l in linklists[child_list_handle].links %}
21
+ {% if handle != blank and handle == l.object.handle %}
22
+ {% assign parent_link_active = true %}
23
+ {% elsif page_title == l.title %}
24
+ {% assign parent_link_active = true %}
25
+ {% endif %}
26
+ {% endfor %}
27
+ {% elsif link.type == 'collection_link' and link.object.all_tags.size > 0 %}
28
+ {% assign has_sub_categories = true %}
29
+ {% endif %}
30
+ <li class="{% if link.active or parent_link_active %} active{% endif %}{% if has_sub_menu or has_sub_categories %} has-dropdown{% endif %}{% if forloop.first %} first{% elsif forloop.last %} last{% endif %}">
31
+ <a href="{{ link.url }}">{{ link.title }}{% if has_sub_menu or has_sub_categories %} <i class="fa fa-angle-down"></i>{% endif %}</a>
32
+ {% if has_sub_menu or has_sub_categories %}
33
+ <ul class="sub-nav">
34
+ {% if has_sub_menu %}
35
+ {% for l in linklists[child_list_handle].links %}
36
+ <li class="{% if l.active %} active{% endif %}">
37
+ <a href="{{ l.url }}">{{ l.title }}</a>
38
+ </li>
39
+ {% endfor %}
40
+ {% elsif has_sub_categories %}
41
+ {% for tag in link.object.all_tags %}
42
+ <li class="{% if current_tags contains tag %} active{% endif %}">
43
+ <a href="{{ link.url }}/{{ tag | handle }}">{{ tag }}</a>
44
+ </li>
45
+ {% endfor %}
46
+ {% endif %}
47
+ </ul>
48
+ {% endif %}
49
+ </li>
50
+ {% endfor %}
51
+ <li class="show-on-small{% if template == 'search' %} active{% endif %}">
52
+ <a href="/search">
53
+ <i class="fa fa-search"></i>
54
+ </a>
55
+ </li>
56
+ </ul>
57
+ </nav>
@@ -0,0 +1,42 @@
1
+ {% unless settings.facebook_url == blank %}
2
+ <a href="{{ settings.facebook_url }}" title="Follow us on Facebook" target="_blank"><span class="shopify-social-icon-facebook{{ settings.social_icons_style }}"></span></a>
3
+ {% endunless %}
4
+ {% unless settings.twitter_url == blank %}
5
+ <a href="{{ settings.twitter_url }}" title="Follow us on Twitter" target="_blank"><span class="shopify-social-icon-twitter{{ settings.social_icons_style }}"></span></a>
6
+ {% endunless %}
7
+ {% unless settings.pinterest_url == blank %}
8
+ <a href="{{ settings.pinterest_url }}" title="Follow us on Pinterest" target="_blank"><span class="shopify-social-icon-pinterest{{ settings.social_icons_style }}"></span></a>
9
+ {% endunless %}
10
+ {% unless settings.googleplus_url == blank %}
11
+ <a href="{{ settings.googleplus_url }}" title="Follow us on Google+" target="_blank"><span class="shopify-social-icon-googleplus{{ settings.social_icons_style }}"></span></a>
12
+ {% endunless %}
13
+ {% unless settings.instagram_url == blank %}
14
+ <a href="{{ settings.instagram_url }}" title="Follow us on Instagram" target="_blank"><span class="shopify-social-icon-instagram{{ settings.social_icons_style }}"></span></a>
15
+ {% endunless %}
16
+ {% unless settings.linkedin_url == blank %}
17
+ <a href="{{ settings.linkedin_url }}" title="Follow us on linkedin" target="_blank"><span class="shopify-social-icon-linkedin{{ settings.social_icons_style }}"></span></a>
18
+ {% endunless %}
19
+ {% unless settings.flickr_url == blank %}
20
+ <a href="{{ settings.flickr_url }}" title="Follow us on Flickr" target="_blank"><span class="shopify-social-icon-flickr{{ settings.social_icons_style }}"></span></a>
21
+ {% endunless %}
22
+ {% unless settings.yelp_url == blank %}
23
+ <a href="{{ settings.yelp_url }}" title="Look us up on Yelp" target="_blank"><span class="shopify-social-icon-yelp{{ settings.social_icons_style }}"></span></a>
24
+ {% endunless %}
25
+ {% unless settings.vimeo_url == blank %}
26
+ <a href="{{ settings.vimeo_url }}" title="Follow us on Vimeo" target="_blank"><span class="shopify-social-icon-vimeo{{ settings.social_icons_style }}"></span></a>
27
+ {% endunless %}
28
+ {% unless settings.youtube_url == blank %}
29
+ <a href="{{ settings.youtube_url }}" title="Follow us on YouTube" target="_blank"><span class="shopify-social-icon-youtube{{ settings.social_icons_style }}"></span></a>
30
+ {% endunless %}
31
+ {% unless settings.tumblr_url == blank %}
32
+ <a href="{{ settings.tumblr_url }}" title="Come visit our blog" target="_blank"><span class="shopify-social-icon-tumblr{{ settings.social_icons_style }}"></span></a>
33
+ {% endunless %}
34
+ {% unless settings.wordpress_url == blank %}
35
+ <a href="{{ settings.wordpress_url }}" title="Come visit our blog" target="_blank"><span class="shopify-social-icon-wordpress{{ settings.social_icons_style }}"></span></a>
36
+ {% endunless %}
37
+ {% unless settings.featured_blog == blank %}
38
+ <a href="/blogs/{{ settings.featured_blog }}.atom" title="Subscribe to our blog" target="_blank"><span class="shopify-social-icon-feed{{ settings.social_icons_style }}"></span></a>
39
+ {% endunless %}
40
+ {% unless settings.contact_email == blank %}
41
+ <a href="mailto:{{ settings.contact_email }}" title="Email us" target="_blank"><span class="shopify-social-icon-email{{ settings.social_icons_style }}"></span></a>
42
+ {% endunless %}
@@ -0,0 +1,41 @@
1
+ {% comment %}
2
+
3
+ This snippet renders meta data needed to create a Twitter card
4
+ for products and articles.
5
+
6
+ Your cards must be approved by Twitter to be activated
7
+ - https://dev.twitter.com/docs/cards/validation/validator
8
+
9
+ More information:
10
+ - https://dev.twitter.com/docs/cards/types/product-card
11
+ - https://dev.twitter.com/docs/cards/types/summary-card
12
+
13
+ {% endcomment %}
14
+
15
+ {% if template contains 'product' %}
16
+ <meta name="twitter:card" content="product" />
17
+ <meta name="twitter:title" content="{{ product.title | escape }}" />
18
+ <meta name="twitter:description" content="{{ product.description | strip_html | strip_newlines | truncatewords: 60, '' | escape }}" />
19
+ <meta name="twitter:image" content="http:{{ product | img_url: 'large' }}" />
20
+ <meta name="twitter:label1" content="Price" />
21
+ <meta name="twitter:data1" content="{% if product.price_varies %}From {% endif %}{{ product.price | money_with_currency | strip_html }}" />
22
+ {% if product.vendor == blank %}
23
+ <meta name="twitter:label2" content="Availability" />
24
+ <meta name="twitter:data2" content="In stock" />
25
+ {% else %}
26
+ <meta name="twitter:label2" content="Brand" />
27
+ <meta name="twitter:data2" content="{{ product.vendor | escape }}" />
28
+ {% endif %}
29
+ {% elsif template contains 'article' %}
30
+ <meta name="twitter:card" content="summary" />
31
+ <meta name="twitter:title" content="{{ article.title | escape }}" />
32
+ <meta name="twitter:description" content="{{ article.excerpt_or_content | strip_html | truncatewords: 60, '' | escape }}" />
33
+ {% assign img_tag = '<' | append: 'img' %}
34
+ {% if article.content contains img_tag %}
35
+ {% assign src = article.content | split: 'src="' %}
36
+ {% assign src = src[1] | split: '"' | first | remove: 'https:' | remove: 'http:' %}
37
+ {% if src %}
38
+ <meta property="twitter:image" content="http:{{ src }}" />
39
+ {% endif %}
40
+ {% endif %}
41
+ {% endif %}
@@ -0,0 +1,2 @@
1
+ <h1 class="centered">404 Page Not Found</h1>
2
+ <h2 class="delta centered">The page you requested does not exist. Click <a href="/collections/all">here</a> to continue shopping.</h2>
@@ -0,0 +1,160 @@
1
+ {% paginate article.comments by 50 %}
2
+
3
+ {% comment %}
4
+ When a comment has just been submitted, it's not shown right away.
5
+ Shopify needs to wait until it knows for sure that it is not spam to publish it.
6
+ We can still show right away *to its author* the comment he just submitted
7
+ — although that comment may not have been published yet.
8
+ When a comment is submitted, the browser is redirected to a page that
9
+ includes the new comment id in its URL. Example:
10
+ http://shopname.myshopify.com/blogs/news/2022072-my-post?comment=3721372
11
+ When a comment ID is specified in an article URL, that comment is accessible in the
12
+ template through a Liquid object called comment.
13
+ That comment is a full-fledged comment variable that has all the regular comment properties:
14
+ http://docs.shopify.com/themes/liquid-variables/comment.
15
+ Note that comment.created_at will only be defined if the comment did not have any blank field
16
+ — was posted without error.
17
+ {% endcomment %}
18
+
19
+ {% assign number_of_comments = article.comments_count %}
20
+
21
+ {% comment %}If a comment was just submitted, and it has no blank fields.{% endcomment %}
22
+ {% if comment and comment.created_at %}
23
+ {% assign number_of_comments = article.comments_count | plus: 1 %}
24
+ {% endif %}
25
+
26
+ <h2 class="delta"><a href="{{ blog.url }}">{{ blog.title }}</a></h2>
27
+
28
+ <div class="article">
29
+ <h1 class="title">
30
+ {{ article.title }}
31
+ </h1>
32
+ <h3 class="date">
33
+ <time pubdate datetime="{{ article.published_at | date: '%Y-%m-%d' }}">{{ article.published_at | date: '%b %d, %Y' }}</time>
34
+ </h3>
35
+ <div class="rte">
36
+ {{ article.content }}
37
+ </div>
38
+ <div class="meta">
39
+ {% if blog.comments_enabled? and article.comments_count > 0 %}
40
+ <span class="meta-comments">
41
+ <a href="#comments"><i class="fa fa-comment"></i> {{ article.comments_count }} {{ article.comments_count | pluralize: 'comment','comments' }}</a>
42
+ </span>
43
+ {% endif %}
44
+ {% if article.tags.size > 0 %}
45
+ <span class="tags">
46
+ {% for tag in article.tags %}
47
+ <a href="{{ blog.url }}/tagged/{{ tag | handle }}">{% if forloop.first %}<i class="fa fa-tag"></i> {% endif %}{{ tag }}</a>{% unless forloop.last %}, {% endunless %}
48
+ {% endfor %}
49
+ </span>
50
+ {% endif %}
51
+ </div>
52
+ </div>
53
+
54
+ {% if blog.comments_enabled? %}
55
+ <div id="comments">
56
+
57
+ {% comment %}If a comment was just submitted with no blank field.{% endcomment %}
58
+ {% if comment and comment.created_at %}
59
+ <p class="success feedback">
60
+ {% if blog.moderated? %}
61
+ Your comment was posted successfully. We will publish it in a little while, as our blog is moderated.
62
+ {% else %}
63
+ Your comment was posted successfully! Thank you!
64
+ {% endif %}
65
+ </p>
66
+ {% endif %}
67
+
68
+ {% if number_of_comments > 0 %}
69
+ <ul>
70
+ {% comment %}If a comment was just submitted with no blank field, let's show it.{% endcomment %}
71
+ {% if comment and comment.created_at %}
72
+ <li id="{{ comment.id }}" class="comment first{% if article.comments_count == 0 %} last{% endif %}">
73
+ <h3 class="comment-author">{{ comment.author }} says...</h3>
74
+ <div class="comment-content">
75
+ {{ comment.content }}
76
+ </div>
77
+ <p class="comment-date">
78
+ On {{ comment.created_at | date: "%B %d, %Y" }}
79
+ </p>
80
+ </li>
81
+ {% endif %}
82
+ {% comment %}Showing the rest of the comments.{% endcomment %}
83
+ {% for comment in article.comments %}
84
+ <li id="{{ comment.id }}" class="comment{% unless number_of_comments > article.comments_count %}{% if forloop.first %} first{% endif %}{% endunless %}{% if forloop.last %} last {% endif %}">
85
+ <h3 class="comment-author">{{ comment.author }} says...</h3>
86
+ <div class="comment-content">
87
+ {{ comment.content }}
88
+ </div>
89
+ <p class="comment-date">
90
+ On {{ comment.created_at | date: "%B %d, %Y" }}
91
+ </p>
92
+ </li>
93
+ {% endfor %}
94
+ </ul>
95
+ {% endif %}
96
+
97
+ {% comment %}Comments are paginated.{% endcomment %}
98
+ {% if paginate.pages > 1 %}
99
+ <div id="pagination">
100
+ {{ paginate | default_pagination }}
101
+ </div>
102
+ {% endif %}
103
+
104
+ {% comment %}Comment submission form.{% endcomment %}
105
+ {% form "new_comment", article %}
106
+
107
+ <h3 id="add-comment-title">Leave a comment</h3>
108
+
109
+ {% if form.errors %}
110
+ <div class="feedback error">
111
+ {{ form.errors | default_errors }}
112
+ </div>
113
+ {% endif %}
114
+
115
+ <p>
116
+ <label for="comment-author">Name</label>
117
+ <input required{% if form.errors contains "author" %} class="error"{% endif %} type="text" name="comment[author]" placeholder="Your name" id="comment-author" value="{{ form.author }}" />
118
+ </p>
119
+
120
+ <p>
121
+ <label for="comment-email">Email</label>
122
+ <input required{% if form.errors contains "email" %} class="error"{% endif %} type="email" name="comment[email]" placeholder="your@email.com" id="comment-email" value="{{ form.email }}" />
123
+ </p>
124
+
125
+ <p>
126
+ <label for="comment-body">Message</label>
127
+ <textarea required{% if form.errors contains "body" %} class="error"{% endif %} name="comment[body]" id="comment-body">{{ form.body }}</textarea>
128
+ </p>
129
+
130
+ <input type="submit" value="Post Comment" />
131
+
132
+ {% if form.errors %}
133
+ <script>
134
+ window.location.hash = '#add-comment-title';
135
+ </script>
136
+ {% endif %}
137
+
138
+ {% if form.posted_successfully? %}
139
+ <script>
140
+ window.location.hash = '#comments';
141
+ </script>
142
+ {% endif %}
143
+
144
+ {% endform %}
145
+
146
+ </div>
147
+ {% endif %}
148
+
149
+ {% if blog.next_article or blog.previous_article %}
150
+ <p class="clearfix">
151
+ {% if blog.next_article %}
152
+ <span class="left">{{ '&larr; Next Post' | link_to: blog.next_article }}</span>
153
+ {% endif %}
154
+ {% if blog.previous_article %}
155
+ <span class="right">{{ 'Previous Post &rarr;' | link_to: blog.previous_article }}</span>
156
+ {% endif %}
157
+ </p>
158
+ {% endif %}
159
+
160
+ {% endpaginate %}