lesli 5.0.0 → 5.0.1

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 (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