Improve about page guidance and onboarding visuals

This commit is contained in:
Shinuwa 2026-08-13 23:56:30 +02:00
parent 48dcc8182c
commit 9248b5d075
15 changed files with 610 additions and 173 deletions

View file

@ -7,7 +7,8 @@ import { HomeOnboardingSection } from "./HomeOnboardingSection.jsx";
export function AboutPage({ siteContent }) {
const content = siteContent.about;
const limits = Array.isArray(content.limits) ? content.limits : [];
const storageSectionIndex = content.sections.findIndex((section) => section.title.toLowerCase().includes("stockage"));
const toolGroups = Array.isArray(content.toolGroups) ? content.toolGroups : [];
const contributeBlocks = Array.isArray(content.contribute?.blocks) ? content.contribute.blocks : [];
const normalizeReminder = (item, index) => typeof item === "string" ? { title: `Point ${index + 1}`, text: item, icon: "toolbox" } : item;
useEffect(() => {
if (!location.hash.includes("#contribuer")) return;
@ -25,41 +26,64 @@ export function AboutPage({ siteContent }) {
</section>
<section className="about-story-section nebula-panel" aria-labelledby="about-story-title">
<div className="about-section-heading">
<p className="eyebrow">Principes</p>
<h2 id="about-story-title">Comment ça fonctionne</h2>
<p className="eyebrow">{content.sectionsEyebrow}</p>
<h2 id="about-story-title">{content.sectionsTitle}</h2>
</div>
<div className="about-story-list">
{content.sections.map((section, index) => (
<article className="about-story-item" key={section.title}>
<span>{String(index + 1).padStart(2, "0")}</span>
<div>
<h3>{section.title}</h3>
<p><RichText text={section.text} /></p>
{index === storageSectionIndex && limits.length > 0 && (
<div className="about-storage-reminders">
<p className="eyebrow">{content.limitsTitle}</p>
<ul className="about-reminders-list">
{limits.map((item, itemIndex) => {
const reminder = normalizeReminder(item, itemIndex);
return (
<li className="about-reminder-item" key={reminder.title || reminder.text}>
<span className="module-icon" aria-hidden="true">
<span className={`module-icon-svg module-icon-${reminder.icon || "toolbox"}`} />
</span>
<div>
<h4>{reminder.title}</h4>
<p><RichText text={reminder.text} /></p>
</div>
</li>
);
})}
</ul>
</div>
<h3>
<span className="module-icon" aria-hidden="true">
<span className={`module-icon-svg module-icon-${section.icon || "toolbox"}`} />
</span>
{section.title}
</h3>
<div className="about-story-body">
{section.image && (
<span className="about-story-visual" aria-hidden="true">
<img className="about-story-illustration" src={section.image} alt="" />
</span>
)}
<div>
<p><RichText text={section.text} /></p>
{Array.isArray(section.bullets) && section.bullets.length > 0 && (
<ul className={`about-story-bullets ${section.bulletsColumns === 1 ? "single-column" : ""}`}>
{section.bullets.map((bullet) => <li key={bullet}>{bullet}</li>)}
</ul>
)}
{section.afterText && <p><RichText text={section.afterText} /></p>}
{section.warning && (
<p className="about-story-warning">
<Icon name="warning" />
<RichText text={section.warning} />
</p>
)}
</div>
</div>
</article>
))}
</div>
{limits.length > 0 && (
<div className="about-storage-reminders">
<p className="eyebrow">{content.limitsTitle}</p>
<ul className="about-reminders-list">
{limits.map((item, itemIndex) => {
const reminder = normalizeReminder(item, itemIndex);
return (
<li className="about-reminder-item" key={reminder.title || reminder.text}>
<div className="about-reminder-heading">
<span className="module-icon" aria-hidden="true">
<span className={`module-icon-svg module-icon-${reminder.icon || "toolbox"}`} />
</span>
<h4>{reminder.title}</h4>
</div>
<p><RichText text={reminder.text} /></p>
</li>
);
})}
</ul>
</div>
)}
</section>
<HomeOnboardingSection content={siteContent.home.onboarding} className="about-onboarding-section" />
<section className="about-tools-section nebula-panel">
@ -67,36 +91,71 @@ export function AboutPage({ siteContent }) {
<div>
<p className="eyebrow">Toolbox</p>
<h2>{content.toolsTitle}</h2>
{content.toolsIntro && <p>{content.toolsIntro}</p>}
</div>
<a className="button library-link-button" href="#/library"><Icon name="book" />{content.toolsLibraryLink}</a>
</div>
<div className="about-tools-list">
{content.tools.map((tool) => (
<article className="about-tool-item" key={tool.name}>
{toolGroups.map((group) => (
<article className="about-tool-item" key={group.title}>
<span className="module-icon" aria-hidden="true">
<span className={`module-icon-svg module-icon-${tool.icon || "notepad"}`} />
<span className={`module-icon-svg module-icon-${group.icon || "notepad"}`} />
</span>
<div>
<h3>{tool.name}</h3>
<p><RichText text={tool.description} /></p>
<h3>{group.title}</h3>
<p><RichText text={group.text} /></p>
{Array.isArray(group.examples) && group.examples.length > 0 && (
<ul className="about-tool-examples" aria-label={`Exemples pour ${group.title}`}>
{group.examples.map((example) => <li key={example}>{example}</li>)}
</ul>
)}
</div>
</article>
))}
</div>
<a className="button primary about-tools-library-button" href="#/library"><Icon name="book" />{content.toolsLibraryLink}</a>
</section>
{content.contribute && (
<section className="about-contribute-section nebula-panel" id="contribuer" aria-labelledby="about-contribute-title">
<div className="about-section-heading">
<p className="eyebrow">{content.contribute.eyebrow}</p>
<h2 id="about-contribute-title">{content.contribute.title}</h2>
{content.contribute.image && (
<img className="about-contribute-illustration" src={content.contribute.image} alt={content.contribute.imageAlt || ""} />
)}
</div>
<div className="about-contribute-content">
<p><RichText text={content.contribute.description} /></p>
<pre><code>{content.contribute.example}</code></pre>
<div className="about-prompt-box">
<h3>{content.contribute.promptTitle}</h3>
<p><RichText text={content.contribute.promptIntro} /></p>
<pre><code>{content.contribute.promptText}</code></pre>
{contributeBlocks.length > 0 && (
<div className="about-contribute-blocks">
{contributeBlocks.map((block) => (
<article className="about-contribute-block" key={block.title}>
<span className="module-icon" aria-hidden="true">
<span className={`module-icon-svg module-icon-${block.icon || "checklist"}`} />
</span>
<div>
<h3>{block.title}</h3>
<p><RichText text={block.text} /></p>
{Array.isArray(block.bullets) && block.bullets.length > 0 && (
<ul>
{block.bullets.map((bullet) => <li key={bullet}>{bullet}</li>)}
</ul>
)}
{block.note && <p className="about-contribute-note"><RichText text={block.note} /></p>}
</div>
</article>
))}
</div>
)}
<div className="about-contribute-formats">
<div className="about-code-example">
{content.contribute.exampleIntro && <p><RichText text={content.contribute.exampleIntro} /></p>}
<pre><code>{content.contribute.example}</code></pre>
</div>
<div className="about-prompt-box">
<h3>{content.contribute.promptTitle}</h3>
<p><RichText text={content.contribute.promptIntro} /></p>
<pre><code>{content.contribute.promptText}</code></pre>
</div>
</div>
</div>
</section>