solidus_liquid 0.0.1.alpha
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.rubocop.yml +36 -0
- data/.travis.yml +10 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +3 -0
- data/Guardfile +37 -0
- data/LICENSE.txt +21 -0
- data/README.md +84 -0
- data/Rakefile +35 -0
- data/app/controllers/concerns/solidus_liquid/liquid.rb +26 -0
- data/app/controllers/solidus_liquid/addresses_controller.rb +15 -0
- data/app/controllers/solidus_liquid/carts_controller.rb +15 -0
- data/app/controllers/solidus_liquid/collections_controller.rb +22 -0
- data/app/controllers/solidus_liquid/customers_controller.rb +16 -0
- data/app/controllers/solidus_liquid/home_controller.rb +15 -0
- data/app/controllers/solidus_liquid/liquid_controller.rb +25 -0
- data/app/controllers/solidus_liquid/orders_controller.rb +18 -0
- data/app/controllers/solidus_liquid/pages_controller.rb +22 -0
- data/app/controllers/solidus_liquid/products_controller.rb +30 -0
- data/app/controllers/solidus_liquid/registrations_controller.rb +25 -0
- data/app/controllers/solidus_liquid/responders/solidus_liquid/liquid_responder.rb +29 -0
- data/app/controllers/solidus_liquid/search_controller.rb +41 -0
- data/app/controllers/solidus_liquid/sessions_controller.rb +15 -0
- data/app/drops/rails_settings/scoped_settings_drop.rb +11 -0
- data/app/drops/solidus_liquid/errors_drop.rb +14 -0
- data/app/drops/solidus_liquid/link_drop.rb +15 -0
- data/app/drops/solidus_liquid/link_list_drop.rb +7 -0
- data/app/drops/solidus_liquid/nil_drop.rb +7 -0
- data/app/drops/solidus_liquid/page_drop.rb +7 -0
- data/app/drops/solidus_liquid/search_drop.rb +7 -0
- data/app/drops/spree/address_drop.rb +24 -0
- data/app/drops/spree/image_drop.rb +10 -0
- data/app/drops/spree/line_item_drop.rb +5 -0
- data/app/drops/spree/option_type_drop.rb +4 -0
- data/app/drops/spree/order_drop.rb +18 -0
- data/app/drops/spree/product_drop.rb +92 -0
- data/app/drops/spree/taxon_drop.rb +31 -0
- data/app/drops/spree/user_drop.rb +19 -0
- data/app/drops/spree/variant_drop.rb +80 -0
- data/app/filters/solidus_liquid/additional_filters.rb +22 -0
- data/app/filters/solidus_liquid/html_filters.rb +20 -0
- data/app/filters/solidus_liquid/money_filters.rb +15 -0
- data/app/filters/solidus_liquid/string_filters.rb +11 -0
- data/app/filters/solidus_liquid/url_filters.rb +55 -0
- data/app/helpers/solidus_liquid/liquid_helper.rb +107 -0
- data/app/helpers/solidus_liquid/shop_helper.rb +7 -0
- data/app/models/concerns/solidus_liquid/address.rb +15 -0
- data/app/models/concerns/solidus_liquid/full_name.rb +11 -0
- data/app/models/concerns/solidus_liquid/handle.rb +25 -0
- data/app/models/concerns/solidus_liquid/inventory_policy.rb +7 -0
- data/app/models/solidus_liquid/asset.rb +12 -0
- data/app/models/solidus_liquid/link.rb +10 -0
- data/app/models/solidus_liquid/link_list.rb +7 -0
- data/app/models/solidus_liquid/page.rb +5 -0
- data/app/models/solidus_liquid/setting.rb +8 -0
- data/app/models/solidus_liquid/theme.rb +19 -0
- data/app/models/spree/address_decorator.rb +20 -0
- data/app/models/spree/image_decorator.rb +19 -0
- data/app/models/spree/product_decorator.rb +14 -0
- data/app/models/spree/taxon_decorator.rb +5 -0
- data/app/models/spree/variant_decorator.rb +15 -0
- data/app/poro/solidus_liquid/search.rb +14 -0
- data/app/services/solidus_liquid/app_specific_string_io.rb +15 -0
- data/app/services/solidus_liquid/asset_compiler.rb +11 -0
- data/app/services/solidus_liquid/asset_postprocessor.rb +53 -0
- data/app/services/solidus_liquid/link_list_seeder.rb +26 -0
- data/app/services/solidus_liquid/liquid_asset_compiler.rb +19 -0
- data/app/services/solidus_liquid/scss_asset_compiler.rb +15 -0
- data/app/services/solidus_liquid/shop_settings_seeder.rb +26 -0
- data/app/services/solidus_liquid/theme_mechanic.rb +45 -0
- data/app/uploaders/solidus_liquid/asset_uploader.rb +10 -0
- data/app/views/solidus_liquid/global/content_for_header.html.erb +0 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/README.md +54 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/assets/arrow-down.svg.liquid +3 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/assets/cart.svg.liquid +4 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/assets/shop.js.liquid +75 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/assets/shopify_common.js +14 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/assets/style.scss.liquid +768 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/config/settings.html +217 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/config/settings_data.json +26 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/layout/theme.liquid +181 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/snippets/article-grid-item.liquid +73 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/snippets/collection-grid-item.liquid +46 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/snippets/collection-listing.liquid +46 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/snippets/open-graph-tags.liquid +35 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/snippets/product-grid-item.liquid +70 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/snippets/site-nav.liquid +57 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/snippets/social-links.liquid +42 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/snippets/twitter-card.liquid +41 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/404.liquid +2 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/article.liquid +160 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/blog.grid.liquid +30 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/blog.liquid +92 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/cart.liquid +123 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/collection.liquid +102 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/customers/account.liquid +57 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/customers/activate_account.liquid +26 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/customers/addresses.liquid +173 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/customers/login.liquid +90 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/customers/order.liquid +103 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/customers/register.liquid +32 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/customers/reset_password.liquid +27 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/index.liquid +39 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/list-collections.liquid +19 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/page.liquid +16 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/product.liquid +202 -0
- data/app/views/solidus_liquid/themes/skeleton-theme/templates/search.liquid +72 -0
- data/bin/rails +12 -0
- data/config/app.yml +0 -0
- data/config/initializers/carrierwave.rb +25 -0
- data/config/initializers/devise.rb +286 -0
- data/config/initializers/form_tag.rb +43 -0
- data/config/initializers/liquid.rb +202 -0
- data/config/initializers/sass.rb +15 -0
- data/config/initializers/theme_settings.rb +29 -0
- data/config/routes.rb +48 -0
- data/db/migrate/20170223064316_create_solidus_liquid_assets.solidus_liquid.rb +14 -0
- data/db/migrate/20170223064317_create_solidus_liquid_themes.solidus_liquid.rb +10 -0
- data/db/migrate/20170223064318_create_solidus_liquid_link_lists.solidus_liquid.rb +12 -0
- data/db/migrate/20170223064319_create_solidus_liquid_links.solidus_liquid.rb +13 -0
- data/db/migrate/20170223064320_create_solidus_liquid_settings.solidus_liquid.rb +22 -0
- data/db/migrate/20170223064321_create_solidus_liquid_pages.solidus_liquid.rb +16 -0
- data/db/migrate/20170223064322_add_attributes_to_spree_users.solidus_liquid.rb +7 -0
- data/db/migrate/20170223064323_add_handle_to_spree_taxons.solidus_liquid.rb +7 -0
- data/lib/generators/solidus_liquid/install/install_generator.rb +13 -0
- data/lib/solidus_liquid.rb +11 -0
- data/lib/solidus_liquid/configuration.rb +21 -0
- data/lib/solidus_liquid/engine.rb +24 -0
- data/lib/solidus_liquid/factories.rb +7 -0
- data/lib/solidus_liquid/version.rb +3 -0
- data/lib/tasks/download_theme.rake +18 -0
- data/lib/tasks/seed_default_theme.rake +8 -0
- data/lib/tasks/seed_everything.rake +14 -0
- data/lib/tasks/seed_link_list.rake +8 -0
- data/lib/tasks/seed_shop_settings.rake +8 -0
- data/solidus_liquid.gemspec +56 -0
- metadata +586 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
module SolidusLiquid
|
2
|
+
class Theme < ActiveRecord::Base
|
3
|
+
has_many :assets
|
4
|
+
|
5
|
+
def settings
|
6
|
+
settings = Redis.current.get("solidus_liquid_themes_#{id}")
|
7
|
+
settings ||= Redis.current.get('solidus_liquid_themes_')
|
8
|
+
JSON.parse(settings)
|
9
|
+
end
|
10
|
+
|
11
|
+
def previewable
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
def processing
|
16
|
+
false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Spree
|
2
|
+
Address.class_eval do
|
3
|
+
include ::SolidusLiquid::Address
|
4
|
+
include ::SolidusLiquid::FullName
|
5
|
+
|
6
|
+
def default
|
7
|
+
user_addresses.first.try(:default)
|
8
|
+
end
|
9
|
+
|
10
|
+
def province
|
11
|
+
state.name
|
12
|
+
end
|
13
|
+
|
14
|
+
def province_code
|
15
|
+
state.abbr
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_attribute :zip, :zipcode
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Spree
|
2
|
+
Product.class_eval do
|
3
|
+
include ::RailsSettings::Extend
|
4
|
+
include ::SolidusLiquid::Handle
|
5
|
+
|
6
|
+
def available
|
7
|
+
variants.any?(&:available)
|
8
|
+
end
|
9
|
+
|
10
|
+
# display_image just shows first image
|
11
|
+
# probably producing many queries on the db
|
12
|
+
alias_method :featured_image, :display_image
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Spree
|
2
|
+
Variant.class_eval do
|
3
|
+
include SolidusLiquid::InventoryPolicy
|
4
|
+
# Returns true if the variant is available for purchase, or false if it not.
|
5
|
+
# For a variant to be available, its variant.inventory_quantity must be
|
6
|
+
# greater than zero or variant.inventory_policy must be set to continue. A
|
7
|
+
# variant with no variant.inventory_management is also considered available.
|
8
|
+
def available
|
9
|
+
true
|
10
|
+
# inventory_management.blank? ||
|
11
|
+
# inventory_policy == INVENTORY_POLICY_ALLOW ||
|
12
|
+
# inventory_quantity(??? check VariantDrop) > 0
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module SolidusLiquid
|
2
|
+
class Search
|
3
|
+
include ::Liquid::Rails::Droppable
|
4
|
+
|
5
|
+
attr_accessor :performed, :results, :results_count, :terms
|
6
|
+
|
7
|
+
def initialize(performed: nil, results: nil, results_count: nil, terms: nil)
|
8
|
+
@performed = performed
|
9
|
+
@results = results
|
10
|
+
@results_count = results_count
|
11
|
+
@terms = terms
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# copied from: https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Upload-from-a-string-in-Rails-3-or-later
|
2
|
+
module SolidusLiquid
|
3
|
+
class AppSpecificStringIO < StringIO
|
4
|
+
attr_accessor :filepath
|
5
|
+
|
6
|
+
def initialize(*args)
|
7
|
+
super(*args[1..-1])
|
8
|
+
@filepath = args[0]
|
9
|
+
end
|
10
|
+
|
11
|
+
def original_filename
|
12
|
+
File.basename(@filepath)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module SolidusLiquid
|
2
|
+
class AssetPostprocessor
|
3
|
+
def initialize(asset)
|
4
|
+
@asset = asset
|
5
|
+
end
|
6
|
+
|
7
|
+
def process
|
8
|
+
process_for_key(
|
9
|
+
asset: @asset,
|
10
|
+
key: @asset.key,
|
11
|
+
template: File.read(@asset.file.path),
|
12
|
+
settings: @asset.theme.settings
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def process_for_key(asset:, key:, template:, settings:)
|
19
|
+
return unless key.start_with?('assets/')
|
20
|
+
if key.end_with?('.liquid')
|
21
|
+
process_liquid(asset: asset, key: key.gsub(/.liquid$/, ''),
|
22
|
+
template: template, settings: settings)
|
23
|
+
elsif key.end_with?('.scss')
|
24
|
+
process_scss(asset: asset, key: key, template: template)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def process_liquid(asset:, key:, template:, settings:)
|
29
|
+
rendered_liquid = LiquidAssetCompiler.new(template, settings,
|
30
|
+
asset.theme).compile
|
31
|
+
if key.end_with?('.scss')
|
32
|
+
process_scss(asset: asset, key: key, template: rendered_liquid)
|
33
|
+
else
|
34
|
+
update_or_create_asset(key: key,
|
35
|
+
theme: asset.theme, contents: rendered_liquid)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def process_scss(asset:, key:, template:)
|
40
|
+
rendered_css = ScssAssetCompiler.new(template).compile
|
41
|
+
new_asset = Asset.where(key: "#{key}.css",
|
42
|
+
theme: asset.theme).first_or_initialize
|
43
|
+
new_asset.update_attributes(
|
44
|
+
file: AppSpecificStringIO.new("#{key}.css", rendered_css)
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
def update_or_create_asset(key:, theme:, contents:)
|
49
|
+
new_asset = Asset.where(key: key, theme: theme).first_or_initialize
|
50
|
+
new_asset.update_attributes(file: AppSpecificStringIO.new(key, contents))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module SolidusLiquid
|
2
|
+
class LinkListSeeder
|
3
|
+
# rubocop:disable Metrics/MethodLength
|
4
|
+
def seed
|
5
|
+
LinkList.create(
|
6
|
+
[
|
7
|
+
{
|
8
|
+
title: 'Main menu',
|
9
|
+
handle: 'main-menu',
|
10
|
+
links: [
|
11
|
+
Link.new(title: 'Home', url: '/'),
|
12
|
+
Link.new(title: 'Catalog', url: '/collections/all')
|
13
|
+
]
|
14
|
+
},
|
15
|
+
{
|
16
|
+
title: 'Footer',
|
17
|
+
handle: 'footer',
|
18
|
+
links: [
|
19
|
+
Link.new(title: 'Search', url: '/search')
|
20
|
+
]
|
21
|
+
}
|
22
|
+
]
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module SolidusLiquid
|
2
|
+
class LiquidAssetCompiler
|
3
|
+
include AssetCompiler
|
4
|
+
|
5
|
+
def initialize(template, settings, theme)
|
6
|
+
super(template)
|
7
|
+
@settings = settings
|
8
|
+
@theme = theme
|
9
|
+
end
|
10
|
+
|
11
|
+
def compile
|
12
|
+
liquid = ::Liquid::Template.parse(@template)
|
13
|
+
assigns = { 'settings' => @settings }
|
14
|
+
liquid.render(assigns,
|
15
|
+
filters: [UrlFilters],
|
16
|
+
registers: { theme: @theme })
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module SolidusLiquid
|
2
|
+
class ScssAssetCompiler
|
3
|
+
include AssetCompiler
|
4
|
+
|
5
|
+
def compile
|
6
|
+
options = {
|
7
|
+
style: :compressed,
|
8
|
+
syntax: :scss,
|
9
|
+
cache: false,
|
10
|
+
full_exception: true
|
11
|
+
}
|
12
|
+
::Sass::Engine.new(@template, options).render
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module SolidusLiquid
|
2
|
+
class ShopSettingsSeeder
|
3
|
+
def initialize(theme_id)
|
4
|
+
@theme_id = theme_id
|
5
|
+
end
|
6
|
+
|
7
|
+
# rubocop:disable Metrics/MethodLength
|
8
|
+
def seed
|
9
|
+
{
|
10
|
+
'active_theme_id' => @theme_id,
|
11
|
+
'checkout' => { 'guest_login' => false },
|
12
|
+
'currency' => 'USD',
|
13
|
+
'customer_accounts_enabled' => true,
|
14
|
+
'customer_accounts_optional' => true,
|
15
|
+
'description' => '',
|
16
|
+
'domain' => ENV.fetch('DOMAIN_NAME'),
|
17
|
+
'enabled_payment_types' => nil,
|
18
|
+
'money_format' => '€{{amount}}',
|
19
|
+
'money_with_currency_format' => '€{{amount}} EUR',
|
20
|
+
'name' => 'Split'
|
21
|
+
}.each do |k, v|
|
22
|
+
SolidusLiquid::Setting[k] = v
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module SolidusLiquid
|
2
|
+
class ThemeMechanic
|
3
|
+
def initialize(
|
4
|
+
name: 'Simple',
|
5
|
+
path: SolidusLiquid::Engine.root.join(
|
6
|
+
'app', 'views', 'solidus_liquid', 'themes', 'skeleton-theme'
|
7
|
+
),
|
8
|
+
skip_file_upload: false
|
9
|
+
)
|
10
|
+
@name = name
|
11
|
+
@path = path
|
12
|
+
@skip_file_upload = skip_file_upload
|
13
|
+
end
|
14
|
+
|
15
|
+
def create
|
16
|
+
theme = Theme.new(name: @name)
|
17
|
+
|
18
|
+
files = Dir.glob("#{@path}/**/*")
|
19
|
+
instantiate_assets_from_files(files, theme)
|
20
|
+
|
21
|
+
theme.save!
|
22
|
+
theme
|
23
|
+
end
|
24
|
+
|
25
|
+
def instantiate_assets_from_files(files, theme)
|
26
|
+
files.each do |file|
|
27
|
+
next if Dir.exist?(file) # skip directories
|
28
|
+
theme.assets << asset_from_file(file)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def asset_from_file(file)
|
33
|
+
asset = Asset.new(key: Pathname.new(file).relative_path_from(@path).to_s)
|
34
|
+
if @skip_file_upload
|
35
|
+
asset.file = File.basename(file)
|
36
|
+
else
|
37
|
+
File.open(file) do |f|
|
38
|
+
asset.file = f
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
asset
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module SolidusLiquid
|
2
|
+
class AssetUploader < ::CarrierWave::Uploader::Base
|
3
|
+
def store_dir
|
4
|
+
asset_file_dir = model.key.split('/')
|
5
|
+
asset_file_dir.pop
|
6
|
+
asset_file_dir = asset_file_dir.join('/')
|
7
|
+
"themes/#{model.theme_id}/#{asset_file_dir}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
File without changes
|
@@ -0,0 +1,54 @@
|
|
1
|
+
Skeleton theme
|
2
|
+
============
|
3
|
+
|
4
|
+
The Skeleton theme is a simplified Shopify theme, to be used as a "blank slate" starting point for theme designers.
|
5
|
+
|
6
|
+
<b>Features:</b>
|
7
|
+
- Almost no theme settings. Ready to be customized any way you want.
|
8
|
+
- Only ~500 lines of CSS including comments.
|
9
|
+
- Despite its 500 lines of CSS code, it is responsive and has styled drop-down menus.
|
10
|
+
- Include SVG images to style select elements and cart icon.
|
11
|
+
- Commented code to teach you Liquid concepts in practice.
|
12
|
+
|
13
|
+
<b>Demo:</b>
|
14
|
+
|
15
|
+
- [Demo store](http://skeleton.myshopify.com/)
|
16
|
+
|
17
|
+
Designing a store for a client? Earn 20% revenue through our <a href="http://www.shopify.com/partners">Partner program<a/>.
|
18
|
+
|
19
|
+
Getting started
|
20
|
+
---------------------
|
21
|
+
1. <a href="https://github.com/Shopify/skeleton-theme/archive/master.zip">Download</a> the latest version
|
22
|
+
2. or clone the git repo: <code>git clone https://github.com/Shopify/skeleton-theme.git</code>
|
23
|
+
|
24
|
+
Basic structure
|
25
|
+
---------------
|
26
|
+
```
|
27
|
+
├── assets
|
28
|
+
│ └── Javascript, CSS, and theme images
|
29
|
+
├── config
|
30
|
+
│ └── custom Theme Settings
|
31
|
+
├── layout
|
32
|
+
│ ├── theme.liquid
|
33
|
+
│ └── optional alternate layouts
|
34
|
+
├── snippets
|
35
|
+
│ └── optional custom code snippets
|
36
|
+
├── templates
|
37
|
+
│ ├── 404.liquid
|
38
|
+
│ ├── article.liquid
|
39
|
+
│ ├── blog.liquid
|
40
|
+
│ ├── cart.liquid
|
41
|
+
│ ├── collection.liquid
|
42
|
+
│ ├── index.liquid
|
43
|
+
│ ├── page.liquid
|
44
|
+
│ ├── product.liquid
|
45
|
+
│ └── search.liquid
|
46
|
+
│ └── list-collections.liquid
|
47
|
+
```
|
48
|
+
|
49
|
+
Additional resources
|
50
|
+
---------------------
|
51
|
+
- <a href="http://meetup.shopify.com/">Free workshops</a>: Sign up for a free Shopify For Designers workshop in a city near you.
|
52
|
+
- <a href="http://docs.shopify.com/themes">Theme Documentation</a>: Learn more about Liquid and theme templates.
|
53
|
+
- <a href="http://apps.shopify.com/desktop-theme-editor">Desktop Theme Editor</a>: For Mac OS X users, we recommend our free app to sync theme files in development.
|
54
|
+
- Need more help? Ask a question in our <a href="http://ecommerce.shopify.com/c/ecommerce-design"> Design Forums</a>.
|