beyond_canvas 0.15.2.pre → 0.17.0.pre
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 +4 -4
- data/README.md +0 -6
- data/Rakefile +3 -3
- data/app/assets/config/beyond_canvas_manifest.js +1 -0
- data/app/assets/images/icons/arrow_right.svg +1 -0
- data/app/assets/images/icons/close.svg +1 -0
- data/app/assets/images/icons/home.svg +1 -0
- data/app/assets/javascripts/beyond_canvas/base.js +120 -246
- data/app/assets/stylesheets/beyond_canvas/base.scss +8 -1
- data/app/assets/stylesheets/beyond_canvas/components/_action_bar.scss +28 -0
- data/app/assets/stylesheets/beyond_canvas/components/_breadcrumbs.scss +29 -0
- data/app/assets/stylesheets/beyond_canvas/components/_buttons.scss +1 -1
- data/app/assets/stylesheets/beyond_canvas/components/_debug.scss +10 -0
- data/app/assets/stylesheets/beyond_canvas/components/_forms.scss +11 -14
- data/app/assets/stylesheets/beyond_canvas/components/_main.scss +12 -13
- data/app/assets/stylesheets/beyond_canvas/components/_margins.scss +8 -0
- data/app/assets/stylesheets/beyond_canvas/components/_menu.scss +40 -0
- data/app/assets/stylesheets/beyond_canvas/components/_modals.scss +27 -0
- data/app/assets/stylesheets/beyond_canvas/components/_sidebar.scss +53 -0
- data/app/assets/stylesheets/beyond_canvas/components/_titles.scss +7 -0
- data/app/assets/stylesheets/beyond_canvas/settings/_breakpoints.scss +6 -6
- data/app/assets/stylesheets/beyond_canvas/settings/_variables.scss +77 -22
- data/app/controllers/beyond_canvas/application_controller.rb +2 -0
- data/app/controllers/beyond_canvas/authentications_controller.rb +69 -0
- data/app/controllers/concerns/beyond_canvas/authentication.rb +13 -0
- data/app/controllers/concerns/beyond_canvas/locale_management.rb +5 -4
- data/app/controllers/concerns/beyond_canvas/request_validation.rb +1 -1
- data/app/helpers/beyond_canvas/authentications_helper.rb +28 -0
- data/app/helpers/beyond_canvas/cockpit_app_helper.rb +17 -0
- data/app/helpers/beyond_canvas/debug_helper.rb +9 -0
- data/app/helpers/beyond_canvas/locale_switch_helper.rb +5 -1
- data/app/javascript/beyond_canvas/base.js +3 -0
- data/app/javascript/beyond_canvas/initializers/buttons.js +65 -19
- data/app/javascript/beyond_canvas/initializers/flash.js +9 -2
- data/app/javascript/beyond_canvas/initializers/inputs.js +4 -1
- data/app/javascript/beyond_canvas/initializers/modals.js +14 -0
- data/app/views/beyond_canvas/authentications/new.html.erb +27 -0
- data/app/views/beyond_canvas/shared/_action_bar.html.erb +15 -0
- data/app/views/beyond_canvas/shared/_breadcrumbs.html.erb +14 -0
- data/app/views/beyond_canvas/shared/_flash.html.erb +22 -12
- data/app/views/beyond_canvas/shared/_locales.html.erb +8 -0
- data/app/views/beyond_canvas/shared/_menu.html.erb +31 -0
- data/app/views/beyond_canvas/shared/_modal.html.erb +6 -0
- data/app/views/beyond_canvas/shared/_sidebar.html.erb +16 -0
- data/app/views/layouts/beyond_canvas/application.html.erb +31 -0
- data/app/views/layouts/beyond_canvas/public.html.erb +10 -1
- data/config/locales/en.yml +9 -0
- data/config/routes.rb +8 -1
- data/lib/beyond_canvas.rb +18 -2
- data/lib/beyond_canvas/configuration.rb +11 -3
- data/lib/beyond_canvas/engine.rb +6 -0
- data/lib/beyond_canvas/menu_item_registration.rb +19 -0
- data/lib/beyond_canvas/parameter_sanitizer.rb +43 -0
- data/lib/beyond_canvas/rails/routes.rb +22 -0
- data/lib/beyond_canvas/version.rb +1 -1
- data/lib/generators/beyond_canvas/controller/controller_generator.rb +19 -0
- data/lib/generators/beyond_canvas/controller/templates/controller.erb +20 -0
- data/lib/generators/beyond_canvas/custom_menu/custom_menu_generator.rb +13 -0
- data/lib/generators/beyond_canvas/custom_menu/templates/beyond_canvas_custom_menu.html.erb +32 -0
- data/lib/generators/beyond_canvas/custom_styles/custom_styles_generator.rb +1 -1
- data/lib/generators/beyond_canvas/custom_styles/templates/beyond_canvas_custom_styles.scss +199 -0
- data/lib/generators/beyond_canvas/install/install_generator.rb +13 -5
- data/lib/generators/beyond_canvas/install/templates/beyond_canvas.rb.erb +55 -6
- data/lib/generators/beyond_canvas/model/model_generator.rb +49 -0
- data/lib/generators/beyond_canvas/model/templates/migration.erb +18 -0
- data/lib/generators/beyond_canvas/model/templates/model.erb +5 -0
- data/lib/generators/beyond_canvas/views/views_generator.rb +17 -0
- data/lib/models/concerns/authentication.rb +57 -0
- data/lib/models/concerns/utils.rb +79 -0
- data/lib/models/shop.rb +12 -0
- metadata +95 -12
- data/app/javascript/beyond_canvas/initializers/functions.js +0 -41
- data/app/views/beyond_canvas/locales/_edit.html.erb +0 -8
- data/lib/generators/beyond_canvas/custom_styles/templates/beyond_canvas_custom_styles.sass +0 -123
@@ -1,13 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
<div id="flash">
|
2
|
+
|
3
|
+
<% flash.each do |key, value| %>
|
4
|
+
|
5
|
+
<div class="flash">
|
6
|
+
|
7
|
+
<div class="flash__icon flash__icon--<%= key %>">
|
8
|
+
<%= get_flash_icon(key) %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="flash__message">
|
12
|
+
<%= value %>
|
13
|
+
</div>
|
14
|
+
|
15
|
+
<div class="flash__close">
|
16
|
+
<%= inline_svg_tag 'icons/flash_close.svg' %>
|
17
|
+
</div>
|
18
|
+
|
5
19
|
</div>
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
<%= inline_svg_tag 'icons/flash_close.svg' %>
|
11
|
-
</div>
|
12
|
-
</div>
|
13
|
-
<% end %>
|
20
|
+
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
</div>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<% if show_locale_switch? && !is_cockpit_app? %>
|
2
|
+
<%= form_for :system, url: beyond_canvas.update_locale_path, method: :put do |f| %>
|
3
|
+
<%= f.select :locale, I18n.available_locales.collect { |l| [translate_locale(l), l] },
|
4
|
+
{ selected: cookies[:locale] },
|
5
|
+
class: 'select--locale',
|
6
|
+
onchange: 'this.form.submit()' %>
|
7
|
+
<% end %>
|
8
|
+
<% end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<% if menu_content? %>
|
2
|
+
|
3
|
+
<div class="menu">
|
4
|
+
|
5
|
+
<div class="menu--left">
|
6
|
+
<%= render 'beyond_canvas/shared/logo' %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="menu--center">
|
10
|
+
|
11
|
+
<% BeyondCanvas.configuration.menu_items.each do |menu_item| %>
|
12
|
+
<% name, url, options = menu_item.name.to_s, menu_item.url.to_s, menu_item.options %>
|
13
|
+
|
14
|
+
<% url, external_url = respond_to?(url) ? [send(url), false] : [url, true] %>
|
15
|
+
<% name = defined?(I18n) && I18n.exists?(name) ? I18n.t(name) : name %>
|
16
|
+
|
17
|
+
<% path = Rails.application.routes.recognize_path(url) %>
|
18
|
+
|
19
|
+
<% options = options.merge(class: 'menu__item--active') { |_key, old_val, new_val| [new_val, old_val].join(' ') if !external_url && path[:controller] == params[:controller] } %>
|
20
|
+
<% options = options.merge(class: 'menu__item') { |_key, old_val, new_val| [new_val, old_val].join(' ') } %>
|
21
|
+
|
22
|
+
<%= link_to name, url, options %>
|
23
|
+
<% end %>
|
24
|
+
|
25
|
+
</div>
|
26
|
+
|
27
|
+
<div class="menu--right"></div>
|
28
|
+
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% if is_cockpit_app? && Rails.env.development? %>
|
2
|
+
<div class="sidebar">
|
3
|
+
<div class="sidebar__header">
|
4
|
+
<div class="sidebar__logo"></div>
|
5
|
+
</div>
|
6
|
+
<div class="sidebar__item sidebar__item--selected"></div>
|
7
|
+
<div class="sidebar__item"></div>
|
8
|
+
<div class="sidebar__item"></div>
|
9
|
+
<div class="sidebar__item"></div>
|
10
|
+
<div class="sidebar__footer">
|
11
|
+
<div class="sidebar__icon"></div>
|
12
|
+
<div class="sidebar__icon"></div>
|
13
|
+
<div class="sidebar__icon"></div>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<%= render 'beyond_canvas/shared/head' %>
|
5
|
+
|
6
|
+
<body class="body--application"<% if is_cockpit_app? && Rails.env.development? %> style="display: flex;"<% end %>>
|
7
|
+
|
8
|
+
<%= render 'beyond_canvas/shared/sidebar' %>
|
9
|
+
|
10
|
+
<main class="main <%= params[:controller].gsub(/[\/_]/, "-") %>--<%= params[:action] %>">
|
11
|
+
|
12
|
+
<%= render 'beyond_canvas/shared/flash' %>
|
13
|
+
<%= render 'beyond_canvas/shared/locales' %>
|
14
|
+
<%= render 'beyond_canvas/shared/modal' %>
|
15
|
+
<%= render 'beyond_canvas/shared/menu' %>
|
16
|
+
<%= render 'beyond_canvas/shared/action_bar' %>
|
17
|
+
|
18
|
+
<div class="main-wrapper<% if action_bar_content? %> main-wrapper--action_bar<% end %>"<% if content_for?(:max_width)%> style="max-width: <%= yield :max_width %>"<% end %>>
|
19
|
+
|
20
|
+
<%= render 'beyond_canvas/shared/breadcrumbs' %>
|
21
|
+
|
22
|
+
<%= yield %>
|
23
|
+
|
24
|
+
<%= debug(params) if debug_mode? %>
|
25
|
+
|
26
|
+
</div>
|
27
|
+
|
28
|
+
</main>
|
29
|
+
|
30
|
+
</body>
|
31
|
+
</html>
|
@@ -4,13 +4,22 @@
|
|
4
4
|
<%= render 'beyond_canvas/shared/head' %>
|
5
5
|
|
6
6
|
<body class="body--public">
|
7
|
+
|
7
8
|
<main class="main <%= params[:controller].gsub(/[\/_]/, "-") %>--<%= params[:action] %>">
|
9
|
+
|
8
10
|
<%= render 'beyond_canvas/shared/flash' %>
|
9
|
-
<%= render 'beyond_canvas/locales
|
11
|
+
<%= render 'beyond_canvas/shared/locales' %>
|
12
|
+
|
10
13
|
<div class="main-wrapper">
|
14
|
+
|
11
15
|
<%= render 'beyond_canvas/shared/logo' %>
|
16
|
+
|
12
17
|
<%= yield %>
|
18
|
+
|
13
19
|
</div>
|
20
|
+
|
21
|
+
<%= debug(params) if debug_mode? %>
|
22
|
+
|
14
23
|
</main>
|
15
24
|
</body>
|
16
25
|
</html>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
en:
|
2
|
+
beyond_canvas:
|
3
|
+
authentications:
|
4
|
+
new:
|
5
|
+
headline: Install %{app_name} in your shop
|
6
|
+
body: You are about to install %{app_name} in your shop. For continuing with this process, press the install button below.
|
7
|
+
actions:
|
8
|
+
install: Install
|
9
|
+
failure: Shop could not be saved
|
data/config/routes.rb
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
BeyondCanvas::Engine.routes.draw do
|
4
|
-
put '
|
4
|
+
put 'locale', to: 'system#update_locale', as: :update_locale
|
5
|
+
|
6
|
+
def create_default_routes
|
7
|
+
get 'callback', to: 'authentications#new'
|
8
|
+
post 'callback', to: 'authentications#install'
|
9
|
+
end
|
10
|
+
|
11
|
+
create_default_routes unless BeyondCanvas.use_rails_app_controller
|
5
12
|
end
|
data/lib/beyond_canvas.rb
CHANGED
@@ -8,14 +8,30 @@ require 'jquery-rails'
|
|
8
8
|
require 'bourbon'
|
9
9
|
require 'sassc-rails'
|
10
10
|
require 'inline_svg'
|
11
|
+
require 'loaf'
|
11
12
|
require 'http/accept'
|
12
13
|
require 'premailer/rails'
|
13
14
|
|
14
15
|
require 'beyond_api'
|
16
|
+
require 'attr_encrypted'
|
15
17
|
|
16
18
|
module BeyondCanvas # :nodoc:
|
17
|
-
autoload :AssetRegistration,
|
18
|
-
autoload :Configuration,
|
19
|
+
autoload :AssetRegistration, 'beyond_canvas/asset_registration'
|
20
|
+
autoload :Configuration, 'beyond_canvas/configuration'
|
21
|
+
autoload :MenuItemRegistration, 'beyond_canvas/menu_item_registration'
|
22
|
+
autoload :ParameterSanitizer, 'beyond_canvas/parameter_sanitizer'
|
23
|
+
|
24
|
+
module Models # :nodoc:
|
25
|
+
autoload :Shop, 'models/shop'
|
26
|
+
|
27
|
+
module Concerns
|
28
|
+
autoload :Authentication, 'models/concerns/authentication'
|
29
|
+
autoload :Utils, 'models/concerns/utils'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
mattr_accessor :use_rails_app_controller
|
34
|
+
@@use_rails_app_controller = false
|
19
35
|
|
20
36
|
class << self
|
21
37
|
def configuration
|
@@ -2,14 +2,22 @@
|
|
2
2
|
|
3
3
|
module BeyondCanvas
|
4
4
|
class Configuration # :nodoc:
|
5
|
-
attr_accessor :site_title, :site_logo, :favicon, :skip_webpacker
|
5
|
+
attr_accessor :site_title, :site_logo, :favicon, :skip_webpacker, :encryption_key, :namespace, :cockpit_app,
|
6
|
+
:open_app_url, :preinstalled, :debug_mode
|
6
7
|
|
7
8
|
include AssetRegistration
|
9
|
+
include MenuItemRegistration
|
8
10
|
|
9
11
|
def initialize
|
10
|
-
@
|
11
|
-
@
|
12
|
+
@cockpit_app = false
|
13
|
+
@debug_mode = false
|
14
|
+
@encryption_key = nil
|
12
15
|
@favicon = nil
|
16
|
+
@namespace = '/'
|
17
|
+
@open_app_url = nil
|
18
|
+
@preinstalled = false
|
19
|
+
@site_logo = nil
|
20
|
+
@site_title = ::Rails.application.class.name.split('::').first.humanize
|
13
21
|
@skip_webpacker = false
|
14
22
|
end
|
15
23
|
|
data/lib/beyond_canvas/engine.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'beyond_canvas/rails/routes'
|
4
|
+
|
3
5
|
module BeyondCanvas
|
4
6
|
class Engine < ::Rails::Engine # :nodoc:
|
5
7
|
isolate_namespace BeyondCanvas
|
@@ -11,6 +13,8 @@ module BeyondCanvas
|
|
11
13
|
BeyondCanvas.configuration.javascripts.each do |path|
|
12
14
|
app.config.assets.precompile << path
|
13
15
|
end
|
16
|
+
|
17
|
+
app.config.assets.precompile << 'beyond_canvas_manifest.js'
|
14
18
|
end
|
15
19
|
|
16
20
|
config.before_initialize do
|
@@ -18,6 +22,8 @@ module BeyondCanvas
|
|
18
22
|
include ::BeyondCanvas::LocaleManagement
|
19
23
|
include ::BeyondCanvas::RequestValidation
|
20
24
|
include ::BeyondCanvas::StatusCodes
|
25
|
+
include ::BeyondCanvas::AuthenticationsHelper
|
26
|
+
include ::BeyondCanvas::DebugHelper
|
21
27
|
|
22
28
|
::ActionController::Base.helper BeyondCanvas::Engine.helpers
|
23
29
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module MenuItemRegistration # :nodoc:
|
5
|
+
MenuItem = Struct.new(:name, :url, :options)
|
6
|
+
|
7
|
+
def register_menu_item(name, url, options = {})
|
8
|
+
menu_items.add MenuItem.new(name, url, options)
|
9
|
+
end
|
10
|
+
|
11
|
+
def menu_items
|
12
|
+
@menu_items ||= Set.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def clear_menu_items!
|
16
|
+
menu_items.clear
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
class ParameterSanitizer # :nodoc:
|
5
|
+
DEFAULT_PERMITTED_ATTRIBUTES = %i[code signature return_url api_url access_token_url]
|
6
|
+
|
7
|
+
def initialize(resource_name, params)
|
8
|
+
@params = params
|
9
|
+
@resource_name = resource_name
|
10
|
+
@permitted = DEFAULT_PERMITTED_ATTRIBUTES
|
11
|
+
end
|
12
|
+
|
13
|
+
def sanitize
|
14
|
+
permit_keys(default_params)
|
15
|
+
end
|
16
|
+
|
17
|
+
def permit(*keys)
|
18
|
+
@permitted.concat(keys)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def default_params
|
24
|
+
if hashable_resource_params?
|
25
|
+
@params.fetch(@resource_name)
|
26
|
+
else
|
27
|
+
empty_params
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def hashable_resource_params?
|
32
|
+
@params[@resource_name].respond_to?(:permit)
|
33
|
+
end
|
34
|
+
|
35
|
+
def empty_params
|
36
|
+
ActionController::Parameters.new({})
|
37
|
+
end
|
38
|
+
|
39
|
+
def permit_keys(parameters)
|
40
|
+
parameters.permit(*@permitted)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActionDispatch
|
4
|
+
module Routing
|
5
|
+
class Mapper # :nodoc:
|
6
|
+
def beyond_canvas_routes(options = nil)
|
7
|
+
mount BeyondCanvas::Engine => BeyondCanvas.configuration.namespace
|
8
|
+
|
9
|
+
BeyondCanvas.use_rails_app_controller = options.present? && options[:custom_controller].present?
|
10
|
+
|
11
|
+
set_routes if BeyondCanvas.use_rails_app_controller
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_routes
|
15
|
+
scope BeyondCanvas.configuration.namespace do
|
16
|
+
get 'callback', controller: :authentications, action: :new
|
17
|
+
post 'callback', controller: :authentications, action: :install
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/active_record'
|
4
|
+
|
5
|
+
module BeyondCanvas
|
6
|
+
module Generators
|
7
|
+
class ControllerGenerator < Rails::Generators::Base # :nodoc:
|
8
|
+
desc 'Creates an inherited Beyond Canvas controller in the app/controllers folder'
|
9
|
+
|
10
|
+
argument :scope, required: true, desc: 'The scope to create the controller, e.g. shops, users'
|
11
|
+
|
12
|
+
source_root File.expand_path('templates', __dir__)
|
13
|
+
|
14
|
+
def create_controller
|
15
|
+
template 'controller.erb', "app/controllers/#{scope}_controller.rb"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class <%= scope.camelize %>Controller < BeyondCanvas::AuthenticationsController
|
4
|
+
# before_action :configure_params, only: [:install]
|
5
|
+
|
6
|
+
# def new
|
7
|
+
# super
|
8
|
+
# end
|
9
|
+
|
10
|
+
# def install
|
11
|
+
# super
|
12
|
+
# end
|
13
|
+
|
14
|
+
# private
|
15
|
+
|
16
|
+
# If you have extra params to permit, append them to the sanitizer.
|
17
|
+
# def configure_params
|
18
|
+
# beyond_canvas_parameter_sanitizer.permit(:attribute1, :attribute2)
|
19
|
+
# end
|
20
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module Generators
|
5
|
+
class CustomMenuGenerator < Rails::Generators::Base # :nodoc:
|
6
|
+
source_root File.expand_path('templates', __dir__)
|
7
|
+
|
8
|
+
def copy_initializer
|
9
|
+
copy_file 'beyond_canvas_custom_menu.html.erb', 'app/views/beyond_canvas/shared/_menu.html.erb'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<div class="menu">
|
2
|
+
|
3
|
+
<div class="menu--left">
|
4
|
+
<%= render 'beyond_canvas/shared/logo' %>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<div class="menu--center">
|
8
|
+
|
9
|
+
<%
|
10
|
+
=begin
|
11
|
+
Add here your menu links. You can use `menu__item` as class name and add
|
12
|
+
`menu__item--selected` as secondary class for selected menu item. E.g:
|
13
|
+
|
14
|
+
<%= link_to 'About us', about_us_path, class: "menu__item #{ 'menu__item--selected' if params[:controller] == 'about_us' }" %>
|
15
|
+
<%= link_to 'Support', support_path, class: "menu__item #{ 'menu__item--selected' if params[:controller] == 'support' }" %>
|
16
|
+
=end
|
17
|
+
%>
|
18
|
+
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div class="menu--right">
|
22
|
+
|
23
|
+
<%
|
24
|
+
=begin
|
25
|
+
You can also add here some content that will be right-aligned, like a user
|
26
|
+
avatar image or a dropdown account menu.
|
27
|
+
=end
|
28
|
+
%>
|
29
|
+
|
30
|
+
</div>
|
31
|
+
|
32
|
+
</div>
|