lesli 5.0.1 → 5.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/lesli_manifest.js +7 -4
  3. data/app/assets/fonts/lesli/Domine/Domine-VariableFont_wght.ttf +0 -0
  4. data/app/assets/fonts/lesli/Domine/OFL.txt +2 -0
  5. data/app/assets/javascripts/lesli/users/passwords.js +776 -0
  6. data/app/assets/javascripts/lesli/users/registrations.js +776 -0
  7. data/app/assets/javascripts/lesli/users/sessions.js +776 -1
  8. data/app/assets/stylesheets/lesli/users/passwords.scss +5 -6
  9. data/app/assets/stylesheets/lesli/users/registrations.scss +5 -6
  10. data/app/assets/stylesheets/lesli/users/sessions.scss +5 -10
  11. data/app/controllers/lesli/application_lesli_controller.rb +0 -1
  12. data/app/controllers/lesli/interfaces/application/logger.rb +9 -9
  13. data/app/controllers/lesli/roles_controller.rb +43 -0
  14. data/{lib/sass/lesli/devise/registrations.scss.erb → app/controllers/lesli/users_controller.rb} +18 -23
  15. data/app/controllers/users/registrations_controller.rb +137 -58
  16. data/app/helpers/lesli/assets_helper.rb +2 -2
  17. data/app/helpers/lesli/general_helper.rb +1 -1
  18. data/app/helpers/lesli/navigation_helper.rb +7 -10
  19. data/app/helpers/lesli/system_helper.rb +1 -1
  20. data/app/lib/lesli/system.rb +7 -3
  21. data/app/mailers/lesli/application_lesli_mailer.rb +199 -0
  22. data/app/mailers/lesli/application_mailer.rb +7 -0
  23. data/app/mailers/lesli/devise_mailer.rb +33 -0
  24. data/app/models/concerns/user_guard.rb +3 -4
  25. data/app/models/lesli/account.rb +29 -0
  26. data/{lib/sass/lesli/pages/passes.scss → app/models/lesli/descriptor.rb} +14 -8
  27. data/app/models/lesli/role.rb +90 -0
  28. data/app/models/lesli/system_controller.rb +1 -0
  29. data/app/models/lesli/user/detail.rb +55 -0
  30. data/{lib/sass/lesli/pages/otps.scss → app/models/lesli/user/role.rb} +13 -9
  31. data/app/models/lesli/user.rb +4 -3
  32. data/app/services/lesli/role_service.rb +45 -0
  33. data/app/services/lesli/user_service.rb +69 -0
  34. data/app/views/devise/passwords/new.html.erb +72 -12
  35. data/app/views/devise/registrations/new.html.erb +146 -28
  36. data/app/views/devise/sessions/new.html.erb +11 -78
  37. data/app/views/devise/shared/_links.html.erb +96 -25
  38. data/app/views/lesli/emails/devise_mailer/confirmation_instructions.html.erb +23 -0
  39. data/app/views/lesli/emails/user_mailer/invitation.html.erb +23 -0
  40. data/app/views/lesli/layouts/application-devise.html.erb +1 -1
  41. data/app/views/lesli/layouts/application-public.html.erb +2 -2
  42. data/app/views/lesli/layouts/mailer.html.erb +13 -0
  43. data/app/views/lesli/layouts/mailer.text.erb +1 -0
  44. data/app/views/lesli/partials/_application-lesli-header.html.erb +27 -41
  45. data/app/views/lesli/partials/_application-lesli-javascript.html.erb +10 -6
  46. data/app/views/lesli/partials/_application-public-javascript.html.erb +12 -8
  47. data/{lib/sass/lesli/devise/confirmations.scss.erb → app/views/lesli/wrappers/_application-devise-simple.erb} +30 -46
  48. data/app/views/lesli/wrappers/{_application-auth.html.erb → _application-devise.html.erb} +15 -0
  49. data/config/initializers/{lesli_defaults.rb → lesli.rb} +4 -2
  50. data/config/locales/translations.en.yml +7 -0
  51. data/config/locales/translations.es.yml +7 -0
  52. data/config/routes.rb +22 -17
  53. data/db/migrate/v1.0/0010000210_create_lesli_roles.rb +1 -1
  54. data/db/{tables/0010003010_create_user_details.rb → migrate/v1.0/0010003010_create_lesli_user_details.rb} +6 -6
  55. data/db/{tables/0010003510_create_user_roles.rb → migrate/v1.0/0010003410_create_lesli_user_roles.rb} +4 -4
  56. data/db/{tables/0010005010_create_descriptors.rb → migrate/v1.0/0010005010_create_lesli_descriptors.rb} +5 -6
  57. data/db/{tables/0010005110_create_descriptor_privileges.rb → migrate/v1.0/0010005110_create_lesli_descriptor_privileges.rb} +8 -7
  58. data/db/{tables/0010005210_create_descriptor_activities.rb → migrate/v1.0/0010005210_create_lesli_descriptor_activities.rb} +6 -8
  59. data/db/seeds.rb +0 -2
  60. data/lib/lesli/engine.rb +25 -2
  61. data/lib/lesli/routing.rb +26 -0
  62. data/lib/lesli/version.rb +2 -2
  63. data/lib/lesli.rb +1 -0
  64. data/lib/{sass/lesli/pages/mfas.scss → mailer_previews/devise_mailer_preview.rb} +12 -6
  65. data/lib/sass/lesli/bulma/loader.scss +3 -0
  66. data/lib/sass/lesli/elements/header.scss +1 -1
  67. data/lib/sass/lesli/fonts/families.scss +3 -3
  68. data/lib/sass/lesli/layouts/application-container.scss +4 -0
  69. data/lib/sass/lesli/{devise/passwords.scss.erb → pages/devise-simple.scss} +38 -38
  70. data/lib/sass/lesli/{templates → pages}/devise.scss +4 -26
  71. data/lib/sass/lesli/settings/variables.scss +1 -1
  72. data/lib/sass/lesli/templates/application.scss +8 -4
  73. data/lib/sass/lesli/templates/dashboards.scss +8 -0
  74. data/lib/sass/lesli/templates/public.scss +2 -3
  75. data/lib/tasks/lesli/controllers.rake +33 -0
  76. data/lib/tasks/lesli/db.rake +88 -0
  77. data/lib/tasks/lesli/git.rake +74 -0
  78. data/lib/tasks/lesli_tasks.rake +70 -20
  79. data/lib/vue/devise/registrations.js +10 -15
  80. data/lib/vue/layouts/application-container.vue +10 -2
  81. data/lib/vue/layouts/application-header.vue +10 -3
  82. data/lib/vue/stores/account.js +113 -0
  83. data/lib/vue/stores/role.js +243 -0
  84. data/lib/vue/stores/translations.json +86 -0
  85. data/lib/vue/stores/user.js +102 -0
  86. data/lib/{sass/lesli/devise/sessions.scss → vue/translation.js} +14 -5
  87. data/lib/webpack/base.js +2 -2
  88. data/lib/webpack/core.js +2 -0
  89. data/readme.md +74 -55
  90. metadata +196 -51
  91. data/app/assets/fonts/lesli/Domine/Domine-Bold.ttf +0 -0
  92. data/app/assets/fonts/lesli/Domine/Domine-Regular.ttf +0 -0
  93. data/app/assets/stylesheets/lesli/users/devise.scss +0 -32
  94. data/app/controllers/lesli/profiles_controller.rb +0 -60
  95. data/app/helpers/lesli/profiles_helper.rb +0 -4
  96. data/app/models/lesli/profile.rb +0 -4
  97. data/app/views/lesli/devise/sessions/_form.html.erb +0 -17
  98. data/app/views/lesli/devise/sessions/_session.html.erb +0 -2
  99. data/app/views/lesli/devise/sessions/edit.html.erb +0 -10
  100. data/app/views/lesli/devise/sessions/index.html.erb +0 -14
  101. data/app/views/lesli/devise/sessions/new.html.erb +0 -9
  102. data/app/views/lesli/devise/sessions/show.html.erb +0 -10
  103. data/app/views/lesli/profiles/_form.html.erb +0 -17
  104. data/app/views/lesli/profiles/_profile.html.erb +0 -2
  105. data/app/views/lesli/profiles/edit.html.erb +0 -10
  106. data/app/views/lesli/profiles/index.html.erb +0 -14
  107. data/app/views/lesli/profiles/new.html.erb +0 -9
  108. data/app/views/lesli/profiles/show.html.erb +0 -10
  109. data/lib/sass/lesli/pages/dashboards.scss +0 -57
  110. data/lib/tasks/db.rb +0 -76
  111. data/lib/vue/stores/profile.js +0 -90
  112. data/lib/vue/stores/workflow2.js +0 -345
  113. data/lib/vue/stores/workflows/actions.js +0 -327
  114. data/lib/vue/stores/workflows/associations.js +0 -130
  115. data/lib/vue/stores/workflows/checks.js +0 -210
  116. /data/lib/vue/stores/{announcements.js → entities/announcements.js} +0 -0
  117. /data/lib/vue/stores/{dashboard.js → entities/dashboard.js} +0 -0
  118. /data/lib/vue/stores/{workflow.js → entities/workflow.js} +0 -0
  119. /data/lib/vue/stores/{cloud-bell → panels}/notification.js +0 -0
  120. /data/lib/vue/stores/{firebase.js → services/firebase.js} +0 -0
@@ -1,16 +1,76 @@
1
- <h2>Forgot your password?</h2>
1
+ <%
2
+ =begin
2
3
 
3
- <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
4
- <%= render "devise/shared/error_messages", resource: resource %>
4
+ Lesli
5
5
 
6
- <div class="field">
7
- <%= f.label :email %><br />
8
- <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
9
- </div>
6
+ Copyright (c) 2023, Lesli Technologies, S. A.
10
7
 
11
- <div class="actions">
12
- <%= f.submit "Send me reset password instructions" %>
13
- </div>
14
- <% end %>
8
+ This program is free software: you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation, either version 3 of the License, or
11
+ (at your option) any later version.
12
+
13
+ This program is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with this program. If not, see http://www.gnu.org/licenses/.
20
+
21
+ Lesli · Ruby on Rails SaaS Development Framework.
22
+
23
+ Made with ♥ by https://www.lesli.tech
24
+ Building a better future, one line of code at a time.
25
+
26
+ @contact hello@lesli.tech
27
+ @website https://www.lesli.tech
28
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
15
29
 
16
- <%= render "devise/shared/links" %>
30
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
31
+ // ·
32
+ =end
33
+ %>
34
+
35
+
36
+ <%= render("lesli/wrappers/application-devise-simple",
37
+ title: "Forgot your password?") do %>
38
+
39
+ <form class="has-text-centered" @submit="postPasswordNew" method="post">
40
+
41
+ <div class="field mb-4">
42
+ <p class="label mb-2">
43
+ Enter your email address you use in Lesli.
44
+ We'll send instructions for setting a new password to your email.
45
+ </p>
46
+ <p v-if="notification.show" :class="[notification.type, 'is-size-5', 'mt-2']">
47
+ {{ notification.message }}
48
+ </p>
49
+ <div class="control has-icons-left has-icons-right">
50
+ <input
51
+ class="input"
52
+ type="email"
53
+ v-model="sign_in.email"
54
+ required="true"
55
+ name="user_email"
56
+ placeholder="email"
57
+ />
58
+ <span :class="['icon', 'is-small', 'is-left', `has-text-${notification.type}`]">
59
+ <i class="ri-mail-lock-line"></i>
60
+ </span>
61
+ </div>
62
+ </div>
63
+
64
+ <div class="field">
65
+ <div class="control">
66
+ <button
67
+ type="submit"
68
+ :class="['button', 'is-primary', 'mb-2', {'is-loading':loading}]">
69
+ Send password reset instructions
70
+ </button>
71
+ </div>
72
+ </div>
73
+ </form>
74
+
75
+ <%= render("devise/shared/links", magic_link:true, otp:true, login:true) %>
76
+ <% end %>
@@ -1,29 +1,147 @@
1
- <h2>Sign up</h2>
2
-
3
- <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
4
- <%= render "devise/shared/error_messages", resource: resource %>
5
-
6
- <div class="field">
7
- <%= f.label :email %><br />
8
- <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
9
- </div>
10
-
11
- <div class="field">
12
- <%= f.label :password %>
13
- <% if @minimum_password_length %>
14
- <em>(<%= @minimum_password_length %> characters minimum)</em>
15
- <% end %><br />
16
- <%= f.password_field :password, autocomplete: "new-password" %>
17
- </div>
18
-
19
- <div class="field">
20
- <%= f.label :password_confirmation %><br />
21
- <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
22
- </div>
23
-
24
- <div class="actions">
25
- <%= f.submit "Sign up" %>
26
- </div>
27
- <% end %>
1
+ <%
2
+ =begin
3
+
4
+ Lesli
5
+
6
+ Copyright (c) 2023, Lesli Technologies, S. A.
7
+
8
+ This program is free software: you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation, either version 3 of the License, or
11
+ (at your option) any later version.
12
+
13
+ This program is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with this program. If not, see http://www.gnu.org/licenses/.
20
+
21
+ Lesli · Ruby on Rails SaaS Development Framework.
28
22
 
29
- <%= render "devise/shared/links" %>
23
+ Made with by https://www.lesli.tech
24
+ Building a better future, one line of code at a time.
25
+
26
+ @contact hello@lesli.tech
27
+ @website https://www.lesli.tech
28
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
29
+
30
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
31
+ // ·
32
+ =end
33
+ %>
34
+
35
+
36
+ <%= render("lesli/wrappers/application-devise", title:"Create account to discover Lesli") do %>
37
+
38
+ <%# Log in form %>
39
+ <form @submit.prevent="postRegistration" method="post">
40
+ <div class="field mb-4">
41
+ <label for="user_email" class="label">E-mail address</label>
42
+ <div class="control has-icons-left has-icons-right">
43
+ <input
44
+ id="user_email"
45
+ name="user_email"
46
+ type="email"
47
+ ref="email"
48
+ :class="['input', `is-${notification.type}`]"
49
+ placeholder="hello@lesli.cloud"
50
+ v-model="sign_up.email"
51
+ @input="typing">
52
+ <span
53
+ class="icon is-small is-left"
54
+ :class="['icon', 'is-small', 'is-left', `has-text-${notification.type}`]">
55
+ <i class="ri-mail-fill"></i>
56
+ </span>
57
+ </div>
58
+ </div>
59
+ <div class="field mb-5">
60
+ <label for="user_password" class="label">Password</label>
61
+ <div class="control has-icons-left has-icons-right">
62
+ <input
63
+ id="user_password"
64
+ name="user_password"
65
+ type="password"
66
+ ref="password"
67
+ :class="['input', `is-${notification.type}`]"
68
+ placeholder="* * * * * * *"
69
+ v-model="sign_up.password"
70
+ @input="typing">
71
+ <span
72
+ :class="['icon', 'is-small', 'is-left', `has-text-${notification.type}`]">
73
+ <i class="ri-key-fill"></i>
74
+ </span>
75
+ <span
76
+ @click="togglePasswordInput()"
77
+ :class="['icon', 'is-small', 'is-right', `has-text-${notification.type}`]">
78
+ <i class="ri-eye-fill"></i>
79
+ </span>
80
+ </div>
81
+ <p v-cloak v-if="notification.show" :class="['help', `is-${notification.type}`]">
82
+ {{ notification.message }}
83
+ </p>
84
+ </div>
85
+ <div class="field mb-5">
86
+ <p>Password needs to contain:</p>
87
+ <ul class="pl-3 password-requirements">
88
+ <li :class="[
89
+ 'icon-text', 'is-block', {
90
+ 'has-text-danger': password_uppercase == 1,
91
+ 'has-text-success': password_uppercase == 2
92
+ }
93
+ ]">
94
+ <span class="text">
95
+ &bull; minimum one uppercase letter
96
+ </span>
97
+ <span class="icon">
98
+ <i class="ri-eye-fill"></i>
99
+ </span>
100
+ </li>
101
+ <li :class="[
102
+ 'icon-text', 'is-block', {
103
+ 'has-text-danger': password_symbol == 1,
104
+ 'has-text-success': password_symbol == 2
105
+ }
106
+ ]">
107
+ <span class="text">
108
+ &bull; one symbol
109
+ </span>
110
+ <span class="icon">
111
+ <i class="ri-eye-fill"></i>
112
+ </span>
113
+ </li>
114
+ <li :class="[
115
+ 'icon-text', 'is-block', {
116
+ 'has-text-danger': password_number == 1,
117
+ 'has-text-success': password_number == 2
118
+ }
119
+ ]">
120
+ <span class="text">
121
+ &bull; one number
122
+ </span>
123
+ <span class="icon">
124
+ <i class="ri-eye-fill"></i>
125
+ </span>
126
+ </li>
127
+ </ul>
128
+ </div>
129
+ <div class="field">
130
+ <p class="terms">
131
+ By creating an account, you agree to our <a><u><b>Terms</b></u></a> and have
132
+ read and acknowledge the <a><u><b>Global Privacy Statement</b></u></a>
133
+ </p>
134
+ </div>
135
+ <div class="field">
136
+ <div class="control is-fullwidth">
137
+ <input type="submit" class="button is-primary is-fullwidth mb-2" value="Create account">
138
+ <p class="account has-text-centered">
139
+ Already have an account?
140
+ <%= link_to new_user_session_path, :class => "has-text-primary" do %>
141
+ <u><b>Log in</b></u>
142
+ <% end %>
143
+ </p>
144
+ </div>
145
+ </div>
146
+ </form>
147
+ <% end %>
@@ -18,7 +18,7 @@ GNU General Public License for more details.
18
18
  You should have received a copy of the GNU General Public License
19
19
  along with this program. If not, see http://www.gnu.org/licenses/.
20
20
 
21
- Lesli · Ruby on Rails SaaS development platform.
21
+ Lesli · Ruby on Rails SaaS Development Framework.
22
22
 
23
23
  Made with ♥ by https://www.lesli.tech
24
24
  Building a better future, one line of code at a time.
@@ -32,20 +32,7 @@ Building a better future, one line of code at a time.
32
32
  =end
33
33
  %>
34
34
 
35
- <%= render("lesli/wrappers/application-auth") do %>
36
-
37
- <%# Logo container %>
38
- <div class="logo has-text-centered mb-4">
39
- <%= image_tag(
40
- "#{lesli_instance_code}/brand/app-auth.svg", # dynamic path to the instance main logo
41
- :class => "#{lesli_instance_code}-logo", # dynamic class according to the instance
42
- :alt => "Main logo")
43
- %>
44
- <h1 class="has-text-primary">
45
- <%#= I18n.t("core.users/sessions.view_text_welcome") %>
46
- Welcome to Lesli
47
- </h1>
48
- </div>
35
+ <%= render("lesli/wrappers/application-devise", title:"Welcome to Lesli") do %>
49
36
 
50
37
  <%# Log in form %>
51
38
  <form @submit="postLogin" method="post">
@@ -62,9 +49,7 @@ Building a better future, one line of code at a time.
62
49
  placeholder="hello@lesli.tech"
63
50
  v-model="sign_in.email"
64
51
  @input="typing">
65
- <span
66
- class="icon is-small is-left"
67
- :class="['icon', 'is-small', 'is-left', `has-text-${notification.type}`]">
52
+ <span :class="['icon', 'is-small', 'is-left', `has-text-${notification.type}`]">
68
53
  <i class="ri-user-line"></i>
69
54
  </span>
70
55
  </div>
@@ -82,8 +67,7 @@ Building a better future, one line of code at a time.
82
67
  placeholder="* * * * * * *"
83
68
  v-model="sign_in.password"
84
69
  @input="typing">
85
- <span
86
- :class="['icon', 'is-small', 'is-left', `has-text-${notification.type}`]">
70
+ <span :class="['icon', 'is-small', 'is-left', `has-text-${notification.type}`]">
87
71
  <i class="ri-key-fill"></i>
88
72
  </span>
89
73
  <span
@@ -97,17 +81,6 @@ Building a better future, one line of code at a time.
97
81
  </p>
98
82
  </div>
99
83
 
100
- <%#
101
- <div class="field mb-4">
102
- <div class="control">
103
- <label class="checkbox">
104
- <input type="checkbox" />
105
- Stay logged in
106
- </label>
107
- </div>
108
- </div>
109
- %>
110
-
111
84
  <div class="field mb-6">
112
85
  <div class="control is-fullwidth">
113
86
  <button
@@ -115,64 +88,24 @@ Building a better future, one line of code at a time.
115
88
  :class="['button', 'is-primary', 'is-fullwidth', 'mb-2', {'is-loading':loading}]">
116
89
  Log in
117
90
  </button>
118
- <%# if Rails.application.config.dig(:lesli, :security, :allow_registration) %>
91
+ <% if Lesli.config.security.dig(:allow_registration) %>
119
92
  <p class="account has-text-centered">
120
93
  Still not registered?
121
- <%= link_to "new_registration_path", :class => "has-text-primary" do %>
94
+ <%= link_to(new_user_registration_path, :class => "has-text-primary") do %>
122
95
  <u><b>Create account</b></u>
123
96
  <% end %>
124
97
  </p>
125
- <%# end %>
98
+ <% end %>
126
99
  </div>
127
100
  </div>
128
101
 
129
102
  <div class="field mb-6" v-if="false">
130
- <p class="message has-text-success">Registration successfully done. Please check your E-mail to activate your account.</p>
103
+ <p class="message has-text-success">
104
+ Registration successfully done. Please check your E-mail to activate your account.
105
+ </p>
131
106
  </div>
132
107
  </form>
133
108
 
134
- <div class="links">
135
- <%= link_to "new_user_password_path", :class => "password-new" do %>
136
- <span class="icon mr-2">
137
- <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
138
- <path d="M10 4.75C8.55296 4.75 7.375 5.92796 7.375 7.375V8.25C6.89155 8.25 6.5 8.64155 6.5 9.125V13.5C6.5 13.9834 6.89155 14.375 7.375 14.375H12.625C13.1084 14.375 13.5 13.9834 13.5 13.5V9.125C13.5 8.64155 13.1084 8.25 12.625 8.25V7.375C12.625 5.92796 11.447 4.75 10 4.75ZM11.75 12.625H8.25V10H11.75V12.625ZM9.125 8.25V7.375C9.125 6.89264 9.51764 6.5 10 6.5C10.4824 6.5 10.875 6.89264 10.875 7.375V8.25H9.125Z" fill="#112A62"/>
139
- <path d="M16.7549 3.14324C13.4431 -0.120437 8.34511 -0.489197 4.62839 2.0123L4.61745 0.577295C4.61526 0.336669 4.41839 0.141979 4.17667 0.143071L3.30167 0.149633C3.05996 0.151821 2.86527 0.348697 2.86745 0.590409L2.89151 3.86501C2.89479 4.21938 3.11026 4.53656 3.43729 4.67001C3.76542 4.80345 4.14056 4.72579 4.38993 4.47314C7.43941 1.3811 12.4343 1.34386 15.5264 4.39001C17.8867 6.71533 18.5308 10.2132 17.19 13.2111C17.0948 13.4244 17.1725 13.6738 17.3814 13.7799L18.1623 14.1791C18.3833 14.2917 18.6633 14.201 18.7661 13.9746C20.434 10.2996 19.6531 5.99904 16.7546 3.14304L16.7549 3.14324Z" fill="#112A62"/>
140
- <path d="M16.5625 15.3296C16.2333 15.1962 15.8593 15.2739 15.6099 15.5265C12.5615 18.6197 7.56633 18.6569 4.47345 15.6096C2.11314 13.2843 1.46905 9.78647 2.80986 6.78851C2.90502 6.57523 2.82736 6.32587 2.61846 6.21978L1.83751 5.82055C1.61657 5.7079 1.33656 5.79868 1.23377 6.02509C-0.43528 9.70121 0.346732 14.0017 3.24518 16.8566C6.55702 20.1203 11.655 20.489 15.3717 17.9876L15.3826 19.4215C15.3848 19.6632 15.5817 19.8579 15.8234 19.8557L16.6984 19.8491C16.9401 19.8469 17.1348 19.6501 17.1326 19.4083L17.1086 16.1337C17.1053 15.7805 16.8898 15.4633 16.5628 15.3298L16.5625 15.3296Z" fill="#112A62"/>
141
- </svg>
142
- </span>
143
- <span>Reset password</span>
144
- <% end %>
145
-
146
-
147
- <%# Dynamic check if instance allow users to login through magic links (passes) %>
148
- <%# if Rails.application.config.lesli.dig(:security, :enable_login_link) %>
149
- <%= link_to "pass_path", :class => "pass-new" do %>
150
- <span class="icon mr-2">
151
- <svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
152
- <path d="M17.5 7.25005H15.25C14.6748 7.25005 14.0996 7.34967 13.5498 7.52545C14.1748 8.00005 14.7002 8.57525 15.0996 9.25005H15.25H17.5C19.2998 9.25005 20.75 10.7003 20.75 12.5001C20.75 14.2999 19.2998 15.7501 17.5 15.7501H15.25C15.0996 15.7501 14.9248 15.7247 14.7754 15.7003H14.75C13.2002 15.4503 12 14.125 12 12.5C12 11.5 11.3496 10.6504 10.4502 10.375C10.1504 11.0254 10 11.75 10 12.5C10 15.4005 12.3496 17.75 15.25 17.75H17.5C20.4005 17.75 22.75 15.4004 22.75 12.5C22.75 9.5996 20.4004 7.25 17.5 7.25V7.25005Z" fill="#112A62"/>
153
- <path d="M9.9248 15.7502H7.5C5.7002 15.7502 4.25 14.3 4.25 12.5002C4.25 10.7004 5.7002 9.25024 7.5 9.25024H9.75C11.5498 9.25024 13 10.7004 13 12.5002C13 13.5002 13.6504 14.3498 14.5498 14.6252C14.8496 13.9748 15 13.2502 15 12.5002C15 9.59974 12.6504 7.25024 9.75 7.25024H7.5C4.5995 7.25024 2.25 9.59984 2.25 12.5002C2.25 15.4006 4.5996 17.7502 7.5 17.7502H9.75C10.3252 17.7502 10.9004 17.6506 11.4502 17.4504C10.8496 17.0002 10.3252 16.4006 9.9248 15.7502Z" fill="#112A62"/>
154
- </svg>
155
- </span>
156
- <span>Magic link</span>
157
- <% end %>
158
- <%# end %>
159
-
109
+ <%= render("devise/shared/links", password_reset:true, magic_link:true, otp:true) %>
160
110
 
161
- <%# Dynamic check if instance allow users to login through one time passwords %>
162
- <%# if Rails.application.config.lesli.dig(:security, :enable_login_otp) %>
163
- <%= link_to "otp_path", :class => "otp-new" do %>
164
- <span class="con mr-2">
165
- <svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
166
- <path d="M18.75 7.03132C18.7509 5.48834 18.1806 3.99907 17.1494 2.85057C16.1172 1.70312 14.6982 0.976544 13.1631 0.813469C11.629 0.649407 10.0879 1.05956 8.83688 1.96387C7.58688 2.86817 6.7148 4.20312 6.3896 5.71187C6.06538 7.22067 6.3105 8.79687 7.0771 10.1356C7.84468 11.4745 9.081 12.4823 10.5469 12.9646V14.0623H11.3281V13.1677C12.1025 13.3191 12.8974 13.3191 13.6719 13.1677V22.4607L12.5 23.3396L11.3281 22.4607V22.035L12.3867 20.9803C12.4609 20.907 12.5019 20.8074 12.5019 20.7029C12.5019 20.5984 12.4609 20.4988 12.3867 20.4256L11.3281 19.3709V18.9607L12.3242 18.2927C12.4326 18.2205 12.4971 18.0984 12.4971 17.9685C12.4971 17.8386 12.4326 17.7166 12.3242 17.6443L11.3281 16.9763V16.406H10.5469V17.1873C10.5478 17.3181 10.6133 17.4392 10.7226 17.5115L11.4062 17.9685L10.7226 18.4255C10.6133 18.4978 10.5478 18.6189 10.5469 18.7498V19.531C10.5459 19.6345 10.5869 19.7351 10.6601 19.8084L11.5586 20.7029L10.6601 21.5974C10.5869 21.6707 10.5459 21.7712 10.5469 21.8748V22.656C10.5469 22.7791 10.6045 22.8943 10.7031 22.9685L12.2656 24.1404C12.4043 24.2449 12.5957 24.2449 12.7344 24.1404L14.2969 22.9685C14.3955 22.8943 14.4531 22.7791 14.4531 22.656V12.9645C15.7021 12.5534 16.791 11.7585 17.5626 10.693C18.3341 9.62762 18.7491 8.34637 18.7501 7.03104L18.75 7.03132ZM7.0312 7.03132C7.0312 6.89851 7.0312 6.76959 7.05073 6.64069H7.81246V7.42194H7.05073C7.0312 7.29304 7.0312 7.16414 7.0312 7.03132ZM14.4532 3.51582V2.73457H15.2345V3.51582H14.4532ZM15.2345 10.5471V11.3283H14.4532V10.5471H15.2345ZM8.98445 8.98457V9.76582H8.2032V8.98457H8.98445ZM8.2032 5.07832V4.29707H8.98445V5.07832H8.2032ZM9.7657 11.3283V10.5471H10.547V11.3283H9.7657ZM11.3985 7.42207H9.37505V6.64082H11.3985C11.5167 6.30879 11.7774 6.04804 12.1095 5.92987V3.90642H12.8907V5.92987C13.2716 6.06268 13.5577 6.38202 13.6475 6.77459C13.7374 7.16814 13.6192 7.58027 13.3341 7.86542C13.0489 8.15057 12.6368 8.26874 12.2432 8.17889C11.8507 8.08905 11.5313 7.80292 11.3985 7.42207ZM9.7657 3.51582V2.73457H10.547V3.51582H9.7657ZM16.0157 8.98457H16.797V9.76582H16.0157V8.98457ZM16.0157 5.07832V4.29707H16.797V5.07832H16.0157ZM12.8907 2.34382H12.1095V1.58209H12.5001H12.8907V2.34382ZM12.1095 11.7188H12.8907V12.5001C12.7618 12.5001 12.6329 12.5196 12.5001 12.5196C12.3673 12.5196 12.2384 12.5196 12.1095 12.5001V11.7188ZM17.1875 7.42182V6.64057H17.9687V7.03119V7.42182H17.1875Z" fill="#112A62"/>
167
- <path d="M18.5977 2.19531L17.9883 2.68751C19.0029 3.95606 19.5469 5.53701 19.5273 7.16126C19.5078 8.78626 18.9268 10.3538 17.8828 11.5978L18.4766 12.1095C19.6377 10.7267 20.2842 8.98549 20.3066 7.17974C20.3281 5.37504 19.7246 3.61724 18.5977 2.20699V2.19531Z" fill="#112A62"/>
168
- <path d="M7.03132 2.68751L6.40242 2.19531C5.27254 3.60644 4.66707 5.36631 4.68854 7.17381C4.711 8.98144 5.35944 10.7266 6.52349 12.1093L7.11724 11.6093C6.07329 10.3622 5.49322 8.79106 5.47759 7.16406C5.46197 5.53706 6.01079 3.95506 7.03129 2.68756L7.03132 2.68751Z" fill="#112A62"/>
169
- <path d="M19.7812 1.17188L19.1719 1.66408C20.4336 3.22073 21.1113 5.16908 21.0889 7.17283C21.0654 9.17673 20.3438 11.1093 19.0469 12.6366L19.6406 13.1444C21.0567 11.4784 21.8457 9.36988 21.8711 7.18338C21.8965 4.99688 21.1572 2.87088 19.7812 1.17163V1.17188Z" fill="#112A62"/>
170
- <path d="M5.82803 1.66408L5.21866 1.17188C3.84268 2.8711 3.10343 4.99713 3.12881 7.18363C3.15418 9.37013 3.94326 11.4786 5.35928 13.1446L5.95303 12.6368C4.65616 11.1095 3.93448 9.17683 3.91103 7.17308C3.88857 5.16918 4.56631 3.22083 5.82803 1.66433V1.66408Z" fill="#112A62"/>
171
- <path d="M10.5471 14.8438H11.3284V15.625H10.5471V14.8438Z" fill="#112A62"/>
172
- </svg>
173
- </span>
174
- <span>One time password</span>
175
- <% end %>
176
- <%# end %>
177
- </div>
178
111
  <% end %>
@@ -1,25 +1,96 @@
1
- <%- if controller_name != 'sessions' %>
2
- <%= link_to "Log in", new_session_path(resource_name) %><br />
3
- <% end %>
4
-
5
- <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
6
- <%= link_to "Sign up", new_registration_path(resource_name) %><br />
7
- <% end %>
8
-
9
- <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
10
- <%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
11
- <% end %>
12
-
13
- <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
14
- <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
15
- <% end %>
16
-
17
- <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
18
- <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
19
- <% end %>
20
-
21
- <%- if devise_mapping.omniauthable? %>
22
- <%- resource_class.omniauth_providers.each do |provider| %>
23
- <%= button_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), data: { turbo: false } %><br />
24
- <% end %>
25
- <% end %>
1
+ <%
2
+ =begin
3
+
4
+ Lesli
5
+
6
+ Copyright (c) 2023, Lesli Technologies, S. A.
7
+
8
+ This program is free software: you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation, either version 3 of the License, or
11
+ (at your option) any later version.
12
+
13
+ This program is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with this program. If not, see http://www.gnu.org/licenses/.
20
+
21
+ Lesli · Ruby on Rails SaaS Development Framework.
22
+
23
+ Made with by https://www.lesli.tech
24
+ Building a better future, one line of code at a time.
25
+
26
+ @contact hello@lesli.tech
27
+ @website https://www.lesli.tech
28
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
29
+
30
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
31
+ // ·
32
+ =end
33
+ %>
34
+
35
+ <% login = defined?(login) ? login : false %>
36
+ <% password_reset = defined?(password_reset) ? password_reset : false %>
37
+ <% magic_link = defined?(magic_link) ? magic_link : false %>
38
+ <% otp = defined?(otp) ? otp : false %>
39
+
40
+ <div class="links">
41
+
42
+ <% if login %>
43
+ <%= link_to(new_user_session_path) do %>
44
+ <span class="icon mr-1">
45
+ <svg xmlns="http://www.w3.org/2000/svg" width="23" height="17" fill="none" viewBox="0 0 23.441 17.473">
46
+ <path fill="#112a62" d="M6.253 2.41A6.253 6.253 0 0 0 .035 7.997a6.251 6.251 0 0 0 9.323 6.086 6.252 6.252 0 0 0 2.829-3.47h1.097v-.781h-.894a6.104 6.104 0 0 0 0-2.344h9.293l.879 1.172-.88 1.172h-.425l-1.055-1.059a.389.389 0 0 0-.554 0l-1.055 1.059h-.41l-.668-.997a.39.39 0 0 0-.649 0l-.668.997h-.57v.78h.781c.131 0 .252-.066.324-.175l.457-.684.457.684c.073.11.194.175.325.176h.78a.389.389 0 0 0 .278-.113l.895-.899.894.899a.388.388 0 0 0 .278.113h.78a.39.39 0 0 0 .313-.156l1.172-1.563a.39.39 0 0 0 0-.469L22.19 6.863a.39.39 0 0 0-.312-.156h-9.692A6.254 6.254 0 0 0 6.253 2.41Zm0 11.718c-.133 0-.261 0-.39-.02v-.76h.78v.76c-.128.02-.257.02-.39.02zM2.738 6.706h-.782v-.78h.782zm7.031-.78h.781v.78H9.77Zm-1.563 6.25h.782v.78h-.782zm-3.906.78H3.52v-.78H4.3zm6.25-1.562H9.77v-.781h.781ZM6.644 9.761v2.024h-.781V9.76a1.17 1.17 0 0 1-.711-.71H3.128v-.782h2.024a1.172 1.172 0 1 1 1.492 1.492zm-3.906 1.633h-.782v-.781h.782zm5.468-6.25v-.781h.782v.781zm-3.906 0H3.52v-.781H4.3zM1.566 8.269v.781H.804V8.27zm9.375.781V8.27h.781c0 .129.02.258.02.39 0 .133 0 .262-.02.391zM6.644 3.972h-.782v-.781h.781z"/>
47
+ <path fill="#112a62" d="m.134 2.09.492.61a8.595 8.595 0 0 1 10.973.125l.508-.594a9.372 9.372 0 0 0-11.973-.14ZM.69 14.774l-.492.609a9.38 9.38 0 0 0 11.973-.14l-.508-.594a8.596 8.596 0 0 1-10.972.125zM9.767 11.786v-.781h.782v.781z"/>
48
+ </svg>
49
+ </span>
50
+ <span>Login</span>
51
+ <% end %>
52
+ <% end %>
53
+
54
+ <% if password_reset %>
55
+ <%= link_to(new_user_password_path) do %>
56
+ <span class="icon mr-2">
57
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
58
+ <path d="M10 4.75C8.55296 4.75 7.375 5.92796 7.375 7.375V8.25C6.89155 8.25 6.5 8.64155 6.5 9.125V13.5C6.5 13.9834 6.89155 14.375 7.375 14.375H12.625C13.1084 14.375 13.5 13.9834 13.5 13.5V9.125C13.5 8.64155 13.1084 8.25 12.625 8.25V7.375C12.625 5.92796 11.447 4.75 10 4.75ZM11.75 12.625H8.25V10H11.75V12.625ZM9.125 8.25V7.375C9.125 6.89264 9.51764 6.5 10 6.5C10.4824 6.5 10.875 6.89264 10.875 7.375V8.25H9.125Z" fill="#112A62"/>
59
+ <path d="M16.7549 3.14324C13.4431 -0.120437 8.34511 -0.489197 4.62839 2.0123L4.61745 0.577295C4.61526 0.336669 4.41839 0.141979 4.17667 0.143071L3.30167 0.149633C3.05996 0.151821 2.86527 0.348697 2.86745 0.590409L2.89151 3.86501C2.89479 4.21938 3.11026 4.53656 3.43729 4.67001C3.76542 4.80345 4.14056 4.72579 4.38993 4.47314C7.43941 1.3811 12.4343 1.34386 15.5264 4.39001C17.8867 6.71533 18.5308 10.2132 17.19 13.2111C17.0948 13.4244 17.1725 13.6738 17.3814 13.7799L18.1623 14.1791C18.3833 14.2917 18.6633 14.201 18.7661 13.9746C20.434 10.2996 19.6531 5.99904 16.7546 3.14304L16.7549 3.14324Z" fill="#112A62"/>
60
+ <path d="M16.5625 15.3296C16.2333 15.1962 15.8593 15.2739 15.6099 15.5265C12.5615 18.6197 7.56633 18.6569 4.47345 15.6096C2.11314 13.2843 1.46905 9.78647 2.80986 6.78851C2.90502 6.57523 2.82736 6.32587 2.61846 6.21978L1.83751 5.82055C1.61657 5.7079 1.33656 5.79868 1.23377 6.02509C-0.43528 9.70121 0.346732 14.0017 3.24518 16.8566C6.55702 20.1203 11.655 20.489 15.3717 17.9876L15.3826 19.4215C15.3848 19.6632 15.5817 19.8579 15.8234 19.8557L16.6984 19.8491C16.9401 19.8469 17.1348 19.6501 17.1326 19.4083L17.1086 16.1337C17.1053 15.7805 16.8898 15.4633 16.5628 15.3298L16.5625 15.3296Z" fill="#112A62"/>
61
+ </svg>
62
+ </span>
63
+ <span>Reset password</span>
64
+ <% end %>
65
+ <% end %>
66
+
67
+
68
+ <%# Dynamic check if instance allow users to login through magic links (passes) %>
69
+ <%# if Rails.application.config.lesli.dig(:security, :enable_login_link) %>
70
+ <% if magic_link %>
71
+ <%= link_to("pass_path") do %>
72
+ <span class="icon mr-1">
73
+ <svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
74
+ <path d="M17.5 7.25005H15.25C14.6748 7.25005 14.0996 7.34967 13.5498 7.52545C14.1748 8.00005 14.7002 8.57525 15.0996 9.25005H15.25H17.5C19.2998 9.25005 20.75 10.7003 20.75 12.5001C20.75 14.2999 19.2998 15.7501 17.5 15.7501H15.25C15.0996 15.7501 14.9248 15.7247 14.7754 15.7003H14.75C13.2002 15.4503 12 14.125 12 12.5C12 11.5 11.3496 10.6504 10.4502 10.375C10.1504 11.0254 10 11.75 10 12.5C10 15.4005 12.3496 17.75 15.25 17.75H17.5C20.4005 17.75 22.75 15.4004 22.75 12.5C22.75 9.5996 20.4004 7.25 17.5 7.25V7.25005Z" fill="#112A62"/>
75
+ <path d="M9.9248 15.7502H7.5C5.7002 15.7502 4.25 14.3 4.25 12.5002C4.25 10.7004 5.7002 9.25024 7.5 9.25024H9.75C11.5498 9.25024 13 10.7004 13 12.5002C13 13.5002 13.6504 14.3498 14.5498 14.6252C14.8496 13.9748 15 13.2502 15 12.5002C15 9.59974 12.6504 7.25024 9.75 7.25024H7.5C4.5995 7.25024 2.25 9.59984 2.25 12.5002C2.25 15.4006 4.5996 17.7502 7.5 17.7502H9.75C10.3252 17.7502 10.9004 17.6506 11.4502 17.4504C10.8496 17.0002 10.3252 16.4006 9.9248 15.7502Z" fill="#112A62"/>
76
+ </svg>
77
+ </span>
78
+ <span>Magic link</span>
79
+ <% end %>
80
+ <% end %>
81
+
82
+
83
+ <%# Dynamic check if instance allow users to login through one time passwords %>
84
+ <%# if Rails.application.config.lesli.dig(:security, :enable_login_otp) %>
85
+ <% if otp %>
86
+ <%= link_to("otp_path") do %>
87
+ <span class="icon mr-1">
88
+ <svg xmlns="http://www.w3.org/2000/svg" width="23" height="17" fill="none" viewBox="0 0 23.441 17.473">
89
+ <path fill="#112a62" d="M6.253 2.41A6.253 6.253 0 0 0 .035 7.997a6.251 6.251 0 0 0 9.323 6.086 6.252 6.252 0 0 0 2.829-3.47h1.097v-.781h-.894a6.104 6.104 0 0 0 0-2.344h9.293l.879 1.172-.88 1.172h-.425l-1.055-1.059a.389.389 0 0 0-.554 0l-1.055 1.059h-.41l-.668-.997a.39.39 0 0 0-.649 0l-.668.997h-.57v.78h.781c.131 0 .252-.066.324-.175l.457-.684.457.684c.073.11.194.175.325.176h.78a.389.389 0 0 0 .278-.113l.895-.899.894.899a.388.388 0 0 0 .278.113h.78a.39.39 0 0 0 .313-.156l1.172-1.563a.39.39 0 0 0 0-.469L22.19 6.863a.39.39 0 0 0-.312-.156h-9.692A6.254 6.254 0 0 0 6.253 2.41Zm0 11.718c-.133 0-.261 0-.39-.02v-.76h.78v.76c-.128.02-.257.02-.39.02zM2.738 6.706h-.782v-.78h.782zm7.031-.78h.781v.78H9.77Zm-1.563 6.25h.782v.78h-.782zm-3.906.78H3.52v-.78H4.3zm6.25-1.562H9.77v-.781h.781ZM6.644 9.761v2.024h-.781V9.76a1.17 1.17 0 0 1-.711-.71H3.128v-.782h2.024a1.172 1.172 0 1 1 1.492 1.492zm-3.906 1.633h-.782v-.781h.782zm5.468-6.25v-.781h.782v.781zm-3.906 0H3.52v-.781H4.3zM1.566 8.269v.781H.804V8.27zm9.375.781V8.27h.781c0 .129.02.258.02.39 0 .133 0 .262-.02.391zM6.644 3.972h-.782v-.781h.781z"/>
90
+ <path fill="#112a62" d="m.134 2.09.492.61a8.595 8.595 0 0 1 10.973.125l.508-.594a9.372 9.372 0 0 0-11.973-.14ZM.69 14.774l-.492.609a9.38 9.38 0 0 0 11.973-.14l-.508-.594a8.596 8.596 0 0 1-10.972.125zM9.767 11.786v-.781h.782v.781z"/>
91
+ </svg>
92
+ </span>
93
+ <span>One time password</span>
94
+ <% end %>
95
+ <% end %>
96
+ </div>
@@ -0,0 +1,23 @@
1
+ <!doctype html><html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"><head><title></title><!--[if !mso]><!--><meta http-equiv="X-UA-Compatible" content="IE=edge"><!--<![endif]--><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><style type="text/css">#outlook a { padding:0; }
2
+ body { margin:0;padding:0;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%; }
3
+ table, td { border-collapse:collapse;mso-table-lspace:0pt;mso-table-rspace:0pt; }
4
+ img { border:0;height:auto;line-height:100%; outline:none;text-decoration:none;-ms-interpolation-mode:bicubic; }
5
+ p { display:block;margin:13px 0; }</style><!--[if mso]>
6
+ <noscript>
7
+ <xml>
8
+ <o:OfficeDocumentSettings>
9
+ <o:AllowPNG/>
10
+ <o:PixelsPerInch>96</o:PixelsPerInch>
11
+ </o:OfficeDocumentSettings>
12
+ </xml>
13
+ </noscript>
14
+ <![endif]--><!--[if lte mso 11]>
15
+ <style type="text/css">
16
+ .mj-outlook-group-fix { width:100% !important; }
17
+ </style>
18
+ <![endif]--><!--[if !mso]><!--><link href="https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700" rel="stylesheet" type="text/css"><style type="text/css">@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700);</style><!--<![endif]--><style type="text/css">@media only screen and (min-width:480px) {
19
+ .mj-column-per-100 { width:100% !important; max-width: 100%; }
20
+ }</style><style media="screen and (min-width:480px)">.moz-text-html .mj-column-per-100 { width:100% !important; max-width: 100%; }</style><style type="text/css">@media only screen and (max-width:479px) {
21
+ table.mj-full-width-mobile { width: 100% !important; }
22
+ td.mj-full-width-mobile { width: auto !important; }
23
+ }</style><style type="text/css"></style></head><body style="word-spacing:normal;background-color:#ebecf0;"><div style="background-color:#ebecf0;"><!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]--><div style="margin:0px auto;max-width:600px;"><table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;"><tbody><tr><td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;"><!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]--><div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"><table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"><tbody><tr><td align="center" style="font-size:0px;padding:0px;padding-top:60px;padding-bottom:0px;padding-left:5px;word-break:break-word;"><table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;border-spacing:0px;"><tbody><tr><td style="width:125px;"><img src="https://cdn.lesli.tech/leslicloud/brand/app-logo.png" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="125" height="auto"></td></tr></tbody></table></td></tr></tbody></table></div><!--[if mso | IE]></td></tr></table><![endif]--></td></tr></tbody></table></div><!--[if mso | IE]></td></tr></table><![endif]--><div style="height:5px;line-height:5px;">&#8202;</div><div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:center;color:#4a5056;"><h1>Welcome to Lesli</h1></div><!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" bgcolor="#ffffff" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]--><div style="background:#ffffff;background-color:#ffffff;margin:0px auto;border-radius:15px;max-width:600px;"><table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#ffffff;background-color:#ffffff;width:100%;border-radius:15px;"><tbody><tr><td style="direction:ltr;font-size:0px;padding:40px;text-align:center;"><!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:520px;" ><![endif]--><div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"><table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"><tbody><tr><td style="font-size:0px;word-break:break-word;"><div style="height:15px;line-height:15px;">&#8202;</div></td></tr><tr><td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;"><div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:16px;line-height:1.4;text-align:left;color:#4a5056;"><p>Your account is almost ready. Please take a moment to validate your email address so that we know it's you.</p></div></td></tr><tr><td align="center" vertical-align="middle" style="font-size:0px;padding:10px 25px;word-break:break-word;"><table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:separate;line-height:100%;"><tbody><tr><td align="center" bgcolor="#eef6fc" role="presentation" style="border:1px solid #209cee;border-radius:5px;cursor:auto;mso-padding-alt:10px;background:#eef6fc;" valign="middle"><a href="<%= url_for(@app[:host] + @data[:url]) %>" style="display:inline-block;background:#eef6fc;color:#209cee;font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:17px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px;mso-padding-alt:0px;border-radius:5px;" target="_blank">Confirm my account</a></td></tr></tbody></table></td></tr><tr><td style="font-size:0px;word-break:break-word;"><div style="height:25px;line-height:25px;">&#8202;</div></td></tr><tr><td style="background:#DBDBDB;font-size:0px;word-break:break-word;"><div style="height:2px;line-height:2px;">&#8202;</div></td></tr><tr><td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;"><div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;"><p>Please keep in mind that this link is valid for only 3 hours.</p></div></td></tr></tbody></table></div><!--[if mso | IE]></td></tr></table><![endif]--></td></tr></tbody></table></div><!--[if mso | IE]></td></tr></table><![endif]--><div style="height:30px;line-height:30px;">&#8202;</div><!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]--><div style="margin:0px auto;max-width:600px;"><table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;"><tbody><tr><td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;"><!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]--><div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"><table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"><tbody><tr><td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;"><div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:18px;font-weight:600;line-height:1;text-align:center;color:#444444;">¡Siguenos!</div></td></tr><tr><td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;"><table cellpadding="0" cellspacing="0" width="300" border="0" style="color:#000000;font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:22px;table-layout:auto;width:300px;border:none;"><tr><td align="center"><img width="45px" alt="Facebook" src="https://cdn.lesli.tech/leslicloud/emails/social-facebook.png"></td><td align="center"><img width="45px" alt="Twitter" src="https://cdn.lesli.tech/leslicloud/emails/social-twitter.png"></td><td align="center"><img width="45px" alt="Instagram" src="https://cdn.lesli.tech/leslicloud/emails/social-instagram.png"></td><td align="center"><img width="45px" alt="Linkedin" src="https://cdn.lesli.tech/leslicloud/emails/social-linkedin.png"></td></tr></table></td></tr></tbody></table></div><!--[if mso | IE]></td></tr></table><![endif]--></td></tr></tbody></table></div><!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]--><div style="margin:0px auto;max-width:600px;"><table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;"><tbody><tr><td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;"><!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]--><div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"><table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"><tbody><tr><td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;"><div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:18px;font-weight:600;line-height:1;text-align:center;color:#444444;">Download our app</div></td></tr><tr><td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;"><table cellpadding="0" cellspacing="0" width="100%" border="0" style="color:#000000;font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:22px;table-layout:auto;width:100%;border:none;"><tr><td style="text-align: right; padding: 5px;"><a target="blank" href="https://apps.apple.com/us/app/lesli/id1595893730"><img width="130px" alt="Appstore badge" src="https://cdn.lesli.tech/leslicloud/emails/appstore.png"></a></td><td style="text-align: left; padding: 5px;"><a target="blank" href="https://apps.apple.com/us/app/lesli/id1595893730"><img width="130px" alt="Playstore badge" src="https://cdn.lesli.tech/leslicloud/emails/playstore.png"></a></td></tr></table></td></tr></tbody></table></div><!--[if mso | IE]></td></tr></table><![endif]--></td></tr></tbody></table></div><!--[if mso | IE]></td></tr></table><![endif]--><div style="height:10px;line-height:10px;">&#8202;</div><!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" role="presentation" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]--><div style="margin:0px auto;max-width:600px;"><table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;"><tbody><tr><td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;"><!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]--><div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"><table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"><tbody><tr><td align="center" style="font-size:0px;padding:4px;word-break:break-word;"><div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:center;color:#666666;">Copyright &copy; <%= Time.new.year %> LesliTech</div></td></tr><tr><td align="center" style="font-size:0px;padding:4px;word-break:break-word;"><div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:center;color:#666666;">Ciudad de Guatemala, Guatemala.</div></td></tr><tr><td align="center" style="font-size:0px;padding:4px;word-break:break-word;"><div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:center;color:#666666;">All rights reserved.</div></td></tr><tr><td align="center" style="font-size:0px;padding:4px;padding-top:20px;word-break:break-word;"><div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:center;color:#666666;">The Lesli Team</div></td></tr></tbody></table></div><!--[if mso | IE]></td></tr></table><![endif]--></td></tr></tbody></table></div><!--[if mso | IE]></td></tr></table><![endif]--></div></body></html>