Fusion de origin/lecons (recette 1g) dans progression

Conflit sur la ligne de progression de l'accueil : le texte de 1g
(« Aucune leçon terminée sur 5 », majuscule en tête) dans le lien vers
#/progression.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Pierre MARTIN
2026-11-12 14:19:08 +01:00
co-authored by Claude Opus 5.5
15 changed files with 149 additions and 50 deletions
+3 -1
View File
@@ -41,7 +41,9 @@ export const HOME_TEXTS = {
rulesContinue: (step: number) => `Reprendre à l'étape ${step}`,
rulesAgain: "Revoir",
progress: (played: number, won: number) =>
`${plural(played, "partie jouée", "parties jouées")} · ${plural(won, "gagnée", "gagnées")}`,
played === 0
? "aucune partie jouée"
: `${plural(played, "partie jouée", "parties jouées")} · ${plural(won, "gagnée", "gagnées")}`,
/** La ligne de progression, lien vers l'écran de progression (1h). */
progressLink: (line: string) => `Votre progression : ${line}`,
footer: "Né à l'Atelier du Huit, à Cugnaux. Logiciel libre, sans publicité ni mise.",
+5 -3
View File
@@ -294,12 +294,14 @@ export function createHomeView(options: HomeViewOptions): HomeView {
if (state.lessons !== null) {
parts.push(LESSON_TEXTS.homeSummary(state.lessons.finished, state.lessons.total));
}
if (state.progress !== null && state.progress.played > 0) {
if (state.progress !== null) {
parts.push(HOME_TEXTS.progress(state.progress.played, state.progress.won));
}
progressText.textContent = parts.join(" · ");
const line = parts.join(" · ");
const shown = line.charAt(0).toUpperCase() + line.slice(1);
progressText.textContent = shown;
progress.hidden = parts.length === 0;
progress.setAttribute("aria-label", HOME_TEXTS.progressLink(parts.join(" · ")));
progress.setAttribute("aria-label", HOME_TEXTS.progressLink(line));
},
};
}
+3 -1
View File
@@ -53,5 +53,7 @@ export const LESSON_TEXTS = {
homeAllDoneDetail: "Vous pouvez les revoir quand vous voulez.",
allLessons: "Toutes les leçons",
homeSummary: (finished: number, total: number) =>
`${plural(finished, "leçon terminée", "leçons terminées")} sur ${total}`,
finished === 0
? `Aucune leçon terminée sur ${total}`
: `${plural(finished, "leçon terminée", "leçons terminées")} sur ${total}`,
} as const;
+4 -3
View File
@@ -86,9 +86,10 @@ export function createLessonsView(section: HTMLElement): LessonsView {
const head = element(section, "div", { className: "lessons-intro" });
element(head, "h2", { text: LESSON_TEXTS.listTitle });
element(head, "p", { className: "muted", text: LESSON_TEXTS.listLead });
const rules = element(section, "p", { className: "lessons-rules caption" });
rules.append(`${LESSON_TEXTS.rulesReminder} · `);
const review = element(rules, "a", { id: "lessons-rules", text: LESSON_TEXTS.rulesReview });
// Le rappel des règles : toute la ligne est le lien, haute de 44 px.
const review = element(section, "a", { id: "lessons-rules", className: "lessons-rules" });
review.append(`${LESSON_TEXTS.rulesReminder} · `);
element(review, "span", { text: LESSON_TEXTS.rulesReview });
review.href = "#/tutoriel/1";
review.setAttribute("aria-label", LESSON_TEXTS.rulesReviewLabel);
const status = element(section, "p", { id: "lessons-status", className: "muted" });
+4 -2
View File
@@ -287,14 +287,16 @@ export function createTutorialView(options: TutorialViewOptions): TutorialView {
skip.textContent = course.texts.quit;
skip.setAttribute("aria-label", course.texts.quitLabel);
const overline = element(section, "p", { id: idOf("overline"), className: "overline" });
const title = element(section, "h2", { id: idOf("title"), className: "tutorial-title" });
// Le titre, et « Revoir » à sa droite (en portrait comme en paysage).
const titleRow = element(section, "div", { className: "tutorial-title-row" });
const title = element(titleRow, "h2", { id: idOf("title"), className: "tutorial-title" });
const boardBox = element(section, "div", { className: "tutorial-board-box" });
const svg = document.createElementNS(SVG_NS, "svg");
svg.id = idOf("board");
svg.setAttribute("class", "board tutorial-board");
svg.setAttribute("role", "img");
boardBox.append(svg);
const replay = element(boardBox, "button", {
const replay = element(titleRow, "button", {
id: idOf("replay"),
className: "icon-button tutorial-replay",
});