diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e9d30e..dd209a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ - Removed the standalone planned Rotate PDF card; page rotation remains available as part of PDF Organizer. - Moved shared browser image validation and decoding into `tools/shared/image.js` for PDF and Image tools. +- Promoted Privacy from generic planned placeholders to a production navigation hub for the existing Image and PDF metadata tools, with distinct supported-scope copy in all six locales. +- Repaired the Image category’s semantic tool list so all four available cards remain within the same list. ## 1.0.0 diff --git a/README.md b/README.md index e25aac6..66a5836 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,15 @@ The v1 baseline is recorded in the [changelog](./CHANGELOG.md) and historical [v The homepage and category hubs clearly distinguish production tools from planned work. +## Privacy metadata hub + +[`/tools/privacy/`](./tools/privacy/) is a navigation hub for the two existing production metadata tools. It does not add a generic inspector, cleaner, parser, or processing engine. + +- Image files route to [Image Metadata Inspector & Cleaner](./tools/image/metadata/), whose documented scope covers supported JPEG, PNG, and WebP structures. Its successful inspection may still be partial and non-exhaustive. +- PDF files route to [PDF Metadata Inspector & Cleaner](./tools/pdf/metadata/), whose cleaning scope is limited to supported document-info fields and does not claim to remove every XMP packet, attachment, annotation, or hidden structure. + +Both tools process file contents locally and verify only their documented supported scope. Scan/OCR and Media remain planned categories with non-interactive cards. + ## Interface languages Secure Tools ships complete, same-origin interface catalogs for: @@ -78,7 +87,8 @@ The hub is a static site built with semantic HTML, CSS, and Vanilla JavaScript E │ ├── fr.js │ ├── image-resize.js │ ├── image-compressor.js -│ └── image-metadata.js +│ ├── image-metadata.js +│ └── privacy-hub.js ├── tools/ │ ├── shared/ │ │ ├── file.js @@ -136,7 +146,7 @@ The category hubs are: - `/tools/scan/` - `/tools/media/` -Categories are the stable navigation layer. Individual utilities can be added beneath them without turning the homepage into an unstructured tool list. Planned utilities remain visible only when clearly marked as unavailable. +Categories are the stable navigation layer. PDF, Image, and Privacy link to production tools; Scan/OCR and Media remain planned and non-interactive. Individual utilities can be added beneath categories without turning the homepage into an unstructured tool list. `/tools/image-to-pdf/` is a lightweight static migration page with a meta refresh and visible fallback link to `/tools/pdf/images-to-pdf/`. It does not use JavaScript to redirect. diff --git a/docs/ux-consistency-audit.md b/docs/ux-consistency-audit.md index 5daa9ee..91090c2 100644 --- a/docs/ux-consistency-audit.md +++ b/docs/ux-consistency-audit.md @@ -67,3 +67,17 @@ Browser automation remained unavailable because the Windows helper failed under ## Validation boundary Automated checks cover architecture, semantics, resources, six-language keys, known overflow anti-patterns, CSP, and functional regressions. Browser automation remained subject to the known Windows sandbox ACL limitation during this Sprint. If visual control is unavailable, real human browser review at 360, 390, 768, 1024, and 1440 CSS pixels in Light/Dark themes remains required before v1.0.0 release approval. + +## Sprint 16 Privacy hub follow-up + +Sprint 16 corrected the Image category list structure and replaced the stale generic Privacy placeholders with two available navigation cards. The hub routes to the existing Image and PDF metadata tools and states their distinct, bounded inspection and cleaning scopes. Scan/OCR and Media remain planned and non-interactive. + +Automated checks now enforce: + +- one semantic list containing all four Image production cards; +- exactly two available Privacy links with existing route targets; +- all six PDF production links remaining available; +- Scan/OCR and Media remaining planned; and +- complete six-locale Privacy metadata, category, and scope copy. + +Interactive browser QA was retried on 2026-08-26 against a temporary localhost server. The browser runtime terminated before navigation with `windows sandbox failed: helper_unknown_error: apply deny-read ACLs`. Browser QA therefore did **not** pass and automated DOM/CSS checks are not presented as visual verification. Manual review remains open for `/`, `/tools/image/`, `/tools/privacy/`, `/tools/image/metadata/`, and `/tools/pdf/metadata/` at 320, 360, 390, 768, 1024, and 1440 CSS pixels in Light and Dark themes, including all six locales and keyboard focus/activation of the Privacy cards. diff --git a/js/i18n.js b/js/i18n.js index eb8bc91..d9902f9 100644 --- a/js/i18n.js +++ b/js/i18n.js @@ -7,17 +7,19 @@ import { fr } from "./locales/fr.js"; import { imageResizeLocales } from "./locales/image-resize.js"; import { imageCompressorLocales } from "./locales/image-compressor.js"; import { imageMetadataLocales } from "./locales/image-metadata.js"; +import { privacyHubLocales } from "./locales/privacy-hub.js"; const STORAGE_KEY = "secure-tools-language"; const baseTranslations = { en, ko, ja, es, de, fr }; export const translations = Object.fromEntries(Object.entries(baseTranslations).map(([language, catalog]) => [language, { ...catalog, - metadata: { ...catalog.metadata, imageResize: imageResizeLocales[language].metadata, imageCompressor: imageCompressorLocales[language].metadata, imageMetadata: imageMetadataLocales[language].metadata }, - tools: { ...catalog.tools, imageMetadata: imageMetadataLocales[language].toolName }, + metadata: { ...catalog.metadata, imageResize: imageResizeLocales[language].metadata, imageCompressor: imageCompressorLocales[language].metadata, imageMetadata: imageMetadataLocales[language].metadata, privacyCategory: privacyHubLocales[language].metadata }, + tools: { ...catalog.tools, imageMetadata: imageMetadataLocales[language].toolName, categoryDescriptions: { ...catalog.tools.categoryDescriptions, privacy: privacyHubLocales[language].categoryDescription } }, categories: { ...catalog.categories, image: { ...catalog.categories.image, metadata: imageMetadataLocales[language].categoryDescription } }, imageResize: imageResizeLocales[language].copy, imageCompressor: imageCompressorLocales[language].copy, imageMetadata: imageMetadataLocales[language].copy, + privacyHub: privacyHubLocales[language].copy, }])); export function resolveLanguage(value, availableLanguages = Object.keys(translations)) { diff --git a/js/locales/privacy-hub.js b/js/locales/privacy-hub.js new file mode 100644 index 0000000..5cf576d --- /dev/null +++ b/js/locales/privacy-hub.js @@ -0,0 +1,80 @@ +export const privacyHubLocales = { + en: { + metadata: { title: "Privacy metadata tools — Secure Tools", description: "Choose a specialized local tool for supported image or PDF metadata." }, + categoryDescription: "Inspect and clean supported image or PDF metadata.", + copy: { + title: "Privacy metadata tools", + description: "Choose the tool that matches your file type. Image and PDF metadata have different supported scopes.", + imageTitle: "Image Metadata Inspector & Cleaner", + imageDescription: "Inspect decoded and opaque metadata in JPEG, PNG, or WebP images, then save a verified Privacy Clean copy. Inspection may be partial and non-exhaustive.", + pdfTitle: "PDF Metadata Inspector & Cleaner", + pdfDescription: "Inspect and remove supported PDF document-info fields. This does not cover every XMP packet, attachment, annotation, or hidden document structure.", + note: "These specialized tools process files locally and verify only their documented supported scope.", + }, + }, + ko: { + metadata: { title: "개인정보 메타데이터 도구 — Secure Tools", description: "지원되는 이미지 또는 PDF 메타데이터에 맞는 로컬 도구를 선택하세요." }, + categoryDescription: "지원되는 이미지 또는 PDF 메타데이터를 검사하고 정리합니다.", + copy: { + title: "개인정보 메타데이터 도구", + description: "파일 형식에 맞는 도구를 선택하세요. 이미지와 PDF 메타데이터는 지원 범위가 서로 다릅니다.", + imageTitle: "이미지 메타데이터 검사 및 정리", + imageDescription: "JPEG, PNG 또는 WebP의 해석된 메타데이터와 불투명 메타데이터를 검사한 뒤 검증된 개인정보 정리본을 저장합니다. 검사는 부분적이며 완전하지 않을 수 있습니다.", + pdfTitle: "PDF 메타데이터 검사 및 정리", + pdfDescription: "지원되는 PDF 문서 정보 필드를 검사하고 제거합니다. 모든 XMP 패킷, 첨부 파일, 주석 또는 숨겨진 문서 구조를 다루지는 않습니다.", + note: "각 전문 도구는 파일을 로컬에서 처리하며 문서화된 지원 범위만 검증합니다.", + }, + }, + ja: { + metadata: { title: "プライバシーメタデータツール — Secure Tools", description: "対応する画像またはPDFメタデータ用のローカルツールを選択します。" }, + categoryDescription: "対応する画像またはPDFのメタデータを検査・整理します。", + copy: { + title: "プライバシーメタデータツール", + description: "ファイル形式に合うツールを選択してください。画像とPDFでは対応するメタデータの範囲が異なります。", + imageTitle: "画像メタデータ検査・クリーナー", + imageDescription: "JPEG、PNG、WebPの解読済みおよび不透明なメタデータを検査し、検証済みのプライバシークリーンコピーを保存します。検査は部分的で網羅的でない場合があります。", + pdfTitle: "PDFメタデータ検査・クリーナー", + pdfDescription: "対応するPDF文書情報フィールドを検査・削除します。すべてのXMPパケット、添付、注釈、隠れた文書構造を対象とするものではありません。", + note: "各専用ツールはファイルをローカルで処理し、文書化された対応範囲のみを検証します。", + }, + }, + es: { + metadata: { title: "Herramientas de metadatos privados — Secure Tools", description: "Elige una herramienta local especializada para metadatos compatibles de imagen o PDF." }, + categoryDescription: "Inspecciona y limpia metadatos compatibles de imágenes o PDF.", + copy: { + title: "Herramientas de metadatos privados", + description: "Elige la herramienta adecuada para el tipo de archivo. Las imágenes y los PDF tienen alcances de metadatos distintos.", + imageTitle: "Inspector y limpiador de metadatos de imagen", + imageDescription: "Inspecciona metadatos decodificados y opacos en imágenes JPEG, PNG o WebP y guarda una copia de privacidad verificada. La inspección puede ser parcial y no exhaustiva.", + pdfTitle: "Inspector y limpiador de metadatos PDF", + pdfDescription: "Inspecciona y elimina campos compatibles de información del documento PDF. No abarca todos los paquetes XMP, adjuntos, anotaciones ni estructuras ocultas.", + note: "Estas herramientas especializadas procesan los archivos localmente y solo verifican su alcance compatible documentado.", + }, + }, + de: { + metadata: { title: "Datenschutz-Metadatenwerkzeuge — Secure Tools", description: "Ein spezialisiertes lokales Werkzeug für unterstützte Bild- oder PDF-Metadaten wählen." }, + categoryDescription: "Unterstützte Bild- oder PDF-Metadaten prüfen und bereinigen.", + copy: { + title: "Datenschutz-Metadatenwerkzeuge", + description: "Wählen Sie das Werkzeug passend zum Dateityp. Bild- und PDF-Metadaten haben unterschiedliche unterstützte Bereiche.", + imageTitle: "Bildmetadaten-Prüfer & Bereiniger", + imageDescription: "Dekodierte und undurchsichtige Metadaten in JPEG-, PNG- oder WebP-Bildern prüfen und eine verifizierte Datenschutzkopie speichern. Die Prüfung kann teilweise und nicht vollständig sein.", + pdfTitle: "PDF-Metadaten-Prüfer & Bereiniger", + pdfDescription: "Unterstützte PDF-Dokumentinformationsfelder prüfen und entfernen. Dies umfasst nicht jedes XMP-Paket, jeden Anhang, jede Anmerkung oder verborgene Dokumentstruktur.", + note: "Diese spezialisierten Werkzeuge verarbeiten Dateien lokal und verifizieren nur ihren dokumentierten unterstützten Umfang.", + }, + }, + fr: { + metadata: { title: "Outils de métadonnées privées — Secure Tools", description: "Choisissez un outil local spécialisé pour les métadonnées d’image ou PDF prises en charge." }, + categoryDescription: "Inspectez et nettoyez les métadonnées d’image ou PDF prises en charge.", + copy: { + title: "Outils de métadonnées privées", + description: "Choisissez l’outil adapté au type de fichier. Les images et les PDF ont des périmètres de métadonnées différents.", + imageTitle: "Inspecteur et nettoyeur de métadonnées d’image", + imageDescription: "Inspectez les métadonnées décodées et opaques des images JPEG, PNG ou WebP, puis enregistrez une copie de confidentialité vérifiée. L’inspection peut être partielle et non exhaustive.", + pdfTitle: "Inspecteur et nettoyeur de métadonnées PDF", + pdfDescription: "Inspectez et supprimez les champs d’information PDF pris en charge. Cela ne couvre pas tous les paquets XMP, pièces jointes, annotations ou structures cachées.", + note: "Ces outils spécialisés traitent les fichiers localement et vérifient uniquement leur périmètre documenté pris en charge.", + }, + }, +}; diff --git a/tests/category-availability.test.mjs b/tests/category-availability.test.mjs new file mode 100644 index 0000000..1db9f89 --- /dev/null +++ b/tests/category-availability.test.mjs @@ -0,0 +1,66 @@ +import assert from "node:assert/strict"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +import { translations } from "../js/i18n.js"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const read = (relative) => fs.readFileSync(path.join(root, relative), "utf8"); + +function categoryList(html) { + const list = html.match(/
  • @@ -115,6 +114,7 @@

    Image Metadata Inspector & Cleaner

    Inspect privacy-relevant metadata and save a verified cleaned copy.

  • +

    Available tools process file contents in browser memory. Planned items are clearly marked.

    diff --git a/tools/privacy/index.html b/tools/privacy/index.html index e10d993..28bcda8 100644 --- a/tools/privacy/index.html +++ b/tools/privacy/index.html @@ -1,6 +1,6 @@ - Privacy tools — Secure Tools + Privacy metadata tools — Secure Tools -

    Tool category

    Privacy tools

    Inspect and remove hidden file details without sharing the source file.

    This category is planned. No unavailable item is presented as working.

    +

    Tool category

    Privacy metadata tools

    Choose the tool that matches your file type. Image and PDF metadata have different supported scopes.

    These specialized tools process files locally and verify only their documented supported scope.