Compare commits

..

2 Commits

Author SHA1 Message Date
ff013a746f Actualiser .env
All checks were successful
CI / build-and-anchors (push) Successful in 1m42s
SMOKE / smoke (push) Successful in 19s
2026-01-31 17:39:22 +01:00
46eca41879 Actualiser .env
Some checks failed
CI / build-and-anchors (push) Has started running
SMOKE / smoke (push) Has been cancelled
2026-01-31 17:38:51 +01:00
13 changed files with 29 additions and 35 deletions

4
.gitignore vendored
View File

@@ -4,7 +4,3 @@ dist/
/_release_out/
.DS_Store
._*
# local backups
Dockerfile.bak.*
public/favicon_io.zip

View File

@@ -10,7 +10,7 @@ ENV npm_config_update_notifier=false \
npm_config_progress=false
# (Optionnel mais propre) git + certificats
RUN apt-get -o Acquire::Retries=5 -o Acquire::ForceIPv4=true update \
RUN --network=host apt-get -o Acquire::Retries=5 -o Acquire::ForceIPv4=true update \
&& apt-get install -y --no-install-recommends ca-certificates git \
&& rm -rf /var/lib/apt/lists/*
@@ -36,6 +36,4 @@ RUN npm run build
FROM nginx:1.27-alpine AS runtime
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/dist/ /usr/share/nginx/html/
RUN find /usr/share/nginx/html -type d -exec chmod 755 {} \; \
&& find /usr/share/nginx/html -type f -exec chmod 644 {} \;
EXPOSE 80

View File

@@ -9,18 +9,6 @@ server {
add_header X-Frame-Options SAMEORIGIN always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
location = /favicon.ico {
try_files /favicon.ico =404;
access_log off;
log_not_found off;
}
location = /favicon.svg {
try_files /favicon.svg =404;
access_log off;
log_not_found off;
}
# Assets statiques (cache long)
location ~* \.(?:css|js|mjs|json|png|jpg|jpeg|gif|svg|webp|ico|woff2?|ttf|eot|wasm)$ {
try_files $uri =404;

View File

@@ -1,6 +0,0 @@
This favicon was generated using the following font:
- Font Title: Leckerli One
- Font Author: undefined
- Font Source: https://fonts.gstatic.com/s/leckerlione/v21/V8mCoQH8VCsNttEnxnGQ-1itLZxcBtItFw.ttf
- Font License: undefined)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 558 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -1 +0,0 @@
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}

View File

@@ -160,8 +160,15 @@
}
};
// ✅ Ouvre EN NOUVEL ONGLET : stratégie unique (anchor click) => jamais 2 onglets
// ✅ Ouvre EN NOUVEL ONGLET sans jamais remplacer longlet courant
const openInNewTab = (url) => {
// 1) tente window.open
try {
const w = window.open(url, "_blank", "noopener,noreferrer");
if (w) return true;
} catch {}
// 2) fallback "anchor click" (souvent mieux toléré)
try {
const a = document.createElement("a");
a.href = url;
@@ -174,7 +181,7 @@
return true;
} catch {}
// dernier recours
// 3) dernier recours: on ne quitte PAS la page
window.prompt("Popup bloquée. Copiez ce lien pour ouvrir le ticket :", url);
return false;
};
@@ -193,7 +200,7 @@
if (!a) return;
e.preventDefault();
e.stopImmediatePropagation();
e.stopPropagation();
const rawUrl = a.dataset.url || a.getAttribute("href") || "";
if (!rawUrl || rawUrl === "#") return;
@@ -203,8 +210,10 @@
try {
const u = new URL(rawUrl);
// Option B.1 : copie presse-papier du texte complet (si dispo)
if (full) {
try { await navigator.clipboard.writeText(full); } catch {}
// Option B.2 : upgrade du body (si l'URL reste raisonnable)
tryUpgradeBodyWithFull(u, full);
}
@@ -212,7 +221,7 @@
} catch {
openInNewTab(rawUrl);
}
}, { capture: true });
});
// Step 1: type
dlg.addEventListener("click", (e) => {

View File

@@ -497,17 +497,27 @@ const GITEA_REPO = import.meta.env.PUBLIC_GITEA_REPO ?? "";
const excerpt = raw.length > 420 ? (raw.slice(0, 420) + "…") : raw;
const issueUrl = buildIssueURL(p.id, raw, excerpt);
// Lien fallback (si JS casse totalement)
propose.href = issueUrl;
// ✅ Marqueurs pour ProposeModal (interception 2 étapes)
// 🔥 indispensables pour réactiver ProposeModal (les 2 filtres)
propose.dataset.propose = "1";
propose.dataset.url = issueUrl;
// optionnel mais top : permet à ProposeModal de copier le texte complet
propose.dataset.full = raw;
// ❌ PAS de target=_blank ici
// ❌ PAS de rel noopener ici
// ✅ CRUCIAL : permet à ProposeModal dintercepter le clic (2 étapes)
propose.setAttribute("data-propose", "1");
propose.setAttribute("data-url", issueUrl);
// ✅ Bonus : ProposeModal peut copier/upgrade avec le texte complet si dispo
// (tu peux commenter si tu veux éviter de stocker le texte en attribut)
propose.setAttribute("data-full", raw);
// ✅ Fallback si JS casse : on ouvre quand même le lien (idéalement en nouvel onglet)
propose.href = issueUrl;
propose.target = "_blank";
propose.rel = "noopener noreferrer";
row.appendChild(propose);
}