diff --git a/app/assets/fonts/pirata-one-regular.ttf b/app/assets/fonts/pirata-one-regular.ttf new file mode 100644 index 0000000..69d4bfc Binary files /dev/null and b/app/assets/fonts/pirata-one-regular.ttf differ diff --git a/app/assets/stylesheets/application.bootstrap.scss b/app/assets/stylesheets/application.bootstrap.scss index e37c8c3..8bf2bb1 100644 --- a/app/assets/stylesheets/application.bootstrap.scss +++ b/app/assets/stylesheets/application.bootstrap.scss @@ -1140,22 +1140,180 @@ dialog { transform: translateY(-3px); } +@font-face { + font-family: "Pirata One Local"; + src: url("/pirata-one-regular.ttf") format("truetype"); + font-style: normal; + font-weight: 400; + font-display: swap; +} + .repair-partner-logo-link { + --repair-partner-title-color: #f3e2bf; + --repair-partner-shadow: rgba(18, 10, 3, 0.35); width: 100%; - max-width: 190px; + max-width: 210px; aspect-ratio: 1 / 1; + position: relative; display: inline-flex; - align-items: center; + align-items: flex-end; justify-content: center; - padding: 0.35rem; + padding: 0 1rem 1rem; + text-decoration: none; + perspective: 2500px; + isolation: isolate; + color: var(--repair-partner-title-color); +} + +.repair-partner-logo-link:hover, +.repair-partner-logo-link:focus-visible { + color: var(--repair-partner-title-color); text-decoration: none; - border-radius: 0.65rem; +} + +.repair-partner-logo-link:focus-visible { + outline: 2px solid rgba(113, 28, 28, 0.55); + outline-offset: 0.35rem; +} + +.repair-partner-logo-link__wrapper { + position: absolute; + inset: 0; + z-index: 0; + display: flex; + align-items: center; + justify-content: center; + padding: 0.2rem; + overflow: visible; + transition: transform 0.5s ease; + transform-origin: center; +} + +.repair-partner-logo-link__wrapper::before, +.repair-partner-logo-link__wrapper::after { + content: ""; + position: absolute; + inset-inline: 0; + pointer-events: none; + transition: opacity 0.5s ease, height 0.5s ease; +} + +.repair-partner-logo-link__wrapper::before { + inset-block: 0; + opacity: 0; + background-image: linear-gradient( + to top, + transparent 42%, + rgba(18, 10, 3, 0.24) 70%, + rgba(18, 10, 3, 0.7) 100% + ); +} + +.repair-partner-logo-link__wrapper::after { + bottom: 0; + height: 88px; + opacity: 0.78; + background-image: linear-gradient( + to bottom, + transparent 18%, + rgba(18, 10, 3, 0.12) 60%, + rgba(18, 10, 3, 0.76) 100% + ); +} + +.repair-partner-logo-link:hover .repair-partner-logo-link__wrapper, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__wrapper { + transform: perspective(900px) translateY(-5%) rotateX(25deg); +} + +.repair-partner-logo-link:hover .repair-partner-logo-link__wrapper::before, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__wrapper::before, +.repair-partner-logo-link:hover .repair-partner-logo-link__wrapper::after, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__wrapper::after { + opacity: 1; +} + +.repair-partner-logo-link:hover .repair-partner-logo-link__wrapper::after, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__wrapper::after { + height: 128px; } .repair-partner-logo-link__image { width: 100%; height: 100%; object-fit: contain; + filter: drop-shadow(0 16px 24px rgba(47, 20, 4, 0.15)); + transition: transform 0.5s ease, filter 0.5s ease; +} + +.repair-partner-logo-link:hover .repair-partner-logo-link__image, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__image { + transform: translateY(-0.4rem) scale(1.03); + filter: + drop-shadow(0 22px 32px rgba(18, 10, 3, 0.2)) + drop-shadow(2px 35px 32px var(--repair-partner-shadow)); +} + +.repair-partner-logo-link__title { + position: relative; + z-index: 1; + display: block; + max-width: 85%; + margin-bottom: 0.1rem; + text-align: center; + font-family: "Pirata One Local", "Times New Roman", serif; + font-size: clamp(1.3rem, 1.05rem + 0.75vw, 1.85rem); + line-height: 0.95; + letter-spacing: 0.08em; + text-transform: uppercase; + text-shadow: 0 10px 18px rgba(0, 0, 0, 0.48); + opacity: 0; + transform: translate3d(0, 0.75rem, 70px) scale(0.92); + transform-origin: bottom center; + transition: transform 0.5s ease, opacity 0.35s ease; + pointer-events: none; +} + +.repair-partner-logo-link:hover .repair-partner-logo-link__title, +.repair-partner-logo-link:focus-visible .repair-partner-logo-link__title { + opacity: 1; + transform: translate3d(0, -2.1rem, 100px) scale(1); +} + +@media (hover: none) { + .repair-partner-logo-link { + padding: 0; + aspect-ratio: auto; + display: flex; + flex-direction: column; + gap: 0.75rem; + align-items: stretch; + } + + .repair-partner-logo-link__wrapper { + position: relative; + inset: auto; + aspect-ratio: 1 / 1; + } + + .repair-partner-logo-link__title { + max-width: none; + margin-bottom: 0; + opacity: 1; + color: #4c1f12; + text-shadow: none; + transform: none; + } +} + +@media (prefers-reduced-motion: reduce) { + .repair-partner-logo-link__wrapper, + .repair-partner-logo-link__wrapper::before, + .repair-partner-logo-link__wrapper::after, + .repair-partner-logo-link__image, + .repair-partner-logo-link__title { + transition: none; + } } @media (max-width: 991.98px) { diff --git a/app/controllers/home_pages_controller.rb b/app/controllers/home_pages_controller.rb index 8c2234e..1348248 100644 --- a/app/controllers/home_pages_controller.rb +++ b/app/controllers/home_pages_controller.rb @@ -81,6 +81,6 @@ def set_home_page # Only allow a list of trusted parameters through. def home_page_params params.expect(home_page: [ :title, :content, :position, :bloc_type, :target_id, :shop_scope, :image, :button_label, - :layout_background, :layout_text_tone, :layout_image_position ]) + :layout_background, :layout_text_tone, :layout_image_position, :shop_products_limit ]) end end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index 3c34c81..66666d1 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -1,4 +1,4 @@ class ApplicationMailer < ActionMailer::Base - default from: "from@example.com" + default from: ENV["GMAIL_LOGIN"] layout "mailer" end diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index f98a297..4fd2510 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -3,20 +3,17 @@ class UserMailer < Devise::Mailer layout "mailer" def welcome_email(user) - # on récupère l'instance user pour ensuite pouvoir la passer à la view en @user @user = user + @login_url = "#{app_host}/users/sign_in" + @home_url = app_host - # on définit une variable @url qu'on utilisera dans la view d’e-mail - @url = "http://monsite.fr/login" - - # c'est cet appel à mail() qui permet d'envoyer l’e-mail en définissant destinataire et sujet. - mail(to: @user.email, subject: "Bienvenue Templier !") + mail(to: @user.email, subject: "Bienvenue sur l'atelier") end def order_email(order) @order = order @user = order.user - @url = "http://localhost:3000/orders/#{order.id}" + @order_url = "#{app_host}/orders/#{order.id}" mail(to: @user.email, subject: "Confirmation de commande ##{order.id}") end @@ -25,18 +22,18 @@ def admin_order_email(order) @admins = User.where(is_admin: true) @order = order @user = order.user - @url = "http://localhost:3000/orders/#{order.id}" + @order_url = "#{app_host}/orders/#{order.id}" mail( to: @admins.pluck(:email), - subject: "Nouvelle commande ##{@order.id} reçue !" + subject: "Nouvelle commande ##{@order.id}" ) end def order_status_update_email(order, previous_status:) @order = order @user = order.user - @url = "http://localhost:3000/orders/#{order.id}" + @order_url = "#{app_host}/orders/#{order.id}" @current_status = order.status_label if previous_status.present? && previous_status != order.status @previous_status = order.status_label(previous_status) @@ -51,19 +48,25 @@ def order_status_update_email(order, previous_status:) def request_treatment_email(contact) @contact = contact - @url = "http://localhost:3000/contacts/new" - mail(to: @contact.email, subject: "Demande en cours de traitement") + @contact_url = "#{app_host}/contacts/new" + @home_url = app_host + mail(to: @contact.email, subject: "Confirmation de réception de votre message") end def admin_contact_email(contact) @admins = User.where(is_admin: true) @contact = contact - @url = "http://localhost:3000/contacts/new" - + @contact_url = "#{app_host}/contacts/new" + mail( to: @admins.pluck(:email), - subject: "Nouvelle demande de contact !" + subject: "Nouvelle demande de contact" ) end + private + + def app_host + ENV["APP_HOST"].to_s.chomp("/") + end end diff --git a/app/models/home_page.rb b/app/models/home_page.rb index f33a680..00f0377 100644 --- a/app/models/home_page.rb +++ b/app/models/home_page.rb @@ -38,6 +38,12 @@ class HomePage < ApplicationRecord has_one_attached :image validates :button_url, length: { maximum: 1024 }, allow_blank: true + validates :shop_products_limit, + numericality: { + only_integer: true, + greater_than: 0, + message: "doit être un entier supérieur à 0" + } def target_record case bloc_type @@ -47,18 +53,20 @@ def target_record end end - def shop_products(limit = 5) + def shop_products(limit = shop_products_limit) + safe_limit = [limit.to_i, 1].max + case shop_scope when "last" - Product.order(created_at: :desc).limit(limit) + Product.order(created_at: :desc).limit(safe_limit) when "top_sellers" Product.left_joins(:order_products) .select("products.*, COALESCE(SUM(order_products.quantity), 0) AS total_sold") .group("products.id") .order(Arel.sql("total_sold DESC")) - .limit(limit) + .limit(safe_limit) else - Product.order(created_at: :asc).limit(limit) + Product.order(created_at: :asc).limit(safe_limit) end end diff --git a/app/views/devise/mailer/confirmation_instructions.html.erb b/app/views/devise/mailer/confirmation_instructions.html.erb index dc55f64..ef5d1e6 100644 --- a/app/views/devise/mailer/confirmation_instructions.html.erb +++ b/app/views/devise/mailer/confirmation_instructions.html.erb @@ -1,5 +1,5 @@ -
Welcome <%= @email %>!
+Bonjour <%= @email %>,
-You can confirm your account email through the link below:
+Vous pouvez confirmer votre adresse e-mail via le lien ci-dessous :
-<%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %>
+<%= link_to "Confirmer mon compte", confirmation_url(@resource, confirmation_token: @token) %>
diff --git a/app/views/devise/mailer/email_changed.html.erb b/app/views/devise/mailer/email_changed.html.erb index 32f4ba8..07946bb 100644 --- a/app/views/devise/mailer/email_changed.html.erb +++ b/app/views/devise/mailer/email_changed.html.erb @@ -1,7 +1,7 @@ -Hello <%= @email %>!
+Bonjour <%= @email %>,
<% if @resource.try(:unconfirmed_email?) %> -We're contacting you to notify you that your email is being changed to <%= @resource.unconfirmed_email %>.
+Nous vous informons que votre adresse e-mail est en cours de modification vers <%= @resource.unconfirmed_email %>.
<% else %> -We're contacting you to notify you that your email has been changed to <%= @resource.email %>.
+Nous vous informons que votre adresse e-mail a bien été modifiée en <%= @resource.email %>.
<% end %> diff --git a/app/views/devise/mailer/password_change.html.erb b/app/views/devise/mailer/password_change.html.erb index b41daf4..c350a41 100644 --- a/app/views/devise/mailer/password_change.html.erb +++ b/app/views/devise/mailer/password_change.html.erb @@ -1,3 +1,3 @@ -Hello <%= @resource.email %>!
+Bonjour <%= @resource.email %>,
-We're contacting you to notify you that your password has been changed.
+Nous vous confirmons que votre mot de passe a bien été modifié.
diff --git a/app/views/devise/mailer/reset_password_instructions.html.erb b/app/views/devise/mailer/reset_password_instructions.html.erb index f667dc1..bf6d1ea 100644 --- a/app/views/devise/mailer/reset_password_instructions.html.erb +++ b/app/views/devise/mailer/reset_password_instructions.html.erb @@ -1,8 +1,8 @@ -Hello <%= @resource.email %>!
+Bonjour <%= @resource.email %>,
-Someone has requested a link to change your password. You can do this through the link below.
+Une demande de réinitialisation de mot de passe a été effectuée pour votre compte.
-<%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %>
+<%= link_to "Changer mon mot de passe", edit_password_url(@resource, reset_password_token: @token) %>
-If you didn't request this, please ignore this email.
-Your password won't change until you access the link above and create a new one.
+Si vous n'êtes pas à l'origine de cette demande, vous pouvez ignorer cet e-mail.
+Votre mot de passe ne changera pas tant que vous n'aurez pas ouvert le lien ci-dessus et défini un nouveau mot de passe.
diff --git a/app/views/devise/mailer/unlock_instructions.html.erb b/app/views/devise/mailer/unlock_instructions.html.erb index 41e148b..3c3c81e 100644 --- a/app/views/devise/mailer/unlock_instructions.html.erb +++ b/app/views/devise/mailer/unlock_instructions.html.erb @@ -1,7 +1,7 @@ -Hello <%= @resource.email %>!
+Bonjour <%= @resource.email %>,
-Your account has been locked due to an excessive number of unsuccessful sign in attempts.
+Votre compte a été verrouillé après un trop grand nombre de tentatives de connexion échouées.
-Click the link below to unlock your account:
+Vous pouvez le déverrouiller via le lien ci-dessous :
-<%= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) %>
+<%= link_to "Déverrouiller mon compte", unlock_url(@resource, unlock_token: @token) %>
diff --git a/app/views/home_pages/_form.html.erb b/app/views/home_pages/_form.html.erb index 28d1aa0..635f578 100644 --- a/app/views/home_pages/_form.html.erb +++ b/app/views/home_pages/_form.html.erb @@ -91,12 +91,17 @@Nom : <%= @contact.name.presence || "Non renseigné" %>
Email : <%= @contact.email %>
Sujet : <%= @contact.subject %>
Message :
<%= simple_format(@contact.message) %>
-Consulter toutes les demandes sur <%= link_to "l'espace admin", @url || root_url %>.
++ Formulaire de contact : + <%= link_to @contact_url, @contact_url %> +
diff --git a/app/views/user_mailer/admin_contact_email.text.erb b/app/views/user_mailer/admin_contact_email.text.erb index e8dd3b5..fad97e3 100644 --- a/app/views/user_mailer/admin_contact_email.text.erb +++ b/app/views/user_mailer/admin_contact_email.text.erb @@ -1,4 +1,4 @@ -Nouvelle demande de contact +Nouveau message de contact ========================== Nom : <%= @contact.name.presence || "Non renseigné" %> @@ -8,4 +8,4 @@ Sujet : <%= @contact.subject %> Message : <%= @contact.message %> -Consultez l'espace admin via <%= @url || root_url %>. +Formulaire de contact : <%= @contact_url %> diff --git a/app/views/user_mailer/admin_order_email.html.erb b/app/views/user_mailer/admin_order_email.html.erb index fe5a2da..64f876c 100644 --- a/app/views/user_mailer/admin_order_email.html.erb +++ b/app/views/user_mailer/admin_order_email.html.erb @@ -5,7 +5,13 @@Commande n°<%= @order.id %> passée par <%= @user.email %>.
-Consulter : <%= @url %>
+La commande n°<%= @order.id %> a été validée par <%= @user.email %>.
+ <% if @order.order_date.present? %> +Date de commande : <%= @order.order_date.strftime("%d/%m/%Y") %>
+ <% end %> ++ Consulter la commande : + <%= link_to @order_url, @order_url %> +