spree_page_builder 5.3.5 → 5.4.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e16048a168e3fbd56f37cb427ce79908db79931a3d459f3ac374a58e13ccdb0a
4
- data.tar.gz: 2471cbb07e99b62fc293d4dbb30c011a84a67ffa370d681b2657506af48310a5
3
+ metadata.gz: 1c0a0d6b849ba77a6f5aa00ed5572f1a809fd6fe5ded28c74346b2b09cbc71b1
4
+ data.tar.gz: 91fb84c175c3be58f23bcb9e7b3fecf8280058c7386aa8fd9d0c0b614a3291dc
5
5
  SHA512:
6
- metadata.gz: e14a05937481ddd061783c3577c20a0bf4d6c548c37c2e09110657584032be82f5162f949560dc86225cedafbf5f69211e2f1b41d67107244dd91ed528f615dc
7
- data.tar.gz: 61e468920186e87e69f8102e3ef68d333041cb0d24ca420b2013308dd9dfb95bc1876cb9877fd0f47fae677a6e6d7aea796210bb5748ea2c9ca82abf13b2b02d
6
+ metadata.gz: 4b9c2e47346c889a289013e88a3205041c83982afbf9953a48d2de3ed60898ecd468a00d9ef25659fa51f404276f9bf5d2586cf546cccf4d5b1445673fb76780
7
+ data.tar.gz: cc30a24e1116a56ed833ab0455d4d2f96a4fab6e85d7bfed7985fc0452d8d7c5349b55bc2e3d3a9e5c7ed24ee233e92d2761687fdec58e285b1089b45087cefe
data/LICENSE.md ADDED
@@ -0,0 +1,13 @@
1
+ # License
2
+
3
+ Copyright (c) 2024-present, Vendo Connect Inc., Vendo Sp z o.o.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
+
7
+ This program is distributed in the hope that it will be useful,
8
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ GNU Affero General Public License for more details.
11
+
12
+ You should have received a copy of the GNU Affero General Public License
13
+ along with this program. If not, see [https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Visual page builder and theme management for Spree Commerce storefronts.
4
4
 
5
+ ![Spree Page Builder](page_builder.png)
6
+
5
7
  ## Overview
6
8
 
7
9
  Spree Page Builder provides a visual drag-and-drop interface for building and customizing storefront pages. It includes:
data/Rakefile CHANGED
@@ -1,18 +1,24 @@
1
- require 'rubygems'
2
- require 'rake'
3
- require 'rake/testtask'
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
4
  require 'rspec/core/rake_task'
5
- require 'spree/testing_support/common_rake'
5
+ require 'spree/testing_support/extension_rake'
6
6
 
7
7
  RSpec::Core::RakeTask.new
8
8
 
9
- task default: :spec
9
+ task :default do
10
+ if Dir['spec/dummy'].empty?
11
+ Rake::Task[:test_app].invoke
12
+ Dir.chdir('../../')
13
+ end
14
+ Rake::Task[:spec].invoke
15
+ end
10
16
 
11
- desc "Generates a dummy app for testing"
17
+ desc 'Generates a dummy app for testing'
12
18
  task :test_app do
13
19
  ENV['LIB_NAME'] = 'spree/page_builder'
14
-
15
- Rake::Task['common:test_app'].execute(
16
- install_admin: true,
20
+ Rake::Task['extension:test_app'].execute(
21
+ install_admin: true
17
22
  )
23
+ system({ 'BUNDLE_GEMFILE' => File.expand_path('Gemfile', __dir__) }, 'bundle exec rails g spree_posts:install')
18
24
  end
@@ -0,0 +1,42 @@
1
+ module Spree
2
+ module HasOneLink
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ has_one :link, ->(ps) { ps.links }, class_name: 'Spree::PageLink', as: :parent, dependent: :destroy, inverse_of: :parent
7
+ accepts_nested_attributes_for :link
8
+
9
+ def allowed_linkable_types
10
+ [
11
+ [Spree.t(:page), 'Spree::Page'],
12
+ [Spree.t(:product), 'Spree::Product'],
13
+ [Spree.t(:post), 'Spree::Post'],
14
+ [Spree.t(:taxon), 'Spree::Taxon'],
15
+ [Spree.t(:policy), 'Spree::Policy'],
16
+ [Spree.t(:url), nil]
17
+ ]
18
+ end
19
+
20
+ def default_linkable_type
21
+ 'Spree::Page'
22
+ end
23
+
24
+ def default_linkable_resource
25
+ @default_linkable_resource ||= theme_or_parent.pages.find_by(type: 'Spree::Pages::Homepage')
26
+ end
27
+
28
+ def default_links
29
+ @default_links.presence || [
30
+ Spree::PageLink.new(
31
+ label: Spree.t(:shop_all),
32
+ linkable: theme_or_parent.pages.find_by(type: 'Spree::Pages::ShopAll')
33
+ )
34
+ ]
35
+ end
36
+
37
+ def theme_or_parent
38
+ theme.preview? ? theme.parent : theme
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module Linkable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ has_many :page_links, as: :linkable, class_name: 'Spree::PageLink', dependent: :destroy
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ module Spree
2
+ module Previewable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do |base|
6
+ belongs_to :parent, class_name: base.name, optional: true, foreign_key: :parent_id
7
+ has_many :previews, class_name: base.name, dependent: :destroy_async, foreign_key: :parent_id
8
+
9
+ scope :without_previews, -> { where(parent_id: nil) }
10
+ scope :only_previews, -> { where.not(parent_id: nil) }
11
+ end
12
+
13
+ def preview?
14
+ parent.present?
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,72 @@
1
+ module Spree
2
+ module Stores
3
+ module Socials
4
+ extend ActiveSupport::Concern
5
+
6
+ SUPPORTED_SOCIAL_NETWORKS = %w[instagram facebook twitter pinterest tiktok youtube spotify discord].freeze
7
+
8
+ SOCIAL_NETWORKS_CONFIG = {
9
+ twitter: {
10
+ input_placeholder: 'https://twitter.com/your_handle',
11
+ profile_link: 'https://twitter.com/your_handle'
12
+ },
13
+ instagram: {
14
+ input_placeholder: 'https://www.instagram.com/your_handle',
15
+ profile_link: 'https://www.instagram.com/your_handle'
16
+ },
17
+ facebook: {
18
+ input_placeholder: 'https://www.facebook.com/your_page',
19
+ profile_link: 'https://www.facebook.com/your_page'
20
+ },
21
+ youtube: {
22
+ input_placeholder: 'https://www.youtube.com/@your_channel',
23
+ profile_link: 'https://www.youtube.com/@your_channel'
24
+ },
25
+ pinterest: {
26
+ input_placeholder: 'https://pinterest.com/your_handle',
27
+ profile_link: 'https://pinterest.com/your_handle'
28
+ },
29
+ tiktok: {
30
+ input_placeholder: 'your_handle',
31
+ profile_link: 'https://www.tiktok.com/@your_handle'
32
+ },
33
+ spotify: {
34
+ input_placeholder: 'https://open.spotify.com/user/your_handle',
35
+ profile_link: 'https://open.spotify.com/user/your_handle'
36
+ },
37
+ discord: {
38
+ input_placeholder: 'https://discord.com/invite/your_handle',
39
+ profile_link: 'https://discord.com/invite/your_handle'
40
+ }
41
+ }.freeze
42
+
43
+ included do
44
+ # generate methods for social links
45
+ SUPPORTED_SOCIAL_NETWORKS.each do |social|
46
+ # store the social handle in the public metadata
47
+ store_accessor :public_metadata, social
48
+
49
+ define_method "#{social}_link" do
50
+ return if send(social).blank?
51
+
52
+ send(social).match(/http/) ? send(social) : SOCIAL_NETWORKS_CONFIG[social.to_sym][:profile_link].gsub(/your_handle|your_page|your_channel/, send(social).sub(/^\//, '').sub(/^@/, ''))
53
+ end
54
+
55
+ define_method "#{social}_handle" do
56
+ return if send(social).blank?
57
+
58
+ (send(social).match(/http/) ? send(social).split('/').last : send(social)).sub(/^\//, '').gsub('@', '').split('?').first
59
+ end
60
+ end
61
+ end
62
+
63
+ def social_handle
64
+ @social_handle ||= instagram_handle || youtube_handle || tiktok_handle
65
+ end
66
+
67
+ def social_links
68
+ @social_links ||= [instagram_link, facebook_link, twitter_link, pinterest_link, youtube_link, tiktok_link, spotify_link, discord_link].compact_blank
69
+ end
70
+ end
71
+ end
72
+ end
@@ -3,6 +3,7 @@ module Spree
3
3
  module StoreDecorator
4
4
  def self.prepended(base)
5
5
  base.include Spree::HasPageLinks
6
+ base.include Spree::Stores::Socials
6
7
 
7
8
  # Page Builder associations
8
9
  base.has_many :themes, -> { without_previews }, class_name: 'Spree::Theme', dependent: :destroy, inverse_of: :store
@@ -21,17 +22,71 @@ module Spree
21
22
  base.has_many :page_previews, class_name: 'Spree::Pages::Custom', through: :pages, as: :pageable, source: :previews
22
23
 
23
24
  base.after_create :create_default_theme
25
+
26
+ base.has_rich_text :checkout_message
27
+
28
+ # Storefront-specific attachments
29
+ base.has_one_attached :favicon_image, service: Spree.public_storage_service_name
30
+ base.has_one_attached :social_image, service: Spree.public_storage_service_name
31
+
32
+ base.validates :favicon_image, :social_image, content_type: Rails.application.config.active_storage.web_image_content_types
33
+
34
+ base.preference :index_in_search_engines, :boolean, default: false
35
+ base.preference :password_protected, :boolean, default: false
36
+ base.store_accessor :private_metadata, :storefront_password
37
+
38
+ base.translates(:facebook, :twitter, :instagram, column_fallback: !Spree.always_use_translations?)
39
+ end
40
+
41
+ def favicon
42
+ return unless favicon_image.attached? && favicon_image.variable?
43
+
44
+ favicon_image.variant(resize_to_limit: [32, 32])
24
45
  end
25
46
 
26
47
  private
27
48
 
28
49
  def create_default_theme
50
+ ensure_default_taxonomies
51
+ ensure_default_automatic_taxons
52
+
29
53
  themes.find_or_initialize_by(default: true) do |theme|
30
54
  theme.name = Spree.t(:default_theme_name)
31
55
  theme.save!
32
56
  end
33
57
  end
34
58
 
59
+ def ensure_default_taxonomies
60
+ [
61
+ Spree.t(:taxonomy_categories_name),
62
+ Spree.t(:taxonomy_brands_name),
63
+ Spree.t(:taxonomy_collections_name)
64
+ ].each do |taxonomy_name|
65
+ next if taxonomies.with_matching_name(taxonomy_name).exists?
66
+
67
+ taxonomies.create(name: taxonomy_name)
68
+ end
69
+ end
70
+
71
+ def ensure_default_automatic_taxons
72
+ collections_taxonomy = taxonomies.with_matching_name(Spree.t(:taxonomy_collections_name)).first
73
+ return unless collections_taxonomy.present?
74
+
75
+ [
76
+ { name: Spree.t('automatic_taxon_names.on_sale'), rule_type: 'Spree::TaxonRules::Sale', rule_value: 'true' },
77
+ { name: Spree.t('automatic_taxon_names.new_arrivals'), rule_type: 'Spree::TaxonRules::AvailableOn', rule_value: 30 }
78
+ ].each do |config|
79
+ next if collections_taxonomy.taxons.automatic.with_matching_name(config[:name]).exists?
80
+
81
+ collections_taxonomy.taxons.create!(
82
+ name: config[:name],
83
+ automatic: true,
84
+ parent: collections_taxonomy.root,
85
+ taxon_rules: [Spree::TaxonRule.new(type: config[:rule_type], value: config[:rule_value])]
86
+ )
87
+ end
88
+ end
89
+
35
90
  def create_default_policies
36
91
  super
37
92
 
@@ -122,6 +122,10 @@ module Spree
122
122
  role == 'content'
123
123
  end
124
124
 
125
+ def can_be_hidden?
126
+ false
127
+ end
128
+
125
129
  def can_be_sorted?
126
130
  true
127
131
  end
@@ -8,10 +8,16 @@ module Spree
8
8
  BOTTOM_PADDING_DEFAULT = 8
9
9
  TOP_BORDER_WIDTH_DEFAULT = 0
10
10
 
11
+ preference :visible, :boolean, default: true
12
+
11
13
  def self.role
12
14
  'header'
13
15
  end
14
16
 
17
+ def can_be_hidden?
18
+ true
19
+ end
20
+
15
21
  def icon_name
16
22
  'speakerphone'
17
23
  end
@@ -1,19 +1,21 @@
1
1
  <% if section.persisted? %>
2
+ <% section_hidden = section.can_be_hidden? && !section.preferred_visible %>
2
3
  <%= turbo_frame_tag dom_id(section), class: 'list-group-item py-0 border-0 sidebar-page-section draggable rounded-sm',
3
4
  data: { sortable_update_url: spree.admin_page_section_path(section, format: :turbo_stream) } do %>
4
- <div class="flex items-center justify-between sidebar-section-title py-1 rounded-xl"
5
+ <div class="flex items-center justify-between sidebar-section-title py-1 rounded-xl <%= 'opacity-50' if section_hidden %>"
5
6
  data-action="mouseover->page-builder#toggleHighlightElement mouseout->page-builder#toggleHighlightElement"
6
7
  data-page-builder-editor-id-param="section-<%= section.id %>">
7
8
  <div class="flex items-center flex-1 py-1 px-2">
8
9
  <%= icon("#{section.icon_name}", height: 18, class: 'mr-2') if section.icon_name.present? %>
9
10
  <%= link_to section.display_name, spree.edit_admin_page_section_path(section),
10
- class: 'section-edit-link flex-1 font-bold text-gray-900',
11
+ class: "section-edit-link flex-1 font-bold #{section_hidden ? 'text-gray-400' : 'text-gray-900'}",
11
12
  data: {
12
13
  turbo_frame: :page_sidebar,
13
14
  action: 'click->page-builder#makeOverlayActive',
14
15
  page_builder_editor_id_param: "section-#{section.id}"
15
16
  }
16
17
  %>
18
+ <%= icon('eye-off', height: 14, class: 'ml-1 text-gray-400') if section_hidden %>
17
19
  </div>
18
20
  <div class="flex items-center hidden">
19
21
  <button class="btn btn-sm pr-0 handle hover:bg-gray-100 h-full mr-1 px-1 handle-section shadow-none">
@@ -18,6 +18,12 @@
18
18
  </li>
19
19
  </ul>
20
20
  <div data-tabs-target="panel" id="pills-home" role="tabpanel" aria-labelledby="pills-home-tab" class="animate-fade-in" <%= 'hidden' unless tab_selected == :content %>>
21
+ <% if @page_section.can_be_hidden? %>
22
+ <div class="form-group">
23
+ <%= f.check_box :preferred_visible, class: "checkbox-input", data: { action: 'auto-submit#submit' } %>
24
+ <%= f.label :preferred_visible, Spree.t('admin.page_builder.visible') %>
25
+ </div>
26
+ <% end %>
21
27
  <%= render "spree/admin/page_sections/forms/#{@page_section.type.demodulize.underscore}", f: f %>
22
28
  <%= render 'spree/admin/page_sections/form_tab_buttons', tab: :content %>
23
29
  </div>
@@ -8,3 +8,9 @@
8
8
  <%= render 'spree/admin/page_links/linkable_type_dropdown', page_link: @page_section.link, form_name: 'page_section[link_attributes]' %>
9
9
  <% end %>
10
10
  <% end %>
11
+ <% if @page_section.can_be_hidden? && @page_section.saved_change_to_preferences? &&
12
+ @page_section.saved_change_to_preferences[0][:visible] != @page_section.saved_change_to_preferences[1][:visible] %>
13
+ <%= turbo_stream.replace dom_id(@page_section) do %>
14
+ <%= render 'spree/admin/page_builder/sidebar_section', section: @page_section %>
15
+ <% end %>
16
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= f.spree_file_field :asset, width: 400, height: 128, auto_submit: true, label: Spree.t(:logo) %>
@@ -0,0 +1,28 @@
1
+ <div id="checkout_links">
2
+ <% if current_store.links.any? %>
3
+ <ul class="list-group rounded-lg mb-6 border-gray-200"
4
+ data-controller="sortable"
5
+ data-sortable-handle-value=".handle"
6
+ data-sortable-resource-name-value="page_link"
7
+ data-sortable-response-kind-value="turbo-stream">
8
+ <% current_store.links.each do |link| %>
9
+ <li class="list-group-item p-0 hover:bg-gray-25"
10
+ data-sortable-update-url="<%= spree.admin_page_link_path(link, sorting_only: true, format: :turbo_stream) %>"
11
+ >
12
+ <%= turbo_frame_tag spree_dom_id(link), class: 'flex items-center w-full py-2 pl-6 pr-2' do %>
13
+ <%= link_to link.label, spree.edit_admin_page_link_path(link), class: 'block text-gray-900 flex-1 no-underline' %>
14
+ <span class="btn btn-sm handle shadow-none hover:bg-gray-100 px-1 cursor-move ml-4">
15
+ <%= icon 'grip-vertical', class: 'mr-0' %>
16
+ </span>
17
+ <% end %>
18
+ </li>
19
+ <% end %>
20
+ </ul>
21
+ <% else %>
22
+ <p class="text-gray-600 text-center p-12">
23
+ <%= Spree.t(:no_resource_found, resource: Spree::PageLink.model_name.human) %>
24
+ </p>
25
+ <% end %>
26
+
27
+ <%= link_to_with_icon 'plus', Spree.t(:add_link), spree.admin_store_links_path(current_store), class: 'btn btn-primary w-full', data: { turbo_method: :post } %>
28
+ </div>
@@ -37,6 +37,7 @@ en:
37
37
  title: Title
38
38
  top_padding: Top padding
39
39
  use_description_from_admin: Use description from admin
40
+ visible: Visible
40
41
  vertical_alignment: Vertical alignment
41
42
  youtube_video_url: Youtube video URL
42
43
  default_theme_name: Default Theme
@@ -8,6 +8,7 @@ module Spree
8
8
 
9
9
  def add_migrations
10
10
  run 'bundle exec rake railties:install:migrations FROM=spree_page_builder'
11
+ run 'bundle exec rake railties:install:migrations FROM=spree_posts'
11
12
  end
12
13
 
13
14
  def run_migrations
@@ -136,6 +136,12 @@ module Spree
136
136
  Rails.application.config.spree.page_blocks = value
137
137
  end
138
138
 
139
+ mattr_accessor :screenshot_api_token
140
+
141
+ def self.screenshot_api_token
142
+ @@screenshot_api_token
143
+ end
144
+
139
145
  # Page Builder configuration accessor (groups all page builder config)
140
146
  def self.page_builder
141
147
  @page_builder ||= PageBuilderConfig.new
@@ -1,4 +1,5 @@
1
1
  require 'spree'
2
2
  require 'spree_admin'
3
+ require 'spree_posts'
3
4
 
4
5
  require 'spree/page_builder/engine'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_page_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.3.5
4
+ version: 5.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vendo Connect Inc.
@@ -15,34 +15,63 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 5.3.5
18
+ version: 5.4.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: 5.3.5
25
+ version: 5.4.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: spree_admin
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 5.3.5
32
+ version: 5.4.0
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: 5.3.5
39
+ version: 5.4.0
40
+ - !ruby/object:Gem::Dependency
41
+ name: spree_posts
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: spree_dev_tools
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
40
68
  description: Visual page builder and theme management for Spree Commerce storefronts
41
69
  email: hello@spreecommerce.org
42
70
  executables: []
43
71
  extensions: []
44
72
  extra_rdoc_files: []
45
73
  files:
74
+ - LICENSE.md
46
75
  - README.md
47
76
  - Rakefile
48
77
  - app/controllers/concerns/spree/admin/page_builder_concern.rb
@@ -58,7 +87,11 @@ files:
58
87
  - app/jobs/spree/page_builder/products/touch_taxons_job_decorator.rb
59
88
  - app/jobs/spree/themes/duplicate_components_job.rb
60
89
  - app/jobs/spree/themes/screenshot_job.rb
90
+ - app/models/concerns/spree/has_one_link.rb
61
91
  - app/models/concerns/spree/has_page_links.rb
92
+ - app/models/concerns/spree/linkable.rb
93
+ - app/models/concerns/spree/previewable.rb
94
+ - app/models/concerns/spree/stores/socials.rb
62
95
  - app/models/spree/page.rb
63
96
  - app/models/spree/page_block.rb
64
97
  - app/models/spree/page_blocks/buttons.rb
@@ -236,7 +269,9 @@ files:
236
269
  - app/views/spree/admin/pages/filters.html.erb
237
270
  - app/views/spree/admin/pages/index.html.erb
238
271
  - app/views/spree/admin/pages/new.html.erb
272
+ - app/views/spree/admin/shared/_page_section_logo.html.erb
239
273
  - app/views/spree/admin/storefront/edit.html.erb
274
+ - app/views/spree/admin/stores/form/_checkout_links.html.erb
240
275
  - app/views/spree/admin/themes/_theme.html.erb
241
276
  - app/views/spree/admin/themes/_theme_preview_image.html.erb
242
277
  - app/views/spree/admin/themes/edit.html.erb
@@ -264,10 +299,10 @@ homepage: https://getvendo.com
264
299
  licenses:
265
300
  - AGPL-3.0-or-later
266
301
  metadata:
267
- bug_tracker_uri: https://github.com/spree/spree/issues
268
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.3.5
302
+ bug_tracker_uri: https://github.com/spree/spree-rails-storefront/issues
303
+ changelog_uri: https://github.com/spree/spree-rails-storefront/releases/tag/v5.4.0
269
304
  documentation_uri: https://docs.spreecommerce.org/
270
- source_code_uri: https://github.com/spree/spree/tree/v5.3.5
305
+ source_code_uri: https://github.com/spree/spree-rails-storefront/tree/v5.4.0
271
306
  rdoc_options: []
272
307
  require_paths:
273
308
  - lib
@@ -282,7 +317,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
282
317
  - !ruby/object:Gem::Version
283
318
  version: '0'
284
319
  requirements: []
285
- rubygems_version: 4.0.3
320
+ rubygems_version: 4.0.2
286
321
  specification_version: 4
287
322
  summary: Visual Page Builder for Spree Commerce
288
323
  test_files: []