fix(extension): timing bannière pick mode + responsive side panel
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m46s
CI / Deploy production (on server) (push) Successful in 23s

Bannière pick mode :
- ensureContentScript() : retry le PING 8x (avec backoff 80→290ms) après
  chrome.scripting.executeScript, parce que l'injection est async côté page
  et le listener n'est pas enregistré immédiatement.
- Avant : SET_PICK_MODE partait dans le vide, la bannière « surlignez le
  texte à clipper » n'apparaissait jamais.

Responsive :
- Media queries : <380px (Chrome Side Panel narrow), 380-420px (default),
  >420px (Firefox sidebar), <320px (very small).
- Padding/margin/font-size adaptatifs selon la largeur du panneau.
- .selection-body : min-height 80px, plus de max-height fixe, scroll si
  trop long. overflow-wrap: anywhere pour le texte long.
- .btn : padding 16px / min-height 48px pour le tactile.
- .page-card : word-break + overflow-wrap pour les URLs et titres longs.
- Firefox : media query dédié >480px pour aérer la sidebar Firefox
  (plus large que Chrome Side Panel).

Rebuilt :
- memento-web-clipper-chrome-store.zip
- memento-web-clipper-firefox.xpi
This commit is contained in:
Antigravity
2026-07-18 09:48:45 +00:00
parent 9d10815415
commit d5c44aafb6
8 changed files with 288 additions and 87 deletions

View File

@@ -160,18 +160,32 @@ async function getActiveTab() {
}
async function ensureContentScript(tabId) {
// PING initial : si le script est déjà injecté, on retourne immédiatement.
try {
const resp = await chrome.tabs.sendMessage(tabId, { type: 'PING' })
if (resp?.ok) return true
} catch {
/* inject */
/* pas injecté */
}
// Sinon, injection manuelle via chrome.scripting.executeScript.
try {
await chrome.scripting.executeScript({ target: { tabId }, files: ['content.js'] })
return true
} catch {
return false
}
// L'injection est async côté page : le script doit finir de s'initialiser
// (IIFE, listeners, flag globalThis) avant qu'on puisse lui parler.
// On PING avec retry pour attendre qu'il soit prêt.
for (let i = 0; i < 8; i++) {
await new Promise(r => setTimeout(r, 80 + i * 30))
try {
const resp = await chrome.tabs.sendMessage(tabId, { type: 'PING' })
if (resp?.ok) return true
} catch {
/* pas encore prêt */
}
}
return false
}
async function setPickModeOnTab(enabled) {
@@ -181,7 +195,7 @@ async function setPickModeOnTab(enabled) {
try {
await chrome.tabs.sendMessage(activeTabId, { type: 'SET_PICK_MODE', enabled })
} catch {
/* ignore */
/* ignore — retry au prochain syncPickMode */
}
}