From 83e1ce00a97cbf0d51ede4c9e26f74902dd86218 Mon Sep 17 00:00:00 2001 From: mrKamoo Date: Fri, 2 Oct 2026 13:06:14 +0200 Subject: [PATCH] Refonte design V1 --- README.md | 10 + backend/public/css/app.css | 416 ++++++++++++++++++ backend/public/fonts/OFL.txt | 93 ++++ backend/public/fonts/atkinson-mono.woff2 | Bin 0 -> 17752 bytes backend/public/fonts/atkinson-next.woff2 | Bin 0 -> 33996 bytes backend/public/js/app.js | 111 +++++ .../views/admin/agents/index.blade.php | 88 ++-- .../views/admin/agents/show.blade.php | 54 ++- .../views/admin/assignments/index.blade.php | 127 +++--- .../views/admin/campaigns/form.blade.php | 77 ++-- .../views/admin/campaigns/index.blade.php | 171 +++---- .../resources/views/admin/dashboard.blade.php | 126 ++++-- .../views/admin/fields/index.blade.php | 76 ++-- .../views/admin/images/index.blade.php | 127 +++--- .../views/admin/templates/edit.blade.php | 81 ++-- .../views/admin/templates/index.blade.php | 83 ++-- .../resources/views/components/icon.blade.php | 42 ++ backend/resources/views/layouts/app.blade.php | 192 ++++---- .../views/partials/signature-frame.blade.php | 2 +- backend/resources/views/portal/home.blade.php | 58 +-- 20 files changed, 1403 insertions(+), 531 deletions(-) create mode 100644 backend/public/css/app.css create mode 100644 backend/public/fonts/OFL.txt create mode 100644 backend/public/fonts/atkinson-mono.woff2 create mode 100644 backend/public/fonts/atkinson-next.woff2 create mode 100644 backend/public/js/app.js create mode 100644 backend/resources/views/components/icon.blade.php diff --git a/README.md b/README.md index 5a341ba..55cef7f 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,16 @@ obligatoire, lien facultatif, période en heure de Paris, priorité, groupes AD - Aucun cache à purger : l'add-in interroge l'API à chaque nouveau message, la bannière apparaît et disparaît donc à l'heure. Les messages déjà envoyés la conservent tant que l'image reste dans la bibliothèque. +## Interface du back-office + +Aucune dépendance externe ni étape de compilation : tout est servi depuis `backend/public`. + +- `css/app.css` : feuille unique. Les couleurs, rayons et polices sont des variables en tête de fichier (`:root`). +- `js/app.js` : notifications, boîte de confirmation (`data-confirm` sur un formulaire), zone de dépôt (`data-dropzone`), + copie (`data-copy`), bouton occupé (`data-busy`). Sans JavaScript, les formulaires restent utilisables. +- `fonts/` : Atkinson Hyperlegible Next et Mono (licence OFL, fichier joint), hébergées localement. +- `resources/views/components/icon.blade.php` : icônes Lucide (licence ISC) intégrées, ``. + ## Syntaxe des templates | Syntaxe | Effet | diff --git a/backend/public/css/app.css b/backend/public/css/app.css new file mode 100644 index 0000000..7d3a89b --- /dev/null +++ b/backend/public/css/app.css @@ -0,0 +1,416 @@ +/* + * Back-office et portail « Signatures ». + * Feuille unique, sans préprocesseur ni CDN : modifiez les variables ci-dessous pour adapter les couleurs. + */ + +@font-face { + font-family: "Atkinson Hyperlegible Next"; + src: url("../fonts/atkinson-next.woff2") format("woff2"); + font-weight: 200 800; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Atkinson Hyperlegible Mono"; + src: url("../fonts/atkinson-mono.woff2") format("woff2"); + font-weight: 200 800; + font-style: normal; + font-display: swap; +} + +:root { + /* Texte et surfaces */ + --ink: #17242e; + --muted: #586a77; + --line: #dce3e8; + --line-strong: #bfcbd4; + --bg: #f2f5f7; + --surface: #ffffff; + --surface-2: #f7f9fa; + + /* Bleu nuit de la barre latérale, bleu canal des actions, jaune soleil en repère */ + --night: #0f3554; + --night-2: #1a4871; + --night-ink: #c9dbe9; + --accent: #16649a; + --accent-strong: #0f4f7d; + --accent-soft: #e4f0f8; + --sun: #f2b544; + + /* États */ + --ok: #1c7440; + --ok-soft: #e2f3e8; + --warn: #8a5300; + --warn-soft: #fff1d2; + --danger: #b3261e; + --danger-soft: #fdeceb; + + --r-s: 6px; + --r-m: 10px; + --r-l: 14px; + --sidebar: 248px; + --focus: 0 0 0 3px rgba(22, 100, 154, .28); + + --font: "Atkinson Hyperlegible Next", "Segoe UI", system-ui, sans-serif; + --mono: "Atkinson Hyperlegible Mono", Consolas, "Cascadia Mono", monospace; +} + +*, *::before, *::after { box-sizing: border-box; } + +html { -webkit-text-size-adjust: 100%; } + +body { + margin: 0; + font-family: var(--font); + font-size: 15px; + line-height: 1.45; + color: var(--ink); + background: var(--bg); +} + +h1 { font-size: 26px; line-height: 1.15; font-weight: 700; letter-spacing: -.01em; margin: 0; } +h2 { font-size: 16px; line-height: 1.3; font-weight: 700; margin: 0 0 12px; } +p { margin: 0 0 12px; } +a { color: var(--accent); text-underline-offset: 2px; } +a:hover { color: var(--accent-strong); } +code { font-family: var(--mono); font-size: .9em; background: var(--surface-2); border: 1px solid var(--line); border-radius: 4px; padding: 0 4px; } +strong { font-weight: 700; } + +:focus-visible { outline: none; box-shadow: var(--focus); border-radius: var(--r-s); } + +.icon { flex: none; vertical-align: -3px; } +.muted { color: var(--muted); font-size: 13px; } +.spacer { flex: 1; } +.row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; } +.nowrap { white-space: nowrap; } +.right { text-align: right; } +[hidden] { display: none !important; } + +.skip { position: absolute; left: -9999px; } +.skip:focus { left: 12px; top: 12px; z-index: 50; background: var(--surface); padding: 8px 12px; border-radius: var(--r-s); } + +/* ---------------------------------------------------------------- Structure */ + +.app { min-height: 100vh; } +.app--nav { display: grid; grid-template-columns: var(--sidebar) minmax(0, 1fr); } + +.sidebar { + position: sticky; top: 0; height: 100vh; overflow-y: auto; + display: flex; flex-direction: column; + background: var(--night); color: var(--night-ink); + padding: 20px 14px 14px; +} + +.brand { display: block; color: #fff; text-decoration: none; padding: 0 8px 18px; } +.brand:hover { color: #fff; } +.brand-name { display: block; font-size: 21px; font-weight: 700; letter-spacing: -.01em; line-height: 1.1; } +.brand-stroke { display: block; width: 104px; height: 12px; margin: 3px 0 6px -2px; color: var(--sun); } +.brand-org { display: block; font-size: 12.5px; color: var(--night-ink); } + +.nav { display: flex; flex-direction: column; gap: 2px; } +.nav-group { font-size: 12px; color: #9db6ca; margin: 16px 0 4px; padding: 0 10px; } +.nav-link { + position: relative; + display: flex; align-items: center; gap: 10px; + padding: 8px 10px; border-radius: var(--r-s); + color: var(--night-ink); text-decoration: none; font-weight: 500; +} +.nav-link:hover { background: var(--night-2); color: #fff; } +.nav-link.active { background: var(--night-2); color: #fff; font-weight: 700; } +.nav-link.active::before { content: ""; position: absolute; left: -14px; top: 7px; bottom: 7px; width: 4px; border-radius: 0 4px 4px 0; background: var(--sun); } +.nav-link:focus-visible { box-shadow: 0 0 0 3px rgba(242, 181, 68, .55); } + +.sidebar-foot { margin-top: auto; padding-top: 16px; display: flex; flex-direction: column; gap: 10px; } +.user { display: flex; align-items: center; gap: 10px; padding: 10px 8px 2px; border-top: 1px solid rgba(255, 255, 255, .14); } +.user-name { display: block; color: #fff; font-weight: 600; font-size: 14px; line-height: 1.2; overflow-wrap: anywhere; } +.user-role { display: block; font-size: 12.5px; color: #9db6ca; } +.user form { margin-left: auto; } +.icon-btn { + display: inline-flex; align-items: center; justify-content: center; + width: 34px; height: 34px; border-radius: var(--r-s); + background: transparent; border: 0; color: inherit; cursor: pointer; +} +.icon-btn:hover { background: rgba(127, 148, 165, .22); } +.sidebar .icon-btn { color: var(--night-ink); } +.sidebar .icon-btn:hover { background: var(--night-2); color: #fff; } + +.avatar { + flex: none; display: inline-flex; align-items: center; justify-content: center; + width: 34px; height: 34px; border-radius: 50%; + background: var(--accent-soft); color: var(--accent-strong); + font-size: 12.5px; font-weight: 700; +} +.sidebar .avatar { background: var(--night-2); color: #fff; } + +.content { min-width: 0; } +main { max-width: 1180px; margin: 0 auto; padding: 28px 28px 56px; } + +/* Portail agent : pas de barre latérale, simple bandeau */ +.topbar { + display: flex; align-items: center; gap: 12px; + background: var(--night); color: var(--night-ink); padding: 10px 20px; +} +.topbar .brand { padding: 0; } +.topbar .brand-stroke { display: none; } +.topbar .brand-name { font-size: 18px; } +.topbar .user { border: 0; padding: 0; margin-left: auto; } +.topbar .icon-btn { color: var(--night-ink); } +.topbar .icon-btn:hover { background: var(--night-2); color: #fff; } +.topbar .avatar { background: var(--night-2); color: #fff; } + +@media (max-width: 900px) { + .app--nav { display: block; } + .sidebar { position: static; height: auto; padding: 12px 12px 8px; } + .brand { padding: 0 6px 8px; } + .brand-stroke, .brand-org, .nav-group { display: none; } + .nav { flex-direction: row; overflow-x: auto; gap: 4px; padding-bottom: 6px; scrollbar-width: thin; } + .nav-link { white-space: nowrap; } + .nav-link.active::before { left: 10px; right: 10px; top: auto; bottom: 2px; width: auto; height: 3px; border-radius: 3px; } + .sidebar-foot { flex-direction: row; align-items: center; padding-top: 6px; } + .sidebar-foot .user { border: 0; padding: 0; margin-left: auto; } + .user-role { display: none; } + main { padding: 18px 14px 40px; } + h1 { font-size: 22px; } +} + +/* ---------------------------------------------------------------- En-tête de page */ + +.page-head { display: flex; align-items: flex-start; gap: 16px; flex-wrap: wrap; margin-bottom: 20px; } +.page-head > div:first-child { flex: 1; min-width: 240px; } +.page-head .lead { color: var(--muted); max-width: 78ch; margin: 8px 0 0; } +.page-title { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } +.page-actions { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; } +.back { display: inline-flex; align-items: center; gap: 4px; font-size: 13.5px; text-decoration: none; margin-bottom: 6px; color: var(--muted); } +.back:hover { color: var(--accent-strong); } + +/* ---------------------------------------------------------------- Cartes */ + +.card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-m); padding: 20px; margin-bottom: 16px; } +.card-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; } +.card-head h2 { margin: 0; } +.card--flush { padding: 0; overflow: hidden; } +.card--flush > .card-head { padding: 16px 20px 0; } +.card-foot { padding: 12px 20px; border-top: 1px solid var(--line); background: var(--surface-2); } +.card--flush > .card-foot:last-child { border-radius: 0 0 var(--r-m) var(--r-m); } + +.split { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px; align-items: start; } +@media (max-width: 1000px) { .split { grid-template-columns: 1fr; } } + +/* Indicateurs du tableau de bord */ +.tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 12px; margin-bottom: 16px; } +.tile { + display: flex; align-items: center; gap: 12px; + background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-m); + padding: 14px 16px; color: inherit; text-decoration: none; +} +a.tile:hover { border-color: var(--accent); color: inherit; } +.tile-icon { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: var(--r-s); background: var(--accent-soft); color: var(--accent-strong); } +.tile-value { display: block; font-size: 24px; font-weight: 700; line-height: 1.1; font-variant-numeric: tabular-nums; } +.tile-label { display: block; color: var(--muted); font-size: 13px; } + +/* ---------------------------------------------------------------- Tableaux */ + +.table-wrap { overflow-x: auto; } +table.list { width: 100%; border-collapse: collapse; } +table.list th, table.list td { text-align: left; padding: 11px 12px; border-bottom: 1px solid var(--line); vertical-align: middle; } +table.list th { font-size: 12.5px; font-weight: 600; color: var(--muted); background: var(--surface-2); white-space: nowrap; } +table.list th:first-child, table.list td:first-child { padding-left: 20px; } +table.list th:last-child, table.list td:last-child { padding-right: 20px; } +table.list tbody tr:last-child td { border-bottom: 0; } +table.list tbody tr:hover td { background: #fafcfd; } +table.list .num { font-variant-numeric: tabular-nums; } +.cell-title { font-weight: 600; text-decoration: none; } +.cell-title:hover { text-decoration: underline; } +.cell-actions { text-align: right; white-space: nowrap; } +.cell-actions > * { margin: 2px 0 2px 4px; } +.btn.icon-only { padding: 6px 8px; } +.person { display: flex; align-items: center; gap: 10px; } + +/* Fiche descriptive (libellé / valeur) */ +dl.facts { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 0; margin: 0; } +dl.facts dt, dl.facts dd { padding: 9px 0; border-bottom: 1px solid var(--line); margin: 0; } +dl.facts dt { color: var(--muted); font-size: 13px; padding-right: 20px; } +dl.facts dt:last-of-type, dl.facts dd:last-of-type { border-bottom: 0; } + +.empty { text-align: center; padding: 36px 20px; color: var(--muted); } +.empty .icon { color: var(--line-strong); margin-bottom: 8px; } +.empty p { margin: 0 auto 12px; max-width: 46ch; } +.empty p:last-child { margin-bottom: 0; } +.empty strong { display: block; color: var(--ink); font-size: 16px; margin-bottom: 4px; } + +/* ---------------------------------------------------------------- Formulaires */ + +label { display: block; font-weight: 600; font-size: 13.5px; margin: 14px 0 5px; } +.card > label:first-child, .card > h2 + label { margin-top: 0; } +.hint { color: var(--muted); font-size: 13px; margin: 5px 0 0; } + +input[type=text], input[type=number], input[type=search], input[type=url], input[type=datetime-local], select, textarea { + width: 100%; padding: 8px 10px; + border: 1px solid var(--line-strong); border-radius: var(--r-s); + font: inherit; color: var(--ink); background: var(--surface); +} +input:hover, select:hover, textarea:hover { border-color: #93a5b2; } +input:focus-visible, select:focus-visible, textarea:focus-visible { border-color: var(--accent); box-shadow: var(--focus); } +input::placeholder { color: #8797a3; } +input.small { width: 96px; } +select { padding-right: 28px; } +textarea.code { font-family: var(--mono); font-size: 13px; line-height: 1.5; min-height: 280px; resize: vertical; tab-size: 2; background: var(--surface-2); } + +fieldset { border: 1px solid var(--line); border-radius: var(--r-s); margin: 14px 0 0; padding: 8px 14px 12px; min-width: 0; } +fieldset.bare { border: 0; margin: 0; padding: 0; } +legend { font-weight: 600; font-size: 13.5px; padding: 0 6px; } +.scroll { max-height: 230px; overflow: auto; } + +.field-row { display: flex; gap: 12px; flex-wrap: wrap; } +.field-row > * { flex: 1; min-width: 190px; } + +/* Champ de recherche avec icône */ +.search { position: relative; flex: 1; max-width: 380px; } +.search .icon { position: absolute; left: 10px; top: 50%; transform: translateY(-50%); color: var(--muted); } +.search input { padding-left: 34px; } + +/* Cases et boutons radio */ +label.check { display: flex; align-items: flex-start; gap: 8px; font-weight: 400; font-size: 14.5px; margin: 6px 0; cursor: pointer; } +label.check input { flex: none; width: 17px; height: 17px; margin: 2px 0 0; accent-color: var(--accent); } + +/* Interrupteur : une case à cocher habillée */ +.switch { display: inline-flex; align-items: center; gap: 10px; font-weight: 400; font-size: 14.5px; margin: 0; cursor: pointer; } +.switch input { position: absolute; opacity: 0; width: 1px; height: 1px; } +.switch-track { flex: none; position: relative; width: 38px; height: 22px; border-radius: 11px; background: var(--line-strong); transition: background .15s; } +.switch-track::after { content: ""; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: #fff; transition: transform .15s; } +.switch input:checked + .switch-track { background: var(--accent); } +.switch input:checked + .switch-track::after { transform: translateX(16px); } +.switch input:focus-visible + .switch-track { box-shadow: var(--focus); } +.switch input:disabled + .switch-track { opacity: .5; } + +/* Même interrupteur sous forme de bouton : il envoie son formulaire au clic (activation d'une campagne) */ +button.switch-btn { position: relative; width: 38px; height: 22px; padding: 0; border: 0; border-radius: 11px; background: var(--line-strong); cursor: pointer; vertical-align: middle; transition: background .15s; } +button.switch-btn::after { content: ""; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: #fff; transition: transform .15s; } +button.switch-btn[aria-checked=true] { background: var(--accent); } +button.switch-btn[aria-checked=true]::after { transform: translateX(16px); } + +/* Choix exclusifs présentés en liste de cartes (portail) */ +.option { display: flex; align-items: flex-start; gap: 10px; padding: 9px 12px; margin: 0; border: 1px solid var(--line); border-radius: var(--r-s); font-weight: 400; font-size: 14.5px; cursor: pointer; } +.option + .option { margin-top: 6px; } +fieldset > .option:first-of-type { margin-top: 4px; } +.option input[type=radio] { flex: none; width: 17px; height: 17px; margin: 2px 0 0; accent-color: var(--accent); } +.option > span { min-width: 0; } +.option:has(input:checked) { border-color: var(--accent); background: var(--accent-soft); } + +/* Zone de dépôt de fichier */ +.dropzone { + display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; + min-height: 112px; padding: 16px; margin: 0; + border: 1.5px dashed var(--line-strong); border-radius: var(--r-m); + background: var(--surface-2); color: var(--muted); + font-weight: 400; font-size: 14px; text-align: center; cursor: pointer; +} +.dropzone:hover, .dropzone.is-over { border-color: var(--accent); background: var(--accent-soft); color: var(--accent-strong); } +.dropzone:focus-within { border-color: var(--accent); box-shadow: var(--focus); } +.dropzone input[type=file] { position: absolute; opacity: 0; width: 1px; height: 1px; } +.dropzone-name { color: var(--ink); font-weight: 600; overflow-wrap: anywhere; } +.dropzone u { color: var(--accent); } +html:not(.js) .dropzone input[type=file] { position: static; opacity: 1; width: auto; height: auto; } + +/* ---------------------------------------------------------------- Boutons */ + +.btn { + display: inline-flex; align-items: center; justify-content: center; gap: 7px; + padding: 8px 14px; border-radius: var(--r-s); + border: 1px solid var(--accent); background: var(--accent); color: #fff; + font: inherit; font-size: 14.5px; font-weight: 600; line-height: 1.2; + text-decoration: none; cursor: pointer; white-space: nowrap; +} +.btn:hover { background: var(--accent-strong); border-color: var(--accent-strong); color: #fff; } +.btn.secondary { background: var(--surface); color: var(--accent-strong); border-color: var(--line-strong); } +.btn.secondary:hover { background: var(--accent-soft); border-color: var(--accent); } +.btn.danger { background: var(--surface); color: var(--danger); border-color: #e3b5b1; } +.btn.danger:hover { background: var(--danger-soft); border-color: var(--danger); } +.btn.danger.solid { background: var(--danger); color: #fff; border-color: var(--danger); } +.btn.danger.solid:hover { background: #8f1d17; } +.btn.small { padding: 5px 10px; font-size: 13.5px; } +.btn:disabled, .btn[aria-disabled=true] { opacity: .5; cursor: default; pointer-events: none; } +.btn .icon { vertical-align: 0; } +.btn.is-busy .icon { animation: spin .8s linear infinite; } +@keyframes spin { to { transform: rotate(360deg); } } + +button.link { background: none; border: 0; color: var(--accent); cursor: pointer; font: inherit; padding: 0; } +form.inline { display: inline; } + +/* ---------------------------------------------------------------- Étiquettes et messages */ + +.badge { display: inline-flex; align-items: center; gap: 6px; padding: 2px 9px; border-radius: 999px; font-size: 12.5px; font-weight: 600; background: var(--accent-soft); color: var(--accent-strong); white-space: nowrap; } +.badge::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; } +.badge.ok { background: var(--ok-soft); color: var(--ok); } +.badge.warn { background: var(--warn-soft); color: var(--warn); } +.badge.off { background: #edf1f4; color: var(--muted); } +.badge.plain::before { display: none; } + +.alert { display: flex; gap: 10px; align-items: flex-start; padding: 11px 14px; border-radius: var(--r-s); margin-bottom: 16px; border: 1px solid; } +.alert .icon { margin-top: 1px; } +.alert > div { min-width: 0; } +.notice { background: var(--warn-soft); color: var(--warn); border-color: #ecd28f; } +.errors { background: var(--danger-soft); color: var(--danger); border-color: #f0c0bb; } +.flash { background: var(--ok-soft); color: var(--ok); border-color: #b7dfc5; } + +/* Notification de confirmation (message de session) */ +.toasts { position: fixed; bottom: 20px; right: 20px; z-index: 40; display: flex; flex-direction: column; gap: 8px; max-width: min(460px, calc(100vw - 32px)); } +.toast { + display: flex; gap: 10px; align-items: flex-start; + background: var(--ink); color: #fff; padding: 12px 12px 12px 14px; + border-radius: var(--r-m); box-shadow: 0 10px 30px rgba(15, 53, 84, .28); + overflow-wrap: anywhere; +} +.toast > .icon { color: #7fd9a0; margin-top: 1px; } +.toast .icon-btn { width: 26px; height: 26px; margin: -3px -3px 0 auto; color: #c9d5de; } +.toast.is-leaving { opacity: 0; transform: translateY(6px); transition: opacity .2s, transform .2s; } +html:not(.js) .toasts { position: static; max-width: none; margin-bottom: 16px; } +html:not(.js) .toast .icon-btn { display: none; } + +/* Boîte de confirmation */ +dialog.dialog { border: 0; border-radius: var(--r-l); padding: 0; width: min(440px, calc(100vw - 32px)); color: var(--ink); box-shadow: 0 24px 60px rgba(15, 53, 84, .35); } +dialog.dialog::backdrop { background: rgba(15, 35, 50, .45); } +.dialog-body { padding: 22px 22px 6px; } +.dialog-body h2 { font-size: 18px; margin-bottom: 8px; } +.dialog-body p { color: var(--muted); margin: 0; } +.dialog-actions { display: flex; justify-content: flex-end; gap: 8px; padding: 18px 22px 20px; } + +/* ---------------------------------------------------------------- Écrans */ + +/* Variables cliquables de l'éditeur de template */ +.chips { display: flex; flex-wrap: wrap; gap: 6px; } +.chips button { background: var(--accent-soft); color: var(--accent-strong); border: 1px solid transparent; border-radius: var(--r-s); padding: 3px 9px; font: 13px var(--mono); cursor: pointer; } +.chips button:hover { border-color: var(--accent); } + +iframe.sig { display: block; width: 100%; min-height: 270px; border: 1px solid var(--line); border-radius: var(--r-s); background: #fff; resize: vertical; } +iframe.sig.short { min-height: 150px; } + +/* Bibliothèque d'images */ +.gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 12px; } +.media { display: flex; flex-direction: column; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-m); overflow: hidden; } +.media-thumb { + display: flex; align-items: center; justify-content: center; height: 130px; padding: 12px; + /* damier : rend visibles les zones transparentes d'un logo */ + background: #fff repeating-conic-gradient(#eef2f5 0% 25%, #fff 0% 50%) 0 0 / 16px 16px; + border-bottom: 1px solid var(--line); +} +.media-thumb img { max-width: 100%; max-height: 100%; } +.media-body { padding: 12px 14px; flex: 1; } +.media-name { font-weight: 600; overflow-wrap: anywhere; } +.media-foot { display: flex; gap: 6px; padding: 10px 14px; border-top: 1px solid var(--line); background: var(--surface-2); } + +.thumb { display: block; max-width: 88px; max-height: 56px; border: 1px solid var(--line); border-radius: 4px; background: #fff; } +.preview-img { display: block; max-width: 100%; max-height: 160px; margin-top: 10px; border: 1px solid var(--line); border-radius: var(--r-s); background: #fff; } + +/* Pagination */ +.pager { display: flex; align-items: center; justify-content: space-between; gap: 12px; } + +/* État de la synchronisation */ +.sync { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; } +.sync-dot { flex: none; width: 10px; height: 10px; border-radius: 50%; background: var(--ok); box-shadow: 0 0 0 4px var(--ok-soft); } +.sync-dot.warn { background: var(--warn); box-shadow: 0 0 0 4px var(--warn-soft); } +.sync p { margin: 0; } + +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { animation: none !important; transition: none !important; } +} diff --git a/backend/public/fonts/OFL.txt b/backend/public/fonts/OFL.txt new file mode 100644 index 0000000..9459440 --- /dev/null +++ b/backend/public/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2020-2024 The Atkinson Hyperlegible Next Project Authors (https://github.com/googlefonts/atkinson-hyperlegible-next) AtkinsonHyperlegibleNext-Italic[wght].ttf: Copyright 2020-2024 The Atkinson Hyperlegible Next Project Authors (https://github.com/googlefonts/atkinson-hyperlegible-next) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/backend/public/fonts/atkinson-mono.woff2 b/backend/public/fonts/atkinson-mono.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f5c108140795b5fd70aa7ac1221a00c3d9815f65 GIT binary patch literal 17752 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 literal 0 HcmV?d00001 diff --git a/backend/public/fonts/atkinson-next.woff2 b/backend/public/fonts/atkinson-next.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a9ca4bd6ffda7092b397871cd3b5ad38a372046d GIT binary patch literal 33996 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 I-2ngq0I { + 'use strict'; + + // --- Navigation en bandeau (petits écrans) : l'entrée active reste visible --------------------- + const current = document.querySelector('.nav .nav-link.active'); + if (current && current.parentElement.scrollWidth > current.parentElement.clientWidth) { + current.parentElement.scrollLeft = current.offsetLeft - 16; + } + + // --- Notifications : fermeture manuelle, et automatique après quelques secondes ---------------- + const dismiss = (toast) => { + toast.classList.add('is-leaving'); + setTimeout(() => toast.remove(), 220); + }; + document.querySelectorAll('[data-toast]').forEach((toast) => { + let timer = setTimeout(() => dismiss(toast), 9000); + toast.addEventListener('mouseenter', () => clearTimeout(timer)); + toast.addEventListener('mouseleave', () => { timer = setTimeout(() => dismiss(toast), 4000); }); + toast.querySelector('[data-dismiss]')?.addEventListener('click', () => { clearTimeout(timer); dismiss(toast); }); + }); + + // --- Confirmation :
+ const dialog = document.getElementById('confirm-dialog'); + if (dialog && typeof dialog.showModal === 'function') { + const message = dialog.querySelector('[data-message]'); + const ok = dialog.querySelector('[data-ok]'); + let pending = null; + + document.addEventListener('submit', (e) => { + const form = e.target; + if (!(form instanceof HTMLFormElement) || !form.dataset.confirm || form.dataset.confirmed) return; + e.preventDefault(); + e.stopImmediatePropagation(); + pending = form; + message.textContent = form.dataset.confirm; + ok.textContent = form.dataset.confirmLabel || 'Confirmer'; + ok.classList.toggle('danger', 'confirmDanger' in form.dataset); + ok.classList.toggle('solid', 'confirmDanger' in form.dataset); + dialog.returnValue = ''; + dialog.showModal(); + }, true); + + dialog.addEventListener('close', () => { + const form = pending; + pending = null; + if (!form || dialog.returnValue !== 'ok') return; + form.dataset.confirmed = '1'; + form.requestSubmit ? form.requestSubmit() : form.submit(); + }); + } + + // --- Bouton occupé : ---------------------------------- + document.addEventListener('submit', (e) => { + const form = e.target; + if (!(form instanceof HTMLFormElement) || !form.dataset.busy || e.defaultPrevented) return; + const button = form.querySelector('button[type=submit], button:not([type])'); + if (!button) return; + button.classList.add('is-busy'); + button.setAttribute('aria-disabled', 'true'); + const label = button.querySelector('[data-label]'); + if (label) label.textContent = form.dataset.busy; + }); + + // --- Copie dans le presse-papiers : - {{ $agents->total() }} agent(s) + + + {{ $agents->total() }} agent{{ $agents->total() > 1 ? 's' : '' }}
-
- - - - @forelse ($agents as $a) - - - - - - - @empty - - @endforelse - -
AgentServiceGroupes signature_*Template appliqué
{{ $a->display_name }}
{{ $a->mail }}
{{ $a->department }}{{ $a->groups->pluck('display_name')->join(', ') ?: '—' }}{{ $resolved[$a->id] ?? '— aucun —' }}
Aucun agent trouvé.
+ +
+
+ + + + @forelse ($agents as $a) + + + + + + + @empty + + @endforelse + +
AgentServiceGroupes signature_*Template appliqué
+
+ +
+ {{ $a->display_name }} +
{{ $a->mail }}
+
+
+
{{ $a->department }}{{ $a->groups->pluck('display_name')->join(', ') ?: '—' }} + @if ($resolved[$a->id] ?? null) + {{ $resolved[$a->id] }} + @else + aucun + @endif +
+
+ +

Aucun agent trouvé{{ $q !== '' ? 'Essayez un autre nom, une adresse ou un service.' : 'Lancez une synchronisation de l\'annuaire depuis le tableau de bord.' }}

+
+
+
@if ($agents->hasPages()) -