diff --git a/extension.test.ts b/extension.test.ts new file mode 100644 index 0000000..9dd970d --- /dev/null +++ b/extension.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, test } from "bun:test"; +import { existsSync } from "node:fs"; +import { join } from "node:path"; + +const extensionDir = join(import.meta.dir, "extension"); +const manifest = await Bun.file(join(extensionDir, "manifest.json")).json(); + +describe("manifest.json", () => { + test("est en Manifest V3", () => { + expect(manifest.manifest_version).toBe(3); + }); + + test("déclare background.js comme script d'arrière-plan", () => { + expect(manifest.background.scripts).toContain("background.js"); + }); + + test("demande les host_permissions des deux sources", () => { + expect(manifest.host_permissions).toEqual([ + "https://atelier-huit.frama.space/*", + "https://www.ville-cugnaux.fr/*", + ]); + }); + + test("ne définit PAS default_popup (sinon onClicked devient muet)", () => { + expect(manifest.action.default_popup).toBeUndefined(); + }); + + test("porte un identifiant gecko", () => { + expect(manifest.browser_specific_settings.gecko.id).toBeDefined(); + }); +}); + +describe("ressources référencées", () => { + test("background.js existe", () => { + expect(existsSync(join(extensionDir, "background.js"))).toBe(true); + }); + + test("liste.html existe", () => { + expect(existsSync(join(extensionDir, "liste.html"))).toBe(true); + }); + + test("l'icône référencée existe", () => { + expect(existsSync(join(extensionDir, manifest.action.default_icon))).toBe(true); + }); +}); diff --git a/extension/background.js b/extension/background.js new file mode 100644 index 0000000..2431475 --- /dev/null +++ b/extension/background.js @@ -0,0 +1,5 @@ +// Listener enregistré au niveau racine (synchrone) : l'event page peut être +// déchargée, le clic toolbar doit toujours la réveiller et être capté. +browser.action.onClicked.addListener(() => { + browser.tabs.create({ url: browser.runtime.getURL("liste.html") }); +}); diff --git a/extension/icons/icon.svg b/extension/icons/icon.svg new file mode 100644 index 0000000..6f79713 --- /dev/null +++ b/extension/icons/icon.svg @@ -0,0 +1,5 @@ + + + 8 + diff --git a/extension/liste.css b/extension/liste.css new file mode 100644 index 0000000..5bfee0a --- /dev/null +++ b/extension/liste.css @@ -0,0 +1,29 @@ +:root { + color-scheme: light dark; + font-family: system-ui, sans-serif; +} + +body { + margin: 0; +} + +main { + max-width: 48rem; + margin: 0 auto; + padding: 2rem 1.5rem; +} + +h1 { + margin-top: 0; +} + +#liste { + list-style: none; + margin: 0; + padding: 0; +} + +.liste-vide { + color: #666; + font-style: italic; +} diff --git a/extension/liste.html b/extension/liste.html new file mode 100644 index 0000000..a19bc08 --- /dev/null +++ b/extension/liste.html @@ -0,0 +1,16 @@ + + + + + + Écho du Huit + + + +
+

Écho du Huit

+ +
+ + + diff --git a/extension/liste.js b/extension/liste.js new file mode 100644 index 0000000..10a2141 --- /dev/null +++ b/extension/liste.js @@ -0,0 +1,8 @@ +// Squelette : la récupération des deux sources (Atelier du Huit, ville de +// Cugnaux) arrivera dans des tâches ultérieures. Pour l'instant, état vide. +const liste = document.querySelector("#liste"); + +const vide = document.createElement("li"); +vide.className = "liste-vide"; +vide.textContent = "Aucune donnée pour l'instant."; +liste.append(vide); diff --git a/extension/manifest.json b/extension/manifest.json new file mode 100644 index 0000000..8c45091 --- /dev/null +++ b/extension/manifest.json @@ -0,0 +1,24 @@ +{ + "manifest_version": 3, + "name": "Écho du Huit", + "version": "0.1.0", + "description": "Liste autonome agrégeant les infos de l'Atelier du Huit et de la ville de Cugnaux.", + "browser_specific_settings": { + "gecko": { + "id": "echo-du-huit@atelier-huit", + "strict_min_version": "127.0" + } + }, + "background": { + "scripts": ["background.js"] + }, + "action": { + "default_title": "Ouvrir la liste de l'Écho du Huit", + "default_icon": "icons/icon.svg" + }, + "host_permissions": [ + "https://atelier-huit.frama.space/*", + "https://www.ville-cugnaux.fr/*" + ], + "icons": { "48": "icons/icon.svg", "96": "icons/icon.svg" } +}