Files
PleinR/src/app/globals.css
T
Claude bfc82b3b3b Tags adhérents automatiques : vocabulaire par métier, suggestions et repli
- src/lib/tags.ts (pur) : mots-clés par métier pour les 104 catégories,
  vocabulaire transversal détecté dans la description (fait maison, bio,
  livraison, sur rendez-vous, devis gratuit…), suggestTags() qui combine
  métier, commune et description, autoTags() qui n'intervient qu'à vide.
- Enregistrement : addMember, updateMember et updateOwnProfile passent par
  resolveMemberTags() ; un champ laissé vide reçoit les suggestions, une
  saisie n'est jamais remplacée.
- Formulaires : composant TagsField (champ non contrôlé + pastilles de
  suggestions recalculées à chaque frappe depuis catégorie, commune et
  description ; « Tout ajouter »), dans l'espace adhérent et la fiche staff.
- Fiche publique : les fiches jamais ré-enregistrées affichent les tags
  suggérés et les transmettent dans LocalBusiness.keywords.
- tests/tags.test.ts : couverture de chaque métier, nettoyage, détection,
  ordre des suggestions, non-écrasement.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HDbKbJrPWweXXYSxA8MXW7
2026-09-06 06:51:25 +00:00

1507 lines
30 KiB
CSS

:root {
--cream: #f6f2e8;
--cream-2: #efe9da;
--cream-3: #ede7d7;
--ink: #33291d;
--ink-strong: #26201a;
--ink-soft: #3c3322;
--muted: #6c6150;
--muted-2: #8c8068;
--muted-3: #9a8d72;
--muted-4: #a99c82;
--brown: #9a6638;
--blue: #2c6fb3;
--blue-deep: #1e588f;
--navy: #13324f;
--gold: #e0a63c;
--teal: #6fb0c6;
--green: #1f8a5b;
--red: #d8472b;
--border: #e6dcc6;
--border-2: #f0e8d6;
--field-border: #ddd2bb;
--field-bg: #faf7ef;
}
* {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
}
body {
background: var(--cream);
font-family: "Public Sans", system-ui, sans-serif;
color: var(--ink);
}
a {
color: inherit;
}
.font-display {
font-family: "Bricolage Grotesque", "Public Sans", system-ui, sans-serif;
}
input::placeholder,
textarea::placeholder {
color: var(--muted-4);
}
button {
font-family: inherit;
}
/* ---- Animations ---- */
@keyframes plr-twinkle {
0% {
transform: translate(0, 0) scale(0.9) rotate(0deg);
opacity: 0.55;
}
25% {
transform: translate(4px, -9px) scale(1.15) rotate(15deg);
opacity: 1;
}
50% {
transform: translate(-3px, -13px) scale(1.32) rotate(26deg);
opacity: 0.85;
}
75% {
transform: translate(-5px, -5px) scale(1.1) rotate(12deg);
opacity: 1;
}
100% {
transform: translate(0, 0) scale(0.9) rotate(0deg);
opacity: 0.55;
}
}
@keyframes plr-floatlogo {
0%,
100% {
transform: translateY(0) rotate(-0.6deg);
}
50% {
transform: translateY(-14px) rotate(0.6deg);
}
}
/* Dérive lente des étoiles. Utilise la propriété `translate` (indépendante de
`transform`) pour se cumuler avec le scintillement `plr-twinkle`. */
@keyframes plr-drift {
0%,
100% {
translate: 0 0;
}
33% {
translate: 12px -18px;
}
66% {
translate: -10px 10px;
}
}
.sparkle {
clip-path: polygon(50% 0, 60% 40%, 100% 50%, 60% 60%, 50% 100%, 40% 60%, 0 50%, 40% 40%);
}
/* ---- Champ d'étoiles flottantes ---- */
.starfield {
position: absolute;
inset: 0;
overflow: hidden;
pointer-events: none;
z-index: 0;
}
.starfield .star {
position: absolute;
animation: plr-twinkle var(--tw, 3.2s) ease-in-out infinite,
plr-drift var(--dr, 9s) ease-in-out infinite;
}
/* ---- Scroll-reveal entrance animations ---- */
@keyframes plr-fade-up {
from {
opacity: 0;
transform: translateY(18px);
}
to {
opacity: 1;
transform: none;
}
}
.reveal {
opacity: 0;
}
.reveal.is-visible {
animation: plr-fade-up 0.6s cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
/* Staggered children (grids) */
.reveal-stagger > * {
opacity: 0;
}
.reveal-stagger.is-visible > * {
animation: plr-fade-up 0.55s cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
.reveal-stagger.is-visible > *:nth-child(1) { animation-delay: 0.04s; }
.reveal-stagger.is-visible > *:nth-child(2) { animation-delay: 0.1s; }
.reveal-stagger.is-visible > *:nth-child(3) { animation-delay: 0.16s; }
.reveal-stagger.is-visible > *:nth-child(4) { animation-delay: 0.22s; }
.reveal-stagger.is-visible > *:nth-child(5) { animation-delay: 0.28s; }
.reveal-stagger.is-visible > *:nth-child(6) { animation-delay: 0.34s; }
.reveal-stagger.is-visible > *:nth-child(7) { animation-delay: 0.4s; }
.reveal-stagger.is-visible > *:nth-child(8) { animation-delay: 0.46s; }
.reveal-stagger.is-visible > *:nth-child(n + 9) { animation-delay: 0.52s; }
.twinkle {
animation: plr-twinkle 3.2s ease-in-out infinite;
}
.floatlogo {
animation: plr-floatlogo 6s ease-in-out infinite;
}
/* ---- Hover lifts ---- */
.lift {
transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
}
.lift:hover {
transform: translateY(-5px);
box-shadow: 0 16px 30px -18px rgba(40, 30, 15, 0.45);
border-color: #d8cdb4;
}
.lift-card {
transition: transform 0.28s ease, box-shadow 0.28s ease;
}
.lift-card:hover {
transform: translateY(-6px);
box-shadow: 0 24px 44px -24px rgba(40, 30, 15, 0.5);
}
.lift-cta {
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.lift-cta:hover {
transform: translateY(-3px) scale(1.03);
box-shadow: 0 16px 30px -14px rgba(0, 0, 0, 0.4);
}
.link-arrow:hover {
text-decoration: underline;
}
/* ---- Layout helpers ---- */
.container {
max-width: 1280px;
margin: 0 auto;
padding: 0 56px;
}
.grid {
display: grid;
}
.grid-6 {
grid-template-columns: repeat(6, 1fr);
gap: 14px;
}
.grid-4 {
grid-template-columns: repeat(4, 1fr);
gap: 18px;
}
.grid-3 {
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
.grid-2 {
grid-template-columns: 1fr 1fr;
gap: 22px;
}
.hero-grid {
grid-template-columns: 0.92fr 1.08fr;
gap: 48px;
align-items: center;
}
.dash-split {
grid-template-columns: 1.4fr 1fr;
gap: 18px;
}
.admins-split {
grid-template-columns: 1.5fr 1fr;
gap: 18px;
align-items: start;
}
.fiche-split {
grid-template-columns: 1.65fr 1fr;
gap: 26px;
align-items: start;
}
/* ---- En-tête public ---- */
.site-header {
display: flex;
align-items: center;
gap: 20px;
padding: 18px clamp(16px, 5vw, 56px);
}
.site-header__brand {
display: inline-flex;
align-items: center;
margin-right: auto;
}
.site-header__brand.is-desktop-hidden {
display: none;
}
.site-header__brand img {
display: block;
width: auto;
height: 46px;
}
.site-header__nav {
display: flex;
align-items: center;
gap: 30px;
margin-left: auto;
}
.site-header__link {
color: var(--muted);
font-size: 15px;
font-weight: 500;
text-decoration: none;
white-space: nowrap;
}
.site-header__link.is-active {
color: var(--ink-soft);
font-weight: 600;
}
.site-header__cta {
padding: 10px 18px;
border-radius: 999px;
background: var(--brown);
color: #fff;
font-size: 14.5px;
font-weight: 600;
text-decoration: none;
white-space: nowrap;
}
@media (max-width: 720px) {
/* Ligne 1 : logo + accès adhérent. Ligne 2 : la navigation, répartie sur
toute la largeur plutôt que repliée en escalier. */
.site-header {
flex-wrap: wrap;
gap: 10px 12px;
padding: 12px 16px;
}
.site-header__brand,
.site-header__brand.is-desktop-hidden {
display: inline-flex;
}
.site-header__brand img {
height: 38px;
}
.site-header__nav {
order: 3;
flex: 1 1 100%;
margin-left: 0;
gap: 6px;
justify-content: space-between;
border-top: 1px solid #e2d6bd;
padding-top: 10px;
}
.site-header__link {
font-size: 14px;
}
.site-header__cta {
padding: 9px 15px;
font-size: 13.5px;
}
}
/* ---- Public footer & legal pages ---- */
.site-footer {
background: var(--cream-2);
/* Filet doré : referme la page au lieu d'une simple ligne grise. */
border-top: 3px solid var(--gold);
}
/* Quatre colonnes : à trois, la dernière laissait un tiers de la largeur vide. */
.footer-grid {
display: grid;
grid-template-columns: minmax(240px, 1.5fr) repeat(3, minmax(0, 1fr));
gap: 40px;
align-items: start;
}
.footer-brand img {
display: block;
width: 96px;
height: auto;
}
.footer-tagline {
margin: 10px 0 0;
max-width: 340px;
color: var(--muted);
font-size: 13.5px;
line-height: 1.65;
}
.footer-title {
margin: 0 0 14px;
color: var(--brown);
font-size: 11.5px;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.footer-links {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 10px;
color: var(--muted);
font-size: 13.5px;
}
.footer-links a,
.footer-links button {
padding: 0;
border: 0;
background: none;
color: inherit;
font: inherit;
text-align: left;
text-decoration: none;
cursor: pointer;
transition: color 0.15s ease, transform 0.15s ease;
}
.footer-links a:hover,
.footer-links button:hover {
color: var(--brown);
transform: translateX(2px);
}
/* Boutons sociaux libellés : plus lisibles que deux icônes isolées, et ils
donnent enfin du contenu à la quatrième colonne. */
.footer-social {
/* Grille à une colonne dimensionnée sur son contenu : tous les boutons
prennent la largeur du plus long au lieu de s'étirer sur la colonne ou de
former un escalier. */
display: inline-grid;
grid-template-columns: minmax(150px, max-content);
gap: 9px;
}
.footer-social a {
display: flex;
align-items: center;
gap: 10px;
padding: 9px 13px;
border: 1px solid #e2d6bd;
border-radius: 11px;
background: #fff;
color: var(--ink-soft);
font-size: 13px;
font-weight: 600;
text-decoration: none;
transition: border-color 0.15s ease, transform 0.15s ease;
}
.footer-social a:hover {
transform: translateY(-1px);
}
.footer-contact {
display: flex;
flex-direction: column;
gap: 7px;
margin-top: 16px;
color: var(--muted);
font-size: 13px;
}
.footer-contact a {
color: inherit;
text-decoration: none;
}
.footer-contact a:hover {
color: var(--brown);
}
.footer-bottom {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px 20px;
flex-wrap: wrap;
border-top: 1px solid #ded2b9;
margin-top: 34px;
padding-top: 18px;
color: var(--muted-2);
font-size: 12.5px;
}
.footer-bottom__place {
display: inline-flex;
align-items: center;
gap: 7px;
}
.footer-bottom__place::before {
content: "";
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--gold);
}
.legal-content h2 {
font-family: "Bricolage Grotesque", "Public Sans", system-ui, sans-serif;
color: var(--ink-strong);
font-size: 20px;
margin: 28px 0 8px;
}
.legal-content p,
.legal-content li {
color: var(--muted);
font-size: 14.5px;
line-height: 1.75;
}
.legal-content p {
margin: 0 0 12px;
}
.legal-content ul {
margin: 8px 0 14px;
padding-left: 20px;
}
@media (max-width: 1024px) {
.grid-6 {
grid-template-columns: repeat(3, 1fr);
}
.grid-4 {
grid-template-columns: repeat(2, 1fr);
}
.grid-3 {
grid-template-columns: repeat(2, 1fr);
}
.dash-split,
.admins-split,
.fiche-split {
grid-template-columns: 1fr;
}
}
@media (max-width: 860px) {
.container {
padding: 0 24px;
}
.hero-grid {
grid-template-columns: 1fr;
}
.grid-2 {
grid-template-columns: 1fr;
}
.footer-grid {
/* Quatre colonnes ne tiennent plus : la marque prend toute la ligne. */
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 30px;
}
.footer-grid > :first-child {
grid-column: 1 / -1;
}
}
@media (max-width: 640px) {
.grid-6,
.grid-3 {
grid-template-columns: 1fr;
}
/* Les compteurs du tableau de bord restent sur deux colonnes : empilés, ils
imposaient un écran entier de défilement pour quatre chiffres. */
.grid-4 {
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.container {
padding: 0 16px;
}
.footer-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 26px;
}
.footer-grid > :first-child,
/* « Nous suivre » resterait seule dans une colonne, la moitié droite vide. */
.footer-grid > :last-child {
grid-column: 1 / -1;
}
.footer-social {
flex-direction: row;
flex-wrap: wrap;
}
.footer-bottom {
justify-content: flex-start;
}
}
/* Évite tout débordement horizontal sur mobile. */
html,
body {
overflow-x: hidden;
max-width: 100%;
}
img {
max-width: 100%;
}
/* Tables/listes larges du back-office : défilement horizontal contenu. */
.table-scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
/* ---- « Ce que l'association vous apporte » (page Association) ---- */
.pillars-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 14px;
}
.pillar-card {
padding: 18px 18px 20px;
border: 1px solid rgba(255, 255, 255, 0.14);
border-radius: 16px;
background: rgba(255, 255, 255, 0.05);
}
.pillar-card__index {
color: var(--gold);
font-size: 13px;
font-weight: 800;
letter-spacing: 0.08em;
}
.pillar-card__title {
margin: 8px 0 7px;
color: #fff;
font-size: 17px;
font-weight: 700;
line-height: 1.25;
}
.pillar-card__text {
margin: 0;
color: #a9c4da;
font-size: 13.5px;
line-height: 1.65;
}
@media (max-width: 1024px) {
.pillars-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 620px) {
.pillars-grid {
grid-template-columns: 1fr;
}
}
/* ---- Compteurs du tableau de bord ---- */
.stat-card {
padding: 20px;
}
.stat-card__label {
margin-bottom: 8px;
color: var(--muted-3);
font-size: 13px;
}
.stat-card__value {
font-size: 32px;
font-weight: 800;
}
.stat-card__hint {
margin-top: 6px;
font-size: 12px;
font-weight: 600;
}
@media (max-width: 640px) {
.stat-card {
padding: 14px;
}
.stat-card__label {
margin-bottom: 4px;
font-size: 12px;
}
.stat-card__value {
font-size: 26px;
}
.stat-card__hint {
margin-top: 3px;
font-size: 11px;
}
}
/* ---- Liste des adhérents : tableau sur grand écran, fiches sur téléphone ---- */
.member-row {
display: grid;
grid-template-columns: 1.6fr 1fr 1.2fr 0.9fr 0.8fr;
align-items: center;
gap: 12px;
}
.member-row__identity {
display: flex;
align-items: center;
gap: 12px;
min-width: 0;
}
.member-row__mail {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.member-row__action {
text-align: right;
}
@media (max-width: 760px) {
/* Un tableau à 5 colonnes est illisible sur un téléphone : chaque adhérent
devient une fiche qui se replie, sans défilement horizontal. */
.member-row {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 9px 10px;
}
/* Doit rester après `.member-row` : même spécificité, c'est l'ordre qui tranche. */
.member-row.member-head {
display: none;
}
.member-row__identity {
flex: 1 1 100%;
}
/* Base 0 : les métadonnées ne réclament pas leur largeur de contenu, donc la
ligne ne se replie pas et c'est le texte qui se rogne. Chaque fiche tient
ainsi sur deux lignes, toujours de la même façon. */
.member-row__meta {
flex: 1 1 0;
min-width: 0;
overflow: hidden;
font-size: 13px !important;
text-overflow: ellipsis;
white-space: nowrap;
}
.member-row__action {
flex: 0 0 auto;
margin-left: auto;
text-align: right;
}
}
/* ---- Backend layout ---- */
.backend {
display: flex;
min-height: 100vh;
background: var(--cream-3);
}
.sidebar {
width: 248px;
flex-shrink: 0;
background: var(--navy);
color: #cfe0ee;
display: flex;
flex-direction: column;
padding: 22px 16px;
position: sticky;
top: 0;
height: 100vh;
}
.sidebar-brand {
display: flex;
align-items: center;
gap: 11px;
padding: 6px 8px 18px;
}
.sidebar-close {
display: none;
align-items: center;
justify-content: center;
/* 40px : cible tactile confortable au pouce. */
width: 40px;
height: 40px;
flex-shrink: 0;
border: 0;
border-radius: 10px;
background: rgba(255, 255, 255, 0.08);
color: #cfe0ee;
cursor: pointer;
}
.sidebar-nav {
flex: 1 1 auto;
min-width: 0;
/* Sans min-height:0 un enfant flex refuse de rétrécir : la zone débordait
sous la carte utilisateur, qui interceptait les clics sur les derniers
liens au lieu de laisser défiler le menu. */
min-height: 0;
overflow-y: auto;
}
.sidebar-section {
padding: 16px 10px 7px;
color: #5f7d97;
font-size: 10.5px;
font-weight: 700;
letter-spacing: 0.14em;
text-transform: uppercase;
}
.sidebar-nav > div:first-child .sidebar-section {
padding-top: 4px;
}
.sidebar-user {
display: flex;
align-items: center;
gap: 11px;
margin-top: 14px;
padding: 11px 12px;
border-radius: 12px;
background: rgba(255, 255, 255, 0.06);
}
/* Sur grand écran les actions vivent dans l'entête, pas dans la barre. */
.sidebar-actions {
display: none;
gap: 9px;
margin-top: 12px;
}
.nav-btn {
display: flex;
align-items: center;
gap: 11px;
width: 100%;
text-align: left;
border: none;
cursor: pointer;
font-family: "Public Sans", sans-serif;
font-size: 14px;
font-weight: 600;
padding: 11px 12px;
border-radius: 10px;
margin-bottom: 3px;
transition: background 0.15s;
text-decoration: none;
background: transparent;
color: #9bb6cd;
}
.nav-btn:hover {
background: rgba(255, 255, 255, 0.06);
color: #cfe0ee;
}
.nav-btn.active {
background: rgba(224, 166, 60, 0.22);
color: #fff;
box-shadow: inset 3px 0 0 var(--gold);
}
.sidebar-backdrop {
display: none;
position: fixed;
inset: 0;
z-index: 40;
border: 0;
padding: 0;
background: rgba(19, 50, 79, 0.5);
}
.backend-header {
display: flex;
align-items: center;
gap: 16px;
padding: 18px 32px;
background: var(--cream);
border-bottom: 1px solid #e2d6bd;
position: sticky;
top: 0;
z-index: 5;
}
.backend-header__title {
margin: 0;
color: var(--ink-strong);
font-size: 22px;
font-weight: 800;
}
.backend-header__sub {
margin-top: 2px;
color: var(--muted-3);
font-size: 13px;
}
.backend-header__actions {
display: flex;
align-items: center;
gap: 12px;
}
.backend-burger {
display: none;
padding: 9px;
border: 1px solid #d8cdb4;
border-radius: 10px;
background: #fff;
color: var(--ink-soft);
cursor: pointer;
}
.backend-action {
display: inline-block;
border: 1px solid #d8cdb4;
border-radius: 10px;
padding: 9px 15px;
background: transparent;
color: var(--muted);
font-family: inherit;
font-size: 13.5px;
font-weight: 600;
text-decoration: none;
white-space: nowrap;
cursor: pointer;
}
.backend-action--strong {
background: #fff;
color: var(--brown);
font-weight: 700;
}
.backend-content {
flex: 1;
padding: 28px 32px 44px;
min-width: 0;
}
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-thumb {
background: #d8cdb4;
border-radius: 6px;
}
/* Sous 1024px la barre latérale devient un tiroir : l'empiler en ligne rendait
la navigation illisible sur téléphone. */
@media (max-width: 1024px) {
.backend {
flex-direction: column;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
z-index: 50;
width: min(304px, 86vw);
height: 100dvh;
padding: 18px 14px;
transform: translateX(-100%);
transition: transform 0.25s ease;
box-shadow: 0 0 40px rgba(19, 50, 79, 0.35);
}
.sidebar.is-open {
transform: translateX(0);
}
.sidebar-close,
.sidebar-actions {
display: flex;
}
.sidebar-actions .backend-action {
flex: 1;
border-color: rgba(255, 255, 255, 0.22);
color: #cfe0ee;
text-align: center;
}
.sidebar-actions form {
flex: 1;
}
.sidebar-actions .backend-action--strong {
width: 100%;
background: var(--gold);
border-color: var(--gold);
color: var(--ink);
}
.sidebar-backdrop {
display: block;
}
.backend-burger {
display: inline-flex;
}
.backend-header__actions {
display: none;
}
.backend-header {
padding: 13px 16px;
gap: 12px;
}
.backend-header__title {
font-size: 18px;
}
.backend-header__sub {
font-size: 12px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.backend-content {
padding: 18px 16px 40px;
}
}
/* ---- Forms ---- */
.field {
width: 100%;
border: 1px solid var(--field-border);
border-radius: 10px;
padding: 11px 13px;
font-size: 14px;
font-family: "Public Sans", sans-serif;
color: var(--ink-soft);
background: var(--field-bg);
}
.field:focus {
outline: 2px solid rgba(44, 111, 179, 0.35);
outline-offset: 1px;
}
.field-label {
display: block;
font-size: 12.5px;
font-weight: 700;
color: var(--muted);
margin-bottom: 6px;
}
/* Suggestions de tags : pastilles cliquables sous le champ. */
.tag-suggestions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 6px;
margin-top: 8px;
}
.tag-suggestions__label {
font-size: 12px;
font-weight: 700;
color: var(--muted-2);
margin-right: 2px;
}
.tag-suggestion {
cursor: pointer;
font: inherit;
font-size: 12.5px;
font-weight: 600;
padding: 5px 11px;
border-radius: 999px;
border: 1px dashed #d8cdb4;
background: #faf7ef;
color: var(--ink-soft);
transition: background 0.15s ease, border-color 0.15s ease;
}
.tag-suggestion:hover {
background: #f6efdc;
border-color: var(--gold);
}
.tag-suggestion--all {
border-style: solid;
color: var(--brown);
}
/* Conseil de rédaction sous un champ : discret, mais lu avant de saisir. */
.field-hint {
margin: 6px 0 0;
font-size: 12.5px;
line-height: 1.5;
color: var(--muted-2);
}
/* ---- Studio e-mail Plein R ---- */
.email-workbench {
display: grid;
grid-template-columns: 370px minmax(0, 1fr);
gap: 26px;
align-items: start;
}
.email-editor-card {
background: #fff;
border: 1px solid var(--border);
border-top: 5px solid var(--gold);
border-radius: 16px;
padding: 23px;
box-shadow: 0 22px 44px -38px rgba(19, 50, 79, 0.75);
}
.email-editor-kicker {
color: var(--brown);
font-size: 10.5px;
font-weight: 800;
letter-spacing: 0.14em;
text-transform: uppercase;
}
.email-preview-shell {
border: 1px solid #d8cdb4;
border-radius: 15px;
overflow: hidden;
background: #f6f2e8;
box-shadow: 0 24px 48px -38px rgba(19, 50, 79, 0.65);
}
.email-preview-shell iframe {
display: block;
width: 100%;
height: 760px;
border: 0;
background: #f6f2e8;
}
.email-preview-shell.compact iframe {
height: 590px;
}
.email-primary-button,
.email-secondary-button,
.meeting-email-button {
border-radius: 10px;
padding: 11px 14px;
font-family: inherit;
font-size: 13px;
font-weight: 800;
cursor: pointer;
}
.email-primary-button {
border: 1px solid #13324f;
background: #13324f;
color: #fff;
}
.email-secondary-button {
border: 1px solid #d8cdb4;
background: #fff;
color: #5a5040;
}
.email-primary-button:hover { background: #1e588f; }
.email-secondary-button:hover { border-color: #9a6638; color: #9a6638; }
.email-primary-button:disabled,
.email-secondary-button:disabled { opacity: 0.5; cursor: wait; }
.meeting-email-button {
width: 100%;
margin-top: 9px;
border: 1px solid #d6b66f;
background: #fff8e8;
color: #7a5428;
}
.meeting-email-button:hover { background: #f7e8bf; }
.meeting-email-workbench {
display: grid;
grid-template-columns: 330px minmax(0, 1fr);
gap: 24px;
align-items: start;
}
.meeting-registration-layout {
display: grid;
grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
}
@media (max-width: 860px) {
.meeting-registration-layout {
grid-template-columns: 1fr;
}
}
@media (max-width: 1024px) {
.email-workbench,
.meeting-email-workbench { grid-template-columns: 1fr; }
.email-preview-shell iframe { height: 620px; }
}
/* ---- Fiche adhérent : horaires et contact ---- */
.profile-hero-action {
padding: 11px 18px;
border: 1px solid #d8cdb4;
border-radius: 11px;
background: #fff;
color: #3c3322;
font-size: 14px;
font-weight: 700;
text-decoration: none;
transition: border-color 160ms ease, color 160ms ease, transform 160ms ease;
}
.profile-hero-action:hover {
border-color: #2c6fb3;
color: #2c6fb3;
transform: translateY(-1px);
}
.profile-hero-action--primary {
border-color: #2c6fb3;
background: #2c6fb3;
color: #fff;
}
.profile-hero-action--primary:hover {
background: #235d97;
color: #fff;
}
.practical-section {
overflow: hidden;
padding: 26px 28px 28px;
border: 1px solid var(--border);
border-radius: 18px;
background: #fff;
}
.practical-section__heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 18px;
margin-bottom: 20px;
}
/* Pastille de section, identique aux badges « Bons plans » du reste du site. */
.eyebrow {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 5px 12px;
border-radius: 999px;
background: #fdeccd;
color: var(--brown);
font-size: 11.5px;
font-weight: 800;
letter-spacing: 0.1em;
text-transform: uppercase;
}
.eyebrow::before {
content: "";
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--gold);
}
.open-status {
display: flex;
align-items: center;
gap: 9px;
min-width: 154px;
padding: 8px 13px;
border: 1px solid #f2d5cf;
border-radius: 999px;
background: #fbe9e6;
color: var(--red);
}
.open-status > span {
width: 8px;
height: 8px;
flex: 0 0 auto;
border-radius: 50%;
background: var(--red);
}
.open-status div {
display: flex;
min-width: 0;
flex-direction: column;
}
.open-status strong {
font-size: 12.5px;
font-weight: 800;
line-height: 1.25;
}
.open-status small {
margin-top: 2px;
color: #b1786c;
font-size: 10.5px;
}
.open-status.is-open {
border-color: #c7e6d5;
background: #e6f4ec;
color: var(--green);
}
.open-status.is-open > span {
background: var(--green);
}
.open-status.is-open small {
color: #6d9d86;
}
.practical-grid {
display: grid;
grid-template-columns: minmax(0, 1.08fr) minmax(0, 0.92fr);
gap: 14px;
}
.schedule-card,
.contact-card {
min-width: 0;
padding: 18px;
border: 1px solid var(--border-2);
border-radius: 16px;
background: var(--field-bg);
}
.practical-card-title {
display: flex;
align-items: center;
gap: 11px;
padding-bottom: 14px;
border-bottom: 1px solid var(--border-2);
}
.practical-card-title__icon {
display: grid;
width: 35px;
height: 35px;
flex: 0 0 auto;
place-items: center;
border-radius: 11px;
background: #f6efdc;
color: var(--brown);
}
.practical-card-title__icon svg {
width: 18px;
height: 18px;
}
.practical-card-title__icon--blue {
background: #eaf0f6;
color: var(--blue);
}
.practical-card-title span:not(.practical-card-title__icon) {
display: block;
margin-bottom: 2px;
color: var(--muted-3);
font-size: 9.5px;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.practical-card-title h3 {
margin: 0;
color: var(--ink-strong);
font-size: 15.5px;
font-weight: 700;
line-height: 1.25;
}
.schedule-list {
display: flex;
flex-direction: column;
margin-top: 8px;
}
.schedule-row {
display: grid;
grid-template-columns: minmax(90px, 0.75fr) minmax(120px, 1.25fr);
align-items: center;
gap: 12px;
min-height: 38px;
padding: 7px 9px;
border: 1px solid transparent;
border-radius: 10px;
color: var(--muted);
font-size: 12.5px;
}
.schedule-row.is-today {
border-color: var(--border);
background: #fff;
}
.schedule-row__day {
display: flex;
min-width: 0;
flex-direction: column;
font-weight: 600;
}
.schedule-row__day small {
margin-top: 1px;
color: var(--brown);
font-size: 9px;
font-weight: 800;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.schedule-row > strong {
color: var(--ink-soft);
font-size: 12px;
font-weight: 700;
text-align: right;
}
.schedule-row > strong.is-closed {
color: var(--muted-4);
font-weight: 600;
}
.contact-actions {
display: flex;
flex-direction: column;
gap: 8px;
margin-top: 10px;
}
.contact-action {
display: grid;
grid-template-columns: 34px minmax(0, 1fr) auto;
align-items: center;
gap: 10px;
min-width: 0;
padding: 10px;
border: 1px solid transparent;
border-radius: 11px;
color: var(--ink);
text-decoration: none;
transition: background 160ms ease, border-color 160ms ease, transform 160ms ease;
}
.contact-action:hover {
border-color: var(--border);
background: #fff;
transform: translateX(2px);
}
.contact-action__icon {
display: grid;
width: 34px;
height: 34px;
place-items: center;
border-radius: 10px;
background: #eaf0f6;
color: var(--blue);
}
.contact-action__icon svg {
width: 17px;
height: 17px;
}
.contact-action__copy {
display: flex;
min-width: 0;
flex-direction: column;
}
.contact-action__copy strong {
color: var(--ink-strong);
font-size: 12.5px;
font-weight: 700;
}
.contact-action__copy > span {
overflow: hidden;
margin-top: 2px;
color: var(--muted-2);
font-size: 10.5px;
text-overflow: ellipsis;
white-space: nowrap;
}
.contact-action__arrow {
color: var(--muted-4);
font-size: 14px;
}
.practical-empty {
padding: 20px 4px 8px;
color: var(--muted-4);
font-size: 13px;
}
/* ---- Éditeur hebdomadaire des horaires ---- */
.hours-editor {
min-width: 0;
margin: 0;
padding: 0;
border: 0;
}
.hours-editor__hint {
margin: 5px 0 12px;
color: #93866f;
font-size: 12px;
}
.hours-editor__days {
overflow: hidden;
border: 1px solid #e2d7c1;
border-radius: 13px;
background: #faf7ef;
}
.hours-editor__day {
display: grid;
grid-template-columns: 150px minmax(0, 1fr);
min-height: 58px;
padding: 11px 13px;
border-bottom: 1px solid #ebe2d0;
}
.hours-editor__day:last-child { border-bottom: 0; }
.hours-editor__day.is-open { background: #fff; }
.hours-editor__day-head {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: center;
gap: 5px;
}
.hours-editor__day-head > strong {
color: #3a3125;
font-size: 13px;
}
.hours-editor__toggle {
display: inline-flex;
align-items: center;
gap: 6px;
color: #9b5c51;
font-size: 11px;
font-weight: 700;
cursor: pointer;
}
.hours-editor__toggle:has(input:checked) { color: #1f7a53; }
.hours-editor__toggle input {
width: 15px;
height: 15px;
accent-color: #1f8a5b;
}
.hours-editor__slots {
display: flex;
min-width: 0;
flex-direction: column;
justify-content: center;
gap: 7px;
}
.hours-editor__slot {
display: grid;
grid-template-columns: minmax(112px, 1fr) minmax(112px, 1fr) 28px;
align-items: end;
gap: 7px;
}
.hours-editor__slot label {
display: grid;
grid-template-columns: 22px minmax(0, 1fr);
align-items: center;
gap: 5px;
color: #93866f;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
}
.hours-editor__slot input {
width: 100%;
min-width: 0;
padding: 8px 7px;
border: 1px solid #ddd2bb;
border-radius: 8px;
background: #faf7ef;
color: #3c3322;
font: inherit;
}
.hours-editor__slot input:focus {
outline: 2px solid rgba(44, 111, 179, 0.3);
outline-offset: 1px;
}
.hours-editor__remove {
width: 28px;
height: 34px;
border: 0;
background: transparent;
color: #b06a5e;
font-size: 20px;
cursor: pointer;
}
.hours-editor__add {
align-self: flex-start;
padding: 2px 0;
border: 0;
background: transparent;
color: #2c6fb3;
font: inherit;
font-size: 11px;
font-weight: 700;
cursor: pointer;
}
@media (max-width: 720px) {
.practical-section { padding: 21px 16px; }
.practical-section__heading {
align-items: flex-start;
flex-direction: column;
}
.practical-grid { grid-template-columns: 1fr; }
.schedule-card,
.contact-card { padding: 15px; }
.profile-hero-action {
flex: 1 1 130px;
text-align: center;
}
.hours-editor__day {
grid-template-columns: 1fr;
gap: 10px;
}
.hours-editor__day-head {
flex-direction: row;
align-items: center;
justify-content: space-between;
}
}
@media (max-width: 460px) {
.schedule-row {
grid-template-columns: minmax(82px, 0.7fr) minmax(0, 1.3fr);
}
.schedule-row > strong {
line-height: 1.4;
}
.hours-editor__slot {
grid-template-columns: 1fr 1fr 28px;
}
.hours-editor__slot label {
grid-template-columns: 1fr;
}
}