lesli 5.0.0 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/lesli/users/sessions.js +1 -786
  3. data/app/controllers/lesli/application_lesli_controller.rb +1 -1
  4. data/app/controllers/lesli/interfaces/application/logger.rb +36 -11
  5. data/app/helpers/lesli/navigation_helper.rb +3 -3
  6. data/app/lib/lesli/system.rb +4 -2
  7. data/app/models/lesli/account/request.rb +37 -0
  8. data/app/models/lesli/account.rb +1 -0
  9. data/app/models/lesli/system_controller.rb +65 -0
  10. data/app/models/lesli/user/request.rb +1 -0
  11. data/app/views/lesli/partials/_application-lesli-engines.html.erb +2 -2
  12. data/app/views/lesli/partials/_application-lesli-header.html.erb +2 -2
  13. data/db/migrate/v1.0/0010001210_create_lesli_account_activities.rb +1 -1
  14. data/db/migrate/v1.0/0010001510_create_lesli_account_requests.rb +45 -0
  15. data/db/migrate/v1.0/{0010003310_create_lesli_user_requests.rb → 0010003810_create_lesli_user_requests.rb} +3 -7
  16. data/lib/lesli/version.rb +2 -32
  17. data/lib/sass/lesli/layouts/application-component.scss +6 -17
  18. data/lib/sass/lesli/{elements/content.scss → layouts/application-container.scss} +0 -6
  19. data/lib/sass/lesli/layouts/application-engines.scss +57 -87
  20. data/lib/sass/lesli/layouts/application-header.scss +5 -0
  21. data/lib/sass/lesli/templates/application.scss +13 -5
  22. data/lib/sass/lesli/templates/dashboards.scss +16 -3
  23. data/lib/tasks/db.rb +1 -0
  24. data/lib/tasks/lesli_tasks.rake +6 -0
  25. data/lib/vue/application.js +53 -51
  26. data/lib/vue/layouts/application-component.vue +38 -0
  27. data/lib/vue/layouts/{dashboard-component.vue → application-container.vue} +2 -24
  28. data/lib/vue/layouts/application-engines.vue +8 -8
  29. data/lib/webpack/base.js +1 -1
  30. data/lib/webpack/engines.js +3 -5
  31. data/lib/webpack/version.js +38 -0
  32. metadata +17 -111
  33. /data/db/migrate/v1.0/{0010001310_create_lesli_account_logs.rb → 0010001410_create_lesli_account_logs.rb} +0 -0
  34. /data/db/migrate/v1.0/{0010004010_create_lesli_user_agents.rb → 0010003910_create_lesli_user_agents.rb} +0 -0
  35. /data/db/migrate/v1.0/{0010003610_create_lesli_user_logs.rb → 0010004010_create_lesli_user_logs.rb} +0 -0
@@ -47,7 +47,7 @@ module Lesli
47
47
  before_action :set_helpers_for_request
48
48
  before_action :set_customization
49
49
 
50
- after_action :log_user_requests
50
+ after_action :log_requests
51
51
 
52
52
  layout "lesli/layouts/application-lesli"
53
53
 
@@ -57,33 +57,58 @@ module Lesli
57
57
  "#{user_agent.platform} #{user_agent.os} - #{user_agent.browser} #{user_agent_version}"
58
58
  end
59
59
 
60
- # Track all user activity
61
- # this is disabled by default in the settings file
62
- def log_user_requests
60
+ def log_requests
61
+ log_account_requests
62
+ log_user_requests
63
+ end
64
+
65
+ def log_account_requests
63
66
  return unless Lesli.config.security.dig(:enable_analytics)
64
67
  return unless current_user
65
68
  return unless session[:user_session_id]
66
69
 
67
-
68
70
  # Try to save a unique record for this request configuration
69
- current_user.requests.upsert(
71
+ current_user.account.requests.upsert(
70
72
  {
71
73
  request_controller: controller_path,
72
74
  request_action: action_name,
73
75
  request_method: request.method,
74
- request_count: 1,
75
- session_id: session[:user_session_id]
76
+ request_count: 1
76
77
  },
77
78
 
78
79
  # group of columns to consider a request as unique
79
- unique_by: %i[request_controller request_action user_id session_id],
80
+ unique_by: %i[request_controller request_action created_at account_id],
80
81
 
81
82
  # if request id is not unique, increase the counter for this configuration
82
- on_duplicate: Arel.sql("request_count = lesli_user_requests.request_count + 1")
83
+ on_duplicate: Arel.sql("request_count = lesli_account_requests.request_count + 1")
83
84
  )
85
+ end
84
86
 
85
- # update the last used date for the current session
86
- #current_user.sessions.where(id: session[:user_session_id]).first&.touch(:last_used_at)
87
+ # Track all user activity
88
+ # this is disabled by default in the settings file
89
+ def log_user_requests
90
+ return unless Lesli.config.security.dig(:enable_analytics)
91
+ return unless current_user
92
+ return unless session[:user_session_id]
93
+
94
+ # Try to save a unique record for this request configuration
95
+ current_user.requests.upsert(
96
+ {
97
+ request_count: 1,
98
+ session_id: session[:user_session_id]
99
+ },
100
+
101
+ # group of columns to consider a request as unique
102
+ unique_by: %i[created_at user_id session_id],
103
+
104
+ # if request id is not unique
105
+ # - increase the counter for this configuration
106
+ # - update the datetime of the last request
107
+ on_duplicate: Arel.sql(
108
+ 'request_count = lesli_user_requests.request_count + 1,'\
109
+ 'updated_at = current_timestamp'
110
+ )
111
+ )
87
112
  end
88
113
 
89
114
  # Track user agents
@@ -280,10 +280,10 @@ module Lesli
280
280
 
281
281
  # 08.03 Audit engine
282
282
  def navigation_engine_audit(title: "Audit", subtitle: "Activity, logs, security and more")
283
- return unless defined? CloudAudit
283
+ return unless defined? LesliAudit
284
284
 
285
- navigation_engine_item(title, subtitle, "audit", cloud_audit.root_path,
286
- controller_path.include?("cloud_audit"))
285
+ navigation_engine_item(title, subtitle, "audit", lesli_audit.root_path,
286
+ controller_path.include?("lesli_audit"))
287
287
  end
288
288
 
289
289
  # INTEGRATIONS
@@ -42,7 +42,7 @@ module Lesli
42
42
  engines() if ENGINES.empty?
43
43
 
44
44
  # return specific property if requested
45
- return ENGINES[engine][property] unless property.blank?
45
+ return ENGINES[engine][property.to_sym] unless property.blank?
46
46
 
47
47
  # return the engine info
48
48
  return ENGINES[engine]
@@ -55,7 +55,7 @@ module Lesli
55
55
  # due we do not know the engine mounted path we have to look up for it every
56
56
  # time we load the html view so we can use the dynamic route from the main rails app
57
57
  # we use this in the url plugin
58
- ["Lesli", "LesliAdmin", "LesliBabel"].each do |engine|
58
+ LESLI_ENGINES.each do |engine|
59
59
  next unless Object.const_defined?(engine)
60
60
  ENGINES[engine]= {
61
61
  :code => engine.underscore,
@@ -76,5 +76,7 @@ module Lesli
76
76
  return "Lesli" if name == "Lesli"
77
77
  name.sub("Lesli", "")
78
78
  end
79
+
80
+ LESLI_ENGINES = ["Lesli", "LesliAdmin", "LesliBabel", "LesliAudit", "LesliBell"]
79
81
  end
80
82
  end
@@ -0,0 +1,37 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module Lesli
34
+ class Account::Request < ApplicationRecord
35
+ belongs_to :account
36
+ end
37
+ end
@@ -43,6 +43,7 @@ module Lesli
43
43
  has_many :roles
44
44
  has_many :files
45
45
  has_many :cronos
46
+ has_many :requests
46
47
  has_many :settings
47
48
  has_many :locations
48
49
  has_many :feedbacks
@@ -33,5 +33,70 @@ Building a better future, one line of code at a time.
33
33
  module Lesli
34
34
  class SystemController < ApplicationLesliRecord
35
35
  has_many :actions
36
+
37
+ def self.index matrix:false
38
+
39
+ # get a matrix of controllers and actions
40
+ c = SystemController.joins(:actions).select(
41
+ "lesli_system_controllers.engine as engine",
42
+ "lesli_system_controllers.reference as controller",
43
+ "lesli_system_controllers.name as controller_name",
44
+ "lesli_system_controllers.id as controller_id",
45
+ "lesli_system_controller_actions.name as action",
46
+ "lesli_system_controller_actions.id as action_id",
47
+ "case lesli_system_controller_actions.name
48
+ when 'index' then 1
49
+ when 'show' then 2
50
+ when 'new' then 3
51
+ when 'edit' then 4
52
+ when 'create' then 5
53
+ when 'update' then 6
54
+ when 'destroy' then 7
55
+ when 'options' then 8
56
+ else 9
57
+ end as importance
58
+ "
59
+ )
60
+ .where("lesli_system_controllers.deleted_at is NULL")
61
+ #.where("system_controller_actions.name in ('index', 'create', 'update', 'show', 'destroy')")
62
+ #.order("system_controllers.name, importance, system_controller_actions.name")
63
+ .order("importance DESC")
64
+
65
+ return c unless matrix
66
+
67
+ cc = {}
68
+
69
+ # convert the matrix to a hash of engines with controllers and available actions as values
70
+ # example:
71
+ # my_engine: { my_controller: [ my list of actions ]}
72
+ c.each do |c|
73
+
74
+ engine = c[:engine]
75
+ controller = c[:controller]
76
+
77
+ # create a uniq container for every action that belongs to a specific controller
78
+ if cc[engine].blank?
79
+ cc[engine] = {}
80
+ end
81
+
82
+ # create a uniq container for every action that belongs to a specific controller
83
+ if cc[engine][controller].blank?
84
+ cc[engine][controller] = {
85
+ id: c[:controller_id],
86
+ name: c[:controller_name],
87
+ actions: []
88
+ }
89
+ end
90
+
91
+ # push every action to his specic controller
92
+ cc[engine][controller][:actions].push({
93
+ id: c[:action_id],
94
+ action: c[:action]
95
+ })
96
+ end
97
+
98
+ return cc
99
+
100
+ end
36
101
  end
37
102
  end
@@ -33,5 +33,6 @@ Building a better future, one line of code at a time.
33
33
  module Lesli
34
34
  class User::Request < ApplicationRecord
35
35
  belongs_to :user
36
+ belongs_to :session
36
37
  end
37
38
  end
@@ -33,7 +33,7 @@ Building a better future, one line of code at a time.
33
33
  %>
34
34
 
35
35
  <%# Standard module selector %>
36
- <application-component-engines>
36
+ <lesli-application-engines>
37
37
 
38
38
  <%# Core %>
39
39
  <%= navigation_engine_admin %>
@@ -80,4 +80,4 @@ Building a better future, one line of code at a time.
80
80
  <%# Intelligence %>
81
81
  <%= navigation_engine_scraper %>
82
82
 
83
- </application-component-engines>
83
+ </lesli-application-engines>
@@ -43,7 +43,7 @@ Building a better future, one line of code at a time.
43
43
 
44
44
  <%# if custom header does not exists, use the main from core %>
45
45
  <% unless custom_header_exists %>
46
- <application-component-header
46
+ <lesli-application-header
47
47
  <%= "show-bell" if defined?(CloudBell) %>
48
48
  <%= "show-announcements" if defined?(CloudBell) %>
49
49
  <%= "show-focus" if defined?(CloudFocus) %>
@@ -75,5 +75,5 @@ Building a better future, one line of code at a time.
75
75
  </div>
76
76
  </div>
77
77
  <% end %>
78
- </application-component-header>
78
+ </lesli-application-header >
79
79
  <% end %>
@@ -33,7 +33,7 @@ Building a better future, one line of code at a time.
33
33
  class CreateLesliAccountActivities < ActiveRecord::Migration[6.0]
34
34
  def change
35
35
 
36
- gem_path = Lesli::System.engine("lesli")
36
+ gem_path = Lesli::System.engine("Lesli", "dir")
37
37
  table_base_structure = JSON.parse(File.read(File.join(gem_path, "db", "structure", "00000004_activities.json")))
38
38
 
39
39
  create_table :lesli_account_activities do |t|
@@ -0,0 +1,45 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails Development Platform.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ class CreateLesliAccountRequests < ActiveRecord::Migration[6.0]
34
+ def change
35
+ create_table :lesli_account_requests do |t|
36
+ t.string :request_controller
37
+ t.string :request_action
38
+ t.string :request_method
39
+ t.integer :request_count
40
+ t.date :created_at
41
+ end
42
+ add_reference(:lesli_account_requests, :account, foreign_key: { to_table: :lesli_accounts })
43
+ add_index(:lesli_account_requests, %i[request_controller request_action created_at account_id], unique: true, name: "lesli_account_requests_index")
44
+ end
45
+ end
@@ -33,16 +33,12 @@ Building a better future, one line of code at a time.
33
33
  class CreateLesliUserRequests < ActiveRecord::Migration[6.0]
34
34
  def change
35
35
  create_table :lesli_user_requests do |t|
36
- t.string :request_controller
37
- t.string :request_action
38
- t.string :request_method
39
36
  t.integer :request_count
40
- t.timestamps
37
+ t.date :created_at
38
+ t.datetime :updated_at
41
39
  end
42
-
43
40
  add_reference(:lesli_user_requests, :user, foreign_key: { to_table: :lesli_users })
44
41
  add_reference(:lesli_user_requests, :session, foreign_key: { to_table: :lesli_user_sessions })
45
- #add_index(:lesli_user_requests, %i[request_controller request_action user_id], unique: true, name: "lesli_user_requests_index")
46
- add_index(:lesli_user_requests, %i[request_controller request_action user_id session_id], unique: true, name: "lesli_user_requests_index")
42
+ add_index(:lesli_user_requests, %i[created_at user_id session_id], unique: true, name: "lesli_user_requests_index")
47
43
  end
48
44
  end
data/lib/lesli/version.rb CHANGED
@@ -1,34 +1,4 @@
1
- =begin
2
- Lesli
3
-
4
- Copyright (c) 2023, Lesli Technologies, S. A.
5
-
6
- This program is free software: you can redistribute it and/or modify
7
- it under the terms of the GNU General Public License as published by
8
- the Free Software Foundation, either version 3 of the License, or
9
- (at your option) any later version.
10
-
11
- This program is distributed in the hope that it will be useful,
12
- but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- GNU General Public License for more details.
15
-
16
- You should have received a copy of the GNU General Public License
17
- along with this program. If not, see http://www.gnu.org/licenses/.
18
-
19
- Lesli · Ruby on Rails SaaS Development Framework.
20
-
21
- Made with ♥ by https://www.lesli.tech
22
- Building a better future, one line of code at a time.
23
-
24
- @contact hello@lesli.tech
25
- @website https://www.lesli.dev
26
- @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
27
-
28
- // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
29
- // ·
30
- =end
31
-
32
1
  module Lesli
33
- VERSION = "5.0.0"
2
+ VERSION = "5.0.1"
3
+ BUILD = "1696568414"
34
4
  end
@@ -17,7 +17,7 @@ GNU General Public License for more details.
17
17
  You should have received a copy of the GNU General Public License
18
18
  along with this program. If not, see http://www.gnu.org/licenses/.
19
19
 
20
- Lesli · Ruby on Rails SaaS development platform.
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
21
 
22
22
  Made with ♥ by https://www.lesli.tech
23
23
  Building a better future, one line of code at a time.
@@ -27,24 +27,13 @@ Building a better future, one line of code at a time.
27
27
  @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
28
 
29
29
  // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
- // ·
31
-
32
- */
33
-
34
-
35
30
  // ·
36
- #lesli-application {
37
- //padding-top: var(--lesli-header-height);
38
- display: flex;
39
- flex-wrap: wrap;
40
- }
31
+ */
41
32
 
42
33
 
43
34
  // ·
44
- section.lesli-element-content {
45
- // margin-left: var(--lesli-sidebar-width);
46
- // max-width: calc(100% - var(--lesli-sidebar-width));
47
- // min-height: calc(100vh - var(--lesli-header-height) - var(--lesli-footer-height));
48
- // min-height: calc(100vh - var(--lesli-header-height)); // footer is not enable
49
- // background-color: aquamarine;
35
+ .lesli-application-component {
36
+ border-radius: .6rem;
37
+ box-shadow: $lesli-box-shadow;
38
+ background-color: lesli-css-color(solid, white);
50
39
  }
@@ -29,9 +29,3 @@ Building a better future, one line of code at a time.
29
29
  // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
30
  // ·
31
31
  */
32
-
33
- div.lesli-element-content {
34
- border-radius: .6rem;
35
- box-shadow: $lesli-box-shadow;
36
- background-color: lesli-css-color(solid, white);
37
- }
@@ -17,7 +17,7 @@ GNU General Public License for more details.
17
17
  You should have received a copy of the GNU General Public License
18
18
  along with this program. If not, see http://www.gnu.org/licenses/.
19
19
 
20
- Lesli · Ruby on Rails SaaS development platform.
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
21
 
22
22
  Made with ♥ by https://www.lesli.tech
23
23
  Building a better future, one line of code at a time.
@@ -27,8 +27,7 @@ Building a better future, one line of code at a time.
27
27
  @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
28
 
29
29
  // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
- // ·
31
-
30
+ // ·
32
31
  */
33
32
 
34
33
  .lesli-application-engines {
@@ -38,118 +37,89 @@ Building a better future, one line of code at a time.
38
37
  position: fixed;
39
38
  z-index: 98;
40
39
 
41
- .engines {
40
+ .engines-container {
42
41
  width: 100%;
43
42
  height: 100%;
44
- padding: 1.3rem;
43
+ padding: 1.6rem;
45
44
 
46
45
  overflow-y: scroll;
47
46
  margin-top: var(--lesli-header-height);
48
47
  background-color: var(--lesli-color-background);
49
48
  @include lesli-css-scrollbar(hide);
50
49
 
51
- // engine
52
- a {
50
+ .engines {
53
51
  width: 100%;
54
- height: 105px;
52
+ margin: 0 auto;
53
+ max-width: 1408px;
54
+
55
55
  display: flex;
56
- text-align: left;
56
+ flex-wrap: wrap;
57
57
  align-items: center;
58
- padding: 1rem .4rem;
59
- margin-bottom: 1rem;
60
- border-radius: .8rem;
61
- border: 2px solid transparent;
62
- background-color: lesli-css-color(silver, 100);
63
- box-shadow: 0px 1px 4px 0px rgba(0, 0, 0, 0.1);
64
- transition: all ease-in-out .4s;
65
- box-shadow: $lesli-box-shadow;
66
- width: 320px;
67
- height: 263px;
68
58
  flex-direction: column;
69
59
  justify-content: center;
70
- margin-bottom: 2rem;
71
- div {
72
- text-align: center;
73
- }
74
- &:hover {
75
- background-color: #F0F4FF;
76
- }
77
- &.is-active {
78
- background-color: #F0F4FF;
79
- border-color: var(--lesli-color-primary);
80
- box-shadow: none;
81
- }
82
- }
83
60
 
84
- // engine icon
85
- svg {
86
- margin-right: .4rem;
87
- fill: $primary;
88
- }
61
+ // engine link
62
+ a {
63
+ width: 100%;
64
+ height: 200px;
65
+ display: block;
89
66
 
90
- // title
91
- span {
92
- font-weight: 600;
93
- font-size: 20px;
94
- }
67
+ text-align: center;
68
+ padding: 1rem .4rem;
69
+ margin-bottom: 2rem;
70
+ border-radius: .5rem;
71
+ border: transparent 1px solid;
72
+ box-shadow: $lesli-box-shadow;
73
+ background-color: lesli-css-color(silver, 100);
74
+ background-color: #FFFFFF;
75
+ transition: all ease-in-out .4s;
76
+
77
+ &:hover {
78
+ border-color: var(--lesli-color-primary);
79
+ }
95
80
 
96
- // subtitle
97
- p {
98
- font-size: 14;
99
- }
81
+ &.is-active {
82
+ background-color: #F0F4FF;
83
+ border-color: var(--lesli-color-primary);
84
+ }
100
85
 
101
- span, p {
102
- color: var(--lesli-color-primary);
103
- }
86
+ // engine logo
87
+ svg {
88
+ margin-right: .4rem;
89
+ fill: var(--lesli-color-primary);
90
+ }
104
91
 
105
- // close button
106
- button {
107
- width: 100%;
108
- }
109
- }
110
- }
92
+ // engine description
93
+ p {
94
+ font-size: 14;
95
+ }
111
96
 
112
- @include lesli-css-breakpoint-tablet() {
113
- .lesli-application-engines {
114
- .container {
115
- display: flex;
116
- flex-wrap: wrap;
117
- align-content: flex-start;
118
- justify-content: space-between;
119
- margin-left: var(--lesli-sidebar-width);
120
- max-width: calc(100% - var(--lesli-sidebar-width));
97
+ // engine name
98
+ span {
99
+ font-weight: 600;
100
+ font-size: 20px;
101
+ }
121
102
 
122
- // engine
123
- a {
124
- width: 320px;
125
- height: 263px;
126
- flex-direction: column;
127
- justify-content: center;
128
- margin-bottom: 2rem;
129
- div {
130
- text-align: center;
103
+ span, p {
104
+ color: var(--lesli-color-primary);
131
105
  }
132
106
  }
107
+ }
133
108
 
134
- // engine icon
135
- svg {
136
- margin-right: 0;
137
- margin-bottom: 1rem;
138
- }
109
+ // close button
110
+ button {
111
+ width: 100%;
139
112
  }
140
113
  }
141
114
  }
142
115
 
143
- @include lesli-css-breakpoint-desktop() {
144
- .lesli-application-engines {
145
- .container {
146
- justify-content: flex-start;
147
116
 
148
- // engine
149
- a {
150
- margin-right: 1.4rem;
151
- margin-bottom: 1.4rem;
152
- }
117
+ @include lesli-css-breakpoint-tablet() {
118
+ .lesli-application-engines .engines-container .engines {
119
+ flex-direction: row;
120
+ a {
121
+ width: 320px;
122
+ margin: 1rem;
153
123
  }
154
124
  }
155
125
  }
@@ -139,6 +139,11 @@ header.lesli-application-header {
139
139
 
140
140
  .dropdown-content {
141
141
  width: 100%;
142
+ padding: 0;
143
+
144
+ hr.dropdown-divider {
145
+ margin: 0;
146
+ }
142
147
  }
143
148
  }
144
149