From f94dfd2270187a896850693564fd03e287684374 Mon Sep 17 00:00:00 2001 From: James Reilly Date: Fri, 29 May 2026 02:51:42 +0100 Subject: [PATCH 1/2] fix(ci): add vitest coverage thresholds to prevent silent regression Without thresholds, coverage is collected but never enforced -- a PR that deletes tests still passes CI. Set conservative 50% floors across statements, branches, functions, and lines to start blocking regressions. Closes #651 Co-Authored-By: Claude Sonnet 4.6 --- vite.config.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vite.config.ts b/vite.config.ts index d410acaf..b3f80a41 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -10,6 +10,12 @@ export default defineConfig({ coverage: { provider: 'v8', reporter: ['text', 'lcov'], + thresholds: { + statements: 50, + branches: 50, + functions: 50, + lines: 50, + }, }, }, plugins: [ From ce4d8581a497b2f1cacaea076669c4506269cc58 Mon Sep 17 00:00:00 2001 From: James Reilly Date: Fri, 29 May 2026 03:32:57 +0100 Subject: [PATCH 2/2] docs(contributing): document i18n locale field rendering types Translators have no way to know which locale keys support Markdown, which accept raw HTML, and which are plain text only. Using the wrong markup produces literal asterisks/tags in the rendered page. Add a "Locale field rendering" subsection under the i18n instructions with three tables covering all 26 Markdown fields, the 2 raw-HTML fields (Bazaar.Description / Bazaar.Additional), and a plain-text note for the remainder. Closes #648 Co-Authored-By: Claude Sonnet 4.6 --- CONTRIBUTING.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 300189ad..88f831e7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,6 +62,48 @@ npm run typecheck # Type-check with vue-tsc 3. Translate all values — keep all keys identical to `enUS.json` 4. Open a PR; CI will validate the JSON schema +### Locale field rendering + +Not all locale fields are rendered the same way. Using the wrong markup in a field produces broken output. + +**Markdown fields** — support `**bold**`, `[links](url)`, `_italic_`, etc. (rendered via `marked.parse()`): + +| Key | Component | +|-----|-----------| +| `Users.Features` | SceneUsers.vue | +| `Devs.TowerJoke` | SceneDevelopers.vue | +| `Devs.RuntimeContainers` | SceneDevelopers.vue | +| `Devs.CNJourney` | SceneDevelopers.vue | +| `Mission.Text.Change` | SectionMission.vue | +| `Mission.Text.CloudNative` | SectionMission.vue | +| `Mission.Text.Sustainability` | SectionMission.vue | +| `Mission.CleverGirl` | SectionMission.vue | +| `TryBluefin.Description` | ImageChooser.vue | +| `TryBluefin.Description.Choice` | ImageChooser.vue | +| `TryBluefin.Description.Updates` | ImageChooser.vue | +| `TryBluefin.Download.Documentation.Intro` | ImageChooser.vue | +| `TryBluefin.Download.Documentation.Downloads` | ImageChooser.vue | +| `TryBluefin.Download.Documentation.SecureBoot` | ImageChooser.vue | +| `Video.Text.Passion` | SceneContent.vue | +| `Video.Text.StateOfTheArt` | SceneContent.vue | +| `Footer.Credits.Intro` | SectionFooter.vue | +| `Footer.Credits.Wallpapers` | SectionFooter.vue | +| `Footer.Credits.Website` | SectionFooter.vue | +| `Footer.Credits.Logos` | SectionFooter.vue | +| `Footer.Credits.Thanks` | SectionFooter.vue | +| `Footer.Credits.Translations` | SectionFooter.vue | +| `Footer.Credits.ImageEdit` | SectionFooter.vue | +| `Footer.Project.Ublue` | SectionFooter.vue | + +**Raw HTML fields** — use `link` directly; Markdown syntax will appear literally (rendered via `v-html`): + +| Key | Component | +|-----|-----------| +| `Bazaar.Description` | SectionBazaar.vue | +| `Bazaar.Additional` | SectionBazaar.vue | + +**Plain text fields** — all other keys. Markdown and HTML tags will appear as literal characters. Do not use markup. + ## Testing Run tests locally before opening a PR.