lesli_shield 1.1.3 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/config/lesli_shield_manifest.js +1 -0
- data/app/assets/stylesheets/lesli_shield/application.tailwind.css +0 -0
- data/app/assets/stylesheets/lesli_shield/confirmations.css +19 -1
- data/app/assets/stylesheets/lesli_shield/devise/oauth.css +32 -0
- data/app/assets/stylesheets/lesli_shield/passwords.css +19 -1
- data/app/assets/stylesheets/lesli_shield/registrations.css +774 -1
- data/app/assets/stylesheets/lesli_shield/sessions.css +32 -1
- data/app/assets/stylesheets/lesli_shield/sessions.tailwind.css +2 -0
- data/app/assets/stylesheets/lesli_shield/users.css +30 -0
- data/app/controllers/users/sessions_controller.rb +1 -1
- data/app/services/lesli_shield/user_registration_service.rb +47 -39
- data/app/views/devise/registrations/new.html.erb +14 -14
- data/app/views/devise/sessions/new.html.erb +42 -33
- data/app/views/devise/shared/_application-devise.html.erb +36 -35
- data/app/views/devise/shared/_demo.html.erb +8 -4
- data/config/locales/translations.en.yml +14 -0
- data/config/locales/translations.es.yml +14 -0
- data/lib/lesli_shield/version.rb +2 -2
- data/readme.md +112 -49
- metadata +3 -4
- data/config/locales/translations.fr.yml +0 -2
- data/config/locales/translations.it.yml +0 -5
- data/config/locales/translations.pt.yml +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-content:""}}}@layer theme{:root,:host{--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-950:oklch(27.9% .077 45.635);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--leading-tight:1.25;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer utilities{.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-x-0{inset-inline:0}.bottom-0{bottom:0}.mx-auto{margin-inline:auto}.mt-1{margin-top:var(--spacing)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.h-5{height:calc(var(--spacing) * 5)}.h-auto{height:auto}.max-h-20{max-height:calc(var(--spacing) * 20)}.min-h-screen{min-height:100vh}.w-5{width:calc(var(--spacing) * 5)}.w-auto{width:auto}.w-full{width:100%}.max-w-\[220px\]{max-width:220px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.flex-1{flex:1}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-1{row-gap:var(--spacing)}.overflow-hidden{overflow:hidden}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-sky-200{border-color:var(--color-sky-200)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-white{background-color:var(--color-white)}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-slate-950\/70{--tw-gradient-from:#020618b3}@supports (color:color-mix(in lab, red, red)){.from-slate-950\/70{--tw-gradient-from:color-mix(in oklab, var(--color-slate-950) 70%, transparent)}}.from-slate-950\/70{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-slate-900\/10{--tw-gradient-via:#0f172b1a}@supports (color:color-mix(in lab, red, red)){.via-slate-900\/10{--tw-gradient-via:color-mix(in oklab, var(--color-slate-900) 10%, transparent)}}.via-slate-900\/10{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-12{padding:calc(var(--spacing) * 12)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-all{word-break:break-all}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-sky-950{color:var(--color-sky-950)}.text-slate-600{color:var(--color-slate-600)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:text-sky-900:hover{color:var(--color-sky-900)}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-sky-500\/30:focus{--tw-ring-color:#00a5ef4d}@supports (color:color-mix(in lab, red, red)){.focus\:ring-sky-500\/30:focus{--tw-ring-color:color-mix(in oklab, var(--color-sky-500) 30%, transparent)}}.focus\:ring-offset-4:focus{--tw-ring-offset-width:4px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}@media (min-width:40rem){.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:pt-8{padding-top:calc(var(--spacing) * 8)}}@media (min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:block{display:block}.lg\:grid{display:grid}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:px-16{padding-inline:calc(var(--spacing) * 16)}}}@layer components{.lesli-form-field{margin-bottom:calc(var(--spacing) * 4)}.lesli-form-label-wrapper{margin-bottom:calc(var(--spacing) * 2)}.lesli-form-label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-slate-700);display:block}.lesli-form-field-body{min-width:0}.lesli-form-control{position:relative}.lesli-form-input,.lesli-form-select,.lesli-form-control textarea,.lesli-form-control trix-editor{border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-300);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing) * 3.5);padding-block:calc(var(--spacing) * 2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-slate-900);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-outline-style:none;outline-style:none;display:block}:is(.lesli-form-input,.lesli-form-select,.lesli-form-control textarea,.lesli-form-control trix-editor)::placeholder{color:var(--color-slate-400)}@media (hover:hover){:is(.lesli-form-input,.lesli-form-select,.lesli-form-control textarea,.lesli-form-control trix-editor):hover{border-color:var(--color-slate-400)}}:is(.lesli-form-input,.lesli-form-select,.lesli-form-control textarea,.lesli-form-control trix-editor):focus{border-color:var(--color-sky-500);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:#00a5ef1a}@supports (color:color-mix(in lab, red, red)){:is(.lesli-form-input,.lesli-form-select,.lesli-form-control textarea,.lesli-form-control trix-editor):focus{--tw-ring-color:color-mix(in oklab, var(--color-sky-500) 10%, transparent)}}:is(.lesli-form-input,.lesli-form-select,.lesli-form-control textarea,.lesli-form-control trix-editor):disabled{cursor:not-allowed;background-color:var(--color-slate-100);color:var(--color-slate-500);opacity:.75}.lesli-form-input,.lesli-form-select{height:calc(var(--spacing) * 11)}.lesli-form-control textarea,.lesli-form-control trix-editor{min-height:calc(var(--spacing) * 32);resize:vertical}.lesli-form-select-wrapper{position:relative}.lesli-form-select{cursor:pointer;appearance:none;padding-right:calc(var(--spacing) * 10)}.lesli-form-select-wrapper:after{pointer-events:none;top:50%;right:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 2);width:calc(var(--spacing) * 2);--tw-translate-y:calc(var(--spacing) * -2);translate:var(--tw-translate-x) var(--tw-translate-y);border-right-style:var(--tw-border-style);border-right-width:2px;border-bottom-style:var(--tw-border-style);border-bottom-width:2px;border-color:var(--color-slate-400);--tw-content:"";content:var(--tw-content);position:absolute;rotate:45deg}.lesli-form-checkbox{height:calc(var(--spacing) * 4);width:calc(var(--spacing) * 4);cursor:pointer;border-color:var(--color-slate-300);accent-color:var(--color-sky-600);border-radius:.25rem}.lesli-form-checkbox:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:#00a5ef4d}@supports (color:color-mix(in lab, red, red)){.lesli-form-checkbox:focus{--tw-ring-color:color-mix(in oklab, var(--color-sky-500) 30%, transparent)}}.lesli-form-checkbox:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.lesli-form-checkbox:disabled{cursor:not-allowed;opacity:.5}.lesli-form-checkbox-label{cursor:pointer;align-items:center;gap:calc(var(--spacing) * 2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-slate-600);display:inline-flex}.lesli-form-control.has-icon .lesli-form-input,.lesli-form-control.has-icon .lesli-form-select{padding-left:calc(var(--spacing) * 11)}.lesli-form-icon{pointer-events:none;top:50%;left:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 5);width:calc(var(--spacing) * 5);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y);color:var(--color-slate-400);justify-content:center;align-items:center;display:inline-flex;position:absolute}.lesli-form-icon .material-symbols-outlined{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-leading:1;line-height:1}.lesli-form-help{margin-top:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5);color:var(--color-slate-500)}.lesli-form-field.is-danger .lesli-form-input,.lesli-form-field.is-danger .lesli-form-select,.lesli-form-field.is-danger textarea,.lesli-form-field.is-danger trix-editor{border-color:var(--color-rose-400)}:is(.lesli-form-field.is-danger .lesli-form-input,.lesli-form-field.is-danger .lesli-form-select,.lesli-form-field.is-danger textarea,.lesli-form-field.is-danger trix-editor):focus{border-color:var(--color-rose-500);--tw-ring-color:#ff23571a}@supports (color:color-mix(in lab, red, red)){:is(.lesli-form-field.is-danger .lesli-form-input,.lesli-form-field.is-danger .lesli-form-select,.lesli-form-field.is-danger textarea,.lesli-form-field.is-danger trix-editor):focus{--tw-ring-color:color-mix(in oklab, var(--color-rose-500) 10%, transparent)}}.lesli-form-help.is-danger{color:var(--color-rose-700)}.lesli-form-help.is-warning{color:var(--color-amber-700)}.lesli-form-help.is-success{color:var(--color-emerald-700)}.lesli-form-help.is-info{color:var(--color-sky-700)}.lesli-form-button{height:calc(var(--spacing) * 11);cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);border-radius:var(--radius-xl);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-width:1px;border-color:#0000;display:inline-flex}.lesli-form-button:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-outline-style:none;outline-style:none}.lesli-form-button:disabled{pointer-events:none;cursor:not-allowed;opacity:.5}.lesli-form-button.is-primary,.lesli-form-button.is-info{background-color:var(--color-sky-600);color:var(--color-white)}@media (hover:hover){:is(.lesli-form-button.is-primary,.lesli-form-button.is-info):hover{background-color:var(--color-sky-700)}}:is(.lesli-form-button.is-primary,.lesli-form-button.is-info):focus{--tw-ring-color:#00a5ef33}@supports (color:color-mix(in lab, red, red)){:is(.lesli-form-button.is-primary,.lesli-form-button.is-info):focus{--tw-ring-color:color-mix(in oklab, var(--color-sky-500) 20%, transparent)}}.lesli-form-button.is-success{background-color:var(--color-emerald-600);color:var(--color-white)}@media (hover:hover){.lesli-form-button.is-success:hover{background-color:var(--color-emerald-700)}}.lesli-form-button.is-success:focus{--tw-ring-color:#00bb7f33}@supports (color:color-mix(in lab, red, red)){.lesli-form-button.is-success:focus{--tw-ring-color:color-mix(in oklab, var(--color-emerald-500) 20%, transparent)}}.lesli-form-button.is-warning{background-color:var(--color-amber-500);color:var(--color-amber-950)}@media (hover:hover){.lesli-form-button.is-warning:hover{background-color:var(--color-amber-600)}}.lesli-form-button.is-warning:focus{--tw-ring-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.lesli-form-button.is-warning:focus{--tw-ring-color:color-mix(in oklab, var(--color-amber-500) 20%, transparent)}}.lesli-form-button.is-danger{background-color:var(--color-rose-600);color:var(--color-white)}@media (hover:hover){.lesli-form-button.is-danger:hover{background-color:var(--color-rose-700)}}.lesli-form-button.is-danger:focus{--tw-ring-color:#ff235733}@supports (color:color-mix(in lab, red, red)){.lesli-form-button.is-danger:focus{--tw-ring-color:color-mix(in oklab, var(--color-rose-500) 20%, transparent)}}.lesli-form-button.is-fullwidth{width:100%}.lesli-form-button-icon{height:calc(var(--spacing) * 5);width:calc(var(--spacing) * 5);justify-content:center;align-items:center;display:inline-flex}.lesli-form-button-icon .material-symbols{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-leading:1;line-height:1}.lesli-form-fieldset{margin-bottom:calc(var(--spacing) * 6);border-radius:var(--radius-2xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-200);background-color:var(--color-white);padding:calc(var(--spacing) * 6);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.lesli-form-legend{margin-bottom:calc(var(--spacing) * 5);margin-left:calc(var(--spacing) * -1);padding-inline:var(--spacing);font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-slate-800)}.lesli-form-fieldset.is-info{border-color:var(--color-sky-200);background-color:#f0f9ff66}@supports (color:color-mix(in lab, red, red)){.lesli-form-fieldset.is-info{background-color:color-mix(in oklab, var(--color-sky-50) 40%, transparent)}}.lesli-form-fieldset.is-success{border-color:var(--color-emerald-200);background-color:#ecfdf566}@supports (color:color-mix(in lab, red, red)){.lesli-form-fieldset.is-success{background-color:color-mix(in oklab, var(--color-emerald-50) 40%, transparent)}}.lesli-form-fieldset.is-warning{border-color:var(--color-amber-200);background-color:#fffbeb80}@supports (color:color-mix(in lab, red, red)){.lesli-form-fieldset.is-warning{background-color:color-mix(in oklab, var(--color-amber-50) 50%, transparent)}}.lesli-form-fieldset.is-danger{border-color:var(--color-rose-200);background-color:#fff1f266}@supports (color:color-mix(in lab, red, red)){.lesli-form-fieldset.is-danger{background-color:color-mix(in oklab, var(--color-rose-50) 40%, transparent)}}@media (min-width:768px){.lesli-form-field.is-horizontal{align-items:flex-start;gap:calc(var(--spacing) * 5);grid-template-columns:minmax(8rem,1fr) minmax(0,3fr);display:grid}.lesli-form-field.is-horizontal>.lesli-form-label-wrapper{padding-top:calc(var(--spacing) * 2.5);text-align:right;margin-bottom:0}.lesli-form-field.is-horizontal>.lesli-form-field-body{grid-column-start:2}}.links{margin-top:calc(var(--spacing) * 5);border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-200);background-color:var(--color-white);overflow:hidden}.links>a{align-items:center;gap:calc(var(--spacing) * 3);width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-slate-700);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));display:flex}@media (hover:hover){.links>a:hover{background-color:var(--color-slate-50);color:var(--color-sky-700)}}.links>a:focus{--tw-outline-style:none;outline-style:none}.links>a:focus-visible{background-color:var(--color-sky-50);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-ring-color:#00a5ef4d}@supports (color:color-mix(in lab, red, red)){.links>a:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-sky-500) 30%, transparent)}}.links>a:focus-visible{--tw-ring-inset:inset}.links>a:not(:last-child){border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-slate-200)}.links .icon{height:calc(var(--spacing) * 7);width:calc(var(--spacing) * 7);flex-shrink:0;justify-content:center;align-items:center;margin-right:0;display:inline-flex}.links .icon svg{max-height:calc(var(--spacing) * 6);max-width:calc(var(--spacing) * 6);display:block}.links>a>span:not(.icon){font-family:Domine,OpenSans,sans-serif}.lesli-auth-visual{background-color:#0000;background-image:linear-gradient(#316aff66,#316aff66),url(/lesli_shield/login-background.jpg);background-position:50%;background-repeat:repeat,repeat;background-size:cover;background-attachment:scroll,scroll;background-origin:padding-box,padding-box;background-clip:border-box,border-box}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-content{syntax:"*";inherits:false;initial-value:""}
|
|
@@ -1 +1,31 @@
|
|
|
1
|
+
@charset "UTF-8";
|
|
2
|
+
/*
|
|
3
|
+
Lesli
|
|
1
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
|
+
*/
|
|
@@ -126,7 +126,7 @@ class Users::SessionsController < Devise::SessionsController
|
|
|
126
126
|
# Ensures it's a local path
|
|
127
127
|
return redirect_path if uri.relative?
|
|
128
128
|
end
|
|
129
|
-
Lesli.config.path_after_login || root_path
|
|
129
|
+
Lesli.config.shield.dig(:path_after_login) || root_path
|
|
130
130
|
rescue URI::InvalidURIError
|
|
131
131
|
# If the URL is invalid, fallback to root
|
|
132
132
|
root_path
|
|
@@ -56,45 +56,8 @@ module LesliShield
|
|
|
56
56
|
|
|
57
57
|
def create_account
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
# create new account for the new user only if multi-account is allowed
|
|
63
|
-
if allow_multiaccount === true
|
|
64
|
-
account = Lesli::Account.create!({
|
|
65
|
-
user: resource, # set user as owner of his just created account
|
|
66
|
-
name: "Lesli", # temporary company name
|
|
67
|
-
email: resource.email,
|
|
68
|
-
status: :active # account is active due user already confirmed his email
|
|
69
|
-
})
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# if multi-account is not allowed user belongs to the first account in instance
|
|
73
|
-
if allow_multiaccount === false
|
|
74
|
-
account = Lesli::Account.first
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# add user to his own account
|
|
78
|
-
resource.account = account
|
|
79
|
-
|
|
80
|
-
# add owner role to user only if multi-account is allowed
|
|
81
|
-
if allow_multiaccount == true
|
|
82
|
-
resource.user_roles.create({ role: account.roles.find_by(name: "owner") })
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
# add profile role to user only if multi-account is allowed
|
|
86
|
-
if allow_multiaccount == false
|
|
87
|
-
# Assigning default role if defined in account settings
|
|
88
|
-
# Otherwise, the default role is "limited"
|
|
89
|
-
#default_role_id = account.settings.find_by(:name => "default_role_id")&.value
|
|
90
|
-
default_role_id = nil
|
|
91
|
-
|
|
92
|
-
if default_role_id.present?
|
|
93
|
-
resource.roles.create({ role: account.roles.find_by(:id => default_role_id)})
|
|
94
|
-
else
|
|
95
|
-
resource.roles.create({ role: account.roles.find_by(name: "limited") })
|
|
96
|
-
end
|
|
97
|
-
end
|
|
59
|
+
add_account() if resource.account.blank?
|
|
60
|
+
add_role() if resource.user_roles.empty?
|
|
98
61
|
|
|
99
62
|
# Synchronize roles for the very first time
|
|
100
63
|
resource.roles.each do |role|
|
|
@@ -116,5 +79,50 @@ module LesliShield
|
|
|
116
79
|
# end
|
|
117
80
|
|
|
118
81
|
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
# check if instance is for multi-account
|
|
86
|
+
ALLOW_MULTI_ACCOUNT = Lesli.config.security.dig(:allow_multiaccount)
|
|
87
|
+
|
|
88
|
+
# This is necessary when user is creating a brand new account
|
|
89
|
+
# and the platform is configured to create new Lesli accounts for every user
|
|
90
|
+
# The platform use the same account when the platform is not saas but
|
|
91
|
+
# proprietary instance (only one company is using the platform)
|
|
92
|
+
# Another scenario where it is not needed to create a new account for the
|
|
93
|
+
# user is when the user is confirming the account through an invitation
|
|
94
|
+
def add_account
|
|
95
|
+
|
|
96
|
+
if ALLOW_MULTI_ACCOUNT === true
|
|
97
|
+
# create new account for the new user only if multi-account is allowed
|
|
98
|
+
account = Lesli::Account.create!({
|
|
99
|
+
user: resource, # set user as owner of his just created account
|
|
100
|
+
name: "Lesli", # temporary company name
|
|
101
|
+
email: resource.email,
|
|
102
|
+
status: :active # account is active due user already confirmed his email
|
|
103
|
+
})
|
|
104
|
+
else
|
|
105
|
+
# if multi-account is not allowed user belongs to the first account in instance
|
|
106
|
+
account = Lesli::Account.first
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# add user to his own account
|
|
110
|
+
resource.account = account
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def add_role
|
|
114
|
+
if ALLOW_MULTI_ACCOUNT == true
|
|
115
|
+
# add owner role to user only if multi-account is allowed
|
|
116
|
+
resource.user_roles.create({ role: account.roles.find_by(name: "owner") })
|
|
117
|
+
else
|
|
118
|
+
# Assigning default role if defined in account settings
|
|
119
|
+
# Otherwise, the default role is "limited"
|
|
120
|
+
default_role_name = Lesli.config.shield.dig(:default_role) || "guest"
|
|
121
|
+
|
|
122
|
+
default_role = resource.account.roles.find_by(name: default_role_name)
|
|
123
|
+
|
|
124
|
+
resource.user_roles.create({ role: default_role })
|
|
125
|
+
end
|
|
126
|
+
end
|
|
119
127
|
end
|
|
120
128
|
end
|
|
@@ -38,7 +38,12 @@ if Lesli.config.demo
|
|
|
38
38
|
end
|
|
39
39
|
%>
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
<%
|
|
42
|
+
title = I18n.t("overrides.lesli_shield.devise/registrations.view_title",
|
|
43
|
+
default: :"lesli_shield.devise/registrations.view_title")
|
|
44
|
+
%>
|
|
45
|
+
|
|
46
|
+
<%= render("devise/shared/application-devise", title:title) do %>
|
|
42
47
|
|
|
43
48
|
<%= form_for(
|
|
44
49
|
resource,
|
|
@@ -63,17 +68,11 @@ end
|
|
|
63
68
|
) %>
|
|
64
69
|
|
|
65
70
|
<div class="field mb-5">
|
|
66
|
-
<p
|
|
71
|
+
<p><%= I18n.t("lesli_shield.devise/registrations.view_password_requirements") %></p>
|
|
67
72
|
<ul class="pl-3 password-requirements">
|
|
68
|
-
<li>
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
<li>
|
|
72
|
-
• One symbol
|
|
73
|
-
</li>
|
|
74
|
-
<li>
|
|
75
|
-
• One number
|
|
76
|
-
</li>
|
|
73
|
+
<li>• <%= I18n.t("lesli_shield.devise/registrations.view_password_requirements_uppercase") %></li>
|
|
74
|
+
<li>• <%= I18n.t("lesli_shield.dashboards.view_password_requirements_symbol") %></li>
|
|
75
|
+
<li>• <%= I18n.t("lesli_shield.dashboards.view_password_requirements_number") %></li>
|
|
77
76
|
</ul>
|
|
78
77
|
</div>
|
|
79
78
|
|
|
@@ -89,15 +88,16 @@ end
|
|
|
89
88
|
<button
|
|
90
89
|
type="submit"
|
|
91
90
|
class="button is-primary is-fullwidth mb-2">
|
|
92
|
-
|
|
91
|
+
<%= I18n.t("overrides.lesli_shield.devise/registrations.button_create_account",
|
|
92
|
+
default: :"lesli_shield.devise/registrations.button_create_account") %>
|
|
93
93
|
</button>
|
|
94
94
|
</div>
|
|
95
95
|
</div>
|
|
96
96
|
|
|
97
97
|
<p class="account has-text-centered">
|
|
98
|
-
|
|
98
|
+
<%= I18n.t("lesli_shield.devise/registrations.view_already_have_an_account") %>
|
|
99
99
|
<%= link_to(new_user_session_path, :class => "has-text-primary") do %>
|
|
100
|
-
<u><b
|
|
100
|
+
<u><b><%= I18n.t("lesli_shield.devise/registrations.button_login") %></b></u>
|
|
101
101
|
<% end %>
|
|
102
102
|
</p>
|
|
103
103
|
<% end %>
|
|
@@ -39,59 +39,68 @@ if Lesli.config.demo
|
|
|
39
39
|
end
|
|
40
40
|
%>
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
<%
|
|
43
|
+
title = I18n.t("overrides.lesli_shield.devise/sessions.view_title",
|
|
44
|
+
default: :"lesli_shield.devise/sessions.view_title")
|
|
45
|
+
%>
|
|
46
|
+
|
|
47
|
+
<%= render("devise/shared/application-devise", title: title) do %>
|
|
48
|
+
|
|
49
|
+
<% authentication_error = flash[:alert].presence || flash[:error].presence %>
|
|
43
50
|
|
|
44
51
|
<%= form_for(
|
|
45
|
-
resource,
|
|
46
|
-
as: resource_name,
|
|
52
|
+
resource,
|
|
53
|
+
as: resource_name,
|
|
47
54
|
url: user_session_path,
|
|
48
55
|
builder: LesliView::Forms::Builder,
|
|
56
|
+
html: { class: "lesli-login-form" },
|
|
49
57
|
data: { turbo: false }
|
|
50
|
-
|
|
58
|
+
) do |form| %>
|
|
51
59
|
|
|
52
60
|
<% if Lesli.config.demo %>
|
|
53
61
|
<%= render("devise/shared/demo") %>
|
|
54
62
|
<% end %>
|
|
55
63
|
|
|
56
|
-
<%= form.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
category:
|
|
60
|
-
icon: "person"
|
|
64
|
+
<%= form.field_control_email(
|
|
65
|
+
:email,
|
|
66
|
+
label: I18n.t("lesli_shield.devise/sessions.label_email", default: "Email address"),
|
|
67
|
+
category: authentication_error.present? ? :danger : nil,
|
|
68
|
+
icon: "person",
|
|
69
|
+
autofocus: true,
|
|
70
|
+
autocomplete: "email",
|
|
71
|
+
required: true,
|
|
72
|
+
placeholder: Lesli.config.company[:email]
|
|
61
73
|
) %>
|
|
62
74
|
|
|
63
|
-
<%= form.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
category:
|
|
68
|
-
icon: "key"
|
|
75
|
+
<%= form.field_control_password(
|
|
76
|
+
:password,
|
|
77
|
+
label: I18n.t("lesli_shield.devise/sessions.label_password", default: "Password"),
|
|
78
|
+
message: authentication_error,
|
|
79
|
+
category: authentication_error.present? ? :danger : nil,
|
|
80
|
+
icon: "key",
|
|
81
|
+
autocomplete: "current-password",
|
|
82
|
+
required: true,
|
|
83
|
+
placeholder: "••••••••"
|
|
69
84
|
) %>
|
|
70
85
|
|
|
71
86
|
<% if params[:r].presence %>
|
|
72
|
-
<%=
|
|
87
|
+
<%= hidden_field_tag "user[redirect]", params[:r] %>
|
|
73
88
|
<% end %>
|
|
74
89
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
Log in
|
|
81
|
-
</button>
|
|
82
|
-
</div>
|
|
83
|
-
</div>
|
|
90
|
+
<%= form.field_control_button(
|
|
91
|
+
I18n.t("lesli_shield.devise/sessions.button_log_in"),
|
|
92
|
+
{ class: "is-fullwidth" },
|
|
93
|
+
icon: "login"
|
|
94
|
+
) %>
|
|
84
95
|
|
|
85
96
|
<% if Lesli.config.security.dig(:allow_registration) %>
|
|
86
|
-
<p class="
|
|
87
|
-
|
|
88
|
-
<%= link_to(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
</p>
|
|
97
|
+
<p class="mt-1 text-center text-sm text-slate-600">
|
|
98
|
+
<%= I18n.t("lesli_shield.devise/sessions.view_still_not_registered") %>
|
|
99
|
+
<%= link_to I18n.t("lesli_shield.devise/sessions.button_create_account"),
|
|
100
|
+
new_user_registration_path %>
|
|
101
|
+
</p>
|
|
92
102
|
<% end %>
|
|
93
|
-
|
|
94
103
|
<% end %>
|
|
95
104
|
|
|
96
|
-
<%= render("devise/shared/links", password_reset:true, magic_link:
|
|
105
|
+
<%= render("devise/shared/links", password_reset:true, magic_link:true, otp:true, login:true) %>
|
|
97
106
|
<% end %>
|
|
@@ -30,47 +30,48 @@ Building a better future, one line of code at a time.
|
|
|
30
30
|
// ·
|
|
31
31
|
%>
|
|
32
32
|
|
|
33
|
-
<% title =
|
|
34
|
-
<% back_to_login =
|
|
33
|
+
<% title = local_assigns.fetch(:title, "") %>
|
|
34
|
+
<% back_to_login = local_assigns.fetch(:back_to_login, false) %>
|
|
35
35
|
|
|
36
|
-
<main id="lesli-application" class="
|
|
37
|
-
<section class="
|
|
38
|
-
|
|
39
|
-
<div class="
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
</span>
|
|
47
|
-
<span>Back to Login</span>
|
|
48
|
-
</span>
|
|
49
|
-
<% end %>
|
|
50
|
-
</div>
|
|
36
|
+
<main id="lesli-application" class="min-h-screen bg-slate-50 lg:grid lg:grid-cols-3">
|
|
37
|
+
<section class="flex min-h-screen flex-col bg-white">
|
|
38
|
+
<% if back_to_login %>
|
|
39
|
+
<div class="px-6 pt-6 sm:px-10 sm:pt-8">
|
|
40
|
+
<%= link_to new_user_session_path,
|
|
41
|
+
class: "inline-flex items-center gap-2 rounded-lg text-sm font-medium text-sky-700 transition hover:text-sky-900 focus:outline-none focus:ring-2 focus:ring-sky-500/30 focus:ring-offset-4" do %>
|
|
42
|
+
<svg class="h-5 w-5" viewBox="0 0 20 20" fill="none" aria-hidden="true">
|
|
43
|
+
<path d="m12.5 15-5-5 5-5" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"/>
|
|
44
|
+
</svg>
|
|
45
|
+
<span><%= I18n.t("actions.back_to_login", default: "Back to login") %></span>
|
|
51
46
|
<% end %>
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
<%# Logo container %>
|
|
55
|
-
<div class="logo has-text-centered mb-6">
|
|
56
|
-
<%= image_tag(
|
|
57
|
-
"lesli_assets/brand/app-auth.svg",
|
|
58
|
-
:class => "#{lesli_instance_code}-logo mb-2",
|
|
59
|
-
:alt => "Main logo")
|
|
60
|
-
%>
|
|
61
|
-
<h1 class="is-title is-size-3 has-text-primary">
|
|
62
|
-
<%#= I18n.t("core.users/sessions.view_text_welcome") %>
|
|
63
|
-
<%= title %>
|
|
64
|
-
</h1>
|
|
65
|
-
</div>
|
|
47
|
+
</div>
|
|
48
|
+
<% end %>
|
|
66
49
|
|
|
67
|
-
|
|
50
|
+
<div class="flex flex-1 items-center justify-center px-6 py-10 sm:px-10 lg:px-16">
|
|
51
|
+
<div class="w-full max-w-md">
|
|
52
|
+
<div class="mb-8 text-center">
|
|
53
|
+
<%= image_tag(
|
|
54
|
+
"lesli_assets/brand/app-auth.svg",
|
|
55
|
+
class: "#{lesli_instance_code}-logo mx-auto mb-6 h-auto max-h-20 w-auto max-w-[220px]",
|
|
56
|
+
alt: I18n.t("lesli_shield.authentication.logo_alt", default: "Application logo")
|
|
57
|
+
) %>
|
|
68
58
|
|
|
59
|
+
<% if title.present? %>
|
|
60
|
+
<h1 class="text-3xl font-semibold tracking-tight text-slate-900"><%= title %></h1>
|
|
61
|
+
<% end %>
|
|
69
62
|
</div>
|
|
70
|
-
|
|
71
|
-
|
|
63
|
+
|
|
64
|
+
<%= yield %>
|
|
72
65
|
</div>
|
|
73
66
|
</div>
|
|
74
|
-
<div class="column background is-hidden-touch"></div>
|
|
75
67
|
</section>
|
|
68
|
+
|
|
69
|
+
<aside class="lesli-auth-visual relative hidden min-h-screen overflow-hidden lg:col-span-2 lg:block" aria-hidden="true">
|
|
70
|
+
<div class="absolute inset-0 bg-gradient-to-t from-slate-950/70 via-slate-900/10 to-transparent"></div>
|
|
71
|
+
<div class="absolute inset-x-0 bottom-0 p-12 text-white">
|
|
72
|
+
<p class="max-w-lg text-3xl font-semibold leading-tight">
|
|
73
|
+
<%= I18n.t("lesli_shield.authentication.tagline", default: "A better way to manage your work.") %>
|
|
74
|
+
</p>
|
|
75
|
+
</div>
|
|
76
|
+
</aside>
|
|
76
77
|
</main>
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
|
|
2
|
-
<fieldset class="
|
|
3
|
-
<legend>
|
|
4
|
-
<
|
|
5
|
-
|
|
2
|
+
<fieldset class="mb-8 rounded-xl border border-sky-200 bg-sky-50 px-4 pb-4 text-sm text-sky-950">
|
|
3
|
+
<legend class="px-2 font-semibold text-sky-800">Demo account</legend>
|
|
4
|
+
<dl class="mt-1 grid grid-cols-[auto_1fr] gap-x-3 gap-y-1">
|
|
5
|
+
<dt class="font-medium">Username:</dt>
|
|
6
|
+
<dd class="break-all"><%= Lesli.config.company[:email] %></dd>
|
|
7
|
+
<dt class="font-medium">Password:</dt>
|
|
8
|
+
<dd><%= Lesli.config.security[:password] %></dd>
|
|
9
|
+
</dl>
|
|
6
10
|
</fieldset>
|
|
@@ -3,3 +3,17 @@
|
|
|
3
3
|
lesli_shield:
|
|
4
4
|
devise/sessions:
|
|
5
5
|
message_not_valid_credentials: Not valid credentials
|
|
6
|
+
view_title: Welcome to Lesli
|
|
7
|
+
button_log_in: Log in
|
|
8
|
+
view_still_not_registered: Still not registered?
|
|
9
|
+
button_create_account: Create account
|
|
10
|
+
devise/registrations:
|
|
11
|
+
view_title: Create an account to discover Lesli
|
|
12
|
+
view_password_requirements: 'Password needs to contain:'
|
|
13
|
+
view_password_requirements_uppercase: 'Minimum one uppercase letter '
|
|
14
|
+
button_create_account: Create account
|
|
15
|
+
view_already_have_an_account: Already have an account?
|
|
16
|
+
button_login: Log in
|
|
17
|
+
dashboards:
|
|
18
|
+
view_password_requirements_symbol: One symbol
|
|
19
|
+
view_password_requirements_number: One number
|
|
@@ -3,3 +3,17 @@
|
|
|
3
3
|
lesli_shield:
|
|
4
4
|
devise/sessions:
|
|
5
5
|
message_not_valid_credentials: Credenciales no validas
|
|
6
|
+
view_title: ":lesli_shield.devise/sessions.view_title:"
|
|
7
|
+
button_log_in: Iniciar sesión
|
|
8
|
+
view_still_not_registered: "¿Aún no tienes cuenta?"
|
|
9
|
+
button_create_account: Crear cuenta
|
|
10
|
+
devise/registrations:
|
|
11
|
+
view_title: Crea una cuenta y descubre Lesli
|
|
12
|
+
view_password_requirements: 'La contraseña debe incluir:'
|
|
13
|
+
view_password_requirements_uppercase: Una letra mayuscula
|
|
14
|
+
button_create_account: Crear cuenta
|
|
15
|
+
view_already_have_an_account: "¿Ya tienes cuenta?"
|
|
16
|
+
button_login: Iniciar sesión
|
|
17
|
+
dashboards:
|
|
18
|
+
view_password_requirements_symbol: Un caracter especial
|
|
19
|
+
view_password_requirements_number: Un número
|
data/lib/lesli_shield/version.rb
CHANGED