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>

View file

@ -1242,12 +1242,16 @@ span {
.about-story-section {
display: grid;
grid-template-columns: minmax(210px, 260px) minmax(0, 1fr);
gap: var(--space-6);
gap: var(--space-5);
align-items: start;
padding: var(--space-6);
}
.about-story-section .about-section-heading {
position: static;
max-width: 860px;
}
.about-section-heading {
position: sticky;
top: var(--space-5);
@ -1257,46 +1261,145 @@ span {
margin-bottom: 0;
}
.about-section-heading .about-contribute-illustration {
margin-top: var(--space-6);
}
.about-story-list {
display: grid;
gap: 0;
grid-template-columns: repeat(2, minmax(0, 1fr));
justify-content: center;
width: 100%;
gap: var(--space-4);
margin-inline: auto;
}
.about-story-item {
display: grid;
grid-template-columns: 42px minmax(0, 1fr);
grid-template-rows: auto 1fr;
gap: var(--space-3);
align-items: stretch;
min-width: 0;
overflow: hidden;
padding: var(--space-4);
border: 1px solid rgba(150, 165, 205, 0.12);
border-radius: var(--radius-md);
background:
linear-gradient(135deg, rgba(139, 92, 246, 0.1), transparent 42%),
rgba(16, 20, 38, 0.36);
}
.about-story-body {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: var(--space-4);
padding: var(--space-4) 0;
border-bottom: 1px solid rgba(165, 180, 252, 0.1);
align-items: center;
min-width: 0;
}
.about-story-item:first-child {
padding-top: 0;
}
.about-story-item:last-child {
border-bottom: 0;
}
.about-story-item > span {
color: var(--color-accent-gold);
font-size: var(--font-size-xs);
font-weight: 900;
letter-spacing: 0.08em;
line-height: 1.8;
.about-story-body > div {
display: grid;
align-content: center;
gap: 10px;
min-height: 210px;
padding-block: var(--space-4);
}
.about-story-item h3 {
margin: 0 0 6px;
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
margin: 0;
padding: 0 0 var(--space-3);
border-bottom: 1px solid rgba(246, 196, 83, 0.12);
color: var(--color-text-primary);
font-size: var(--font-size-lg);
font-size: var(--font-size-base);
}
.about-story-item > div > p {
max-width: 108ch;
.about-story-item h3 .module-icon {
width: 30px;
height: 30px;
flex: 0 0 30px;
border: 1px solid rgba(246, 196, 83, 0.24);
border-radius: var(--radius-sm);
background: rgba(246, 196, 83, 0.09);
}
.about-story-item h3 .module-icon-svg {
width: 16px;
height: 16px;
}
.about-story-body p {
margin: 0;
color: var(--color-text-secondary);
line-height: 1.62;
font-size: var(--font-size-sm);
line-height: 1.58;
}
.about-story-bullets {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 4px var(--space-4);
margin: 0;
padding-left: 1.15rem;
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
line-height: 1.5;
}
.about-story-bullets li {
padding-left: 2px;
}
.about-story-bullets li::marker {
color: var(--color-accent-gold);
}
.about-story-bullets.single-column {
grid-template-columns: 1fr;
}
.about-story-warning {
display: flex;
align-items: flex-start;
gap: 7px;
color: var(--color-warning);
font-size: var(--font-size-xs);
font-weight: 500;
line-height: 1.5;
}
.about-story-warning .ui-icon {
width: 15px;
min-width: 15px;
height: 15px;
margin-top: 1px;
color: var(--color-warning);
opacity: 0.88;
}
.about-story-visual {
display: grid;
min-height: 230px;
place-items: center;
overflow: hidden;
border: 1px solid rgba(246, 196, 83, 0.12);
border-radius: var(--radius-md);
background:
radial-gradient(circle at center, rgba(139, 92, 246, 0.28), transparent 60%),
radial-gradient(circle at 24% 18%, rgba(246, 196, 83, 0.1), transparent 36%),
rgba(5, 7, 17, 0.18);
}
.about-story-illustration {
display: block;
width: min(96%, 340px);
max-height: 250px;
object-fit: contain;
opacity: 0.94;
filter: saturate(1.02) brightness(1.02) drop-shadow(0 18px 26px rgba(0, 0, 0, 0.32));
}
.about-tools-section {
@ -1305,14 +1408,28 @@ span {
padding: var(--space-6);
}
.about-tools-section .page-heading p:not(.eyebrow) {
max-width: 780px;
margin: 8px 0 0;
color: var(--color-text-secondary);
line-height: 1.56;
}
.about-contribute-section {
display: grid;
grid-template-columns: minmax(210px, 260px) minmax(0, 1fr);
gap: var(--space-6);
align-items: stretch;
scroll-margin-top: var(--space-6);
padding: var(--space-6);
}
.about-contribute-section .about-section-heading {
display: grid;
grid-template-rows: auto 1fr;
align-self: stretch;
}
.about-contribute-content {
display: grid;
gap: var(--space-4);
@ -1325,8 +1442,69 @@ span {
line-height: 1.62;
}
.about-contribute-blocks {
display: grid;
gap: var(--space-4);
}
.about-contribute-block {
display: grid;
grid-template-columns: 30px minmax(0, 1fr);
gap: 12px;
align-items: start;
min-width: 0;
}
.about-contribute-block .module-icon {
width: 28px;
height: 28px;
border: 1px solid rgba(246, 196, 83, 0.22);
border-radius: var(--radius-sm);
background: rgba(246, 196, 83, 0.09);
}
.about-contribute-block .module-icon-svg {
width: 15px;
height: 15px;
}
.about-contribute-block h3 {
margin: 0 0 6px;
color: var(--color-text-primary);
font-size: var(--font-size-sm);
}
.about-contribute-block p {
margin: 0;
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
line-height: 1.5;
}
.about-contribute-block ul {
display: grid;
gap: 4px;
margin: 10px 0 0;
padding-left: 1.15rem;
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
line-height: 1.45;
}
.about-contribute-block li::marker {
color: var(--color-accent-gold);
}
.about-contribute-block .about-contribute-note {
margin-top: var(--space-3);
color: var(--color-text-muted);
font-size: var(--font-size-xs);
line-height: 1.45;
}
.about-contribute-content pre,
.about-prompt-box {
.about-prompt-box,
.about-code-example {
margin: 0;
border: 1px solid rgba(165, 180, 252, 0.12);
border-radius: var(--radius-md);
@ -1340,6 +1518,58 @@ span {
overflow-wrap: anywhere;
}
.about-contribute-formats {
display: grid;
grid-template-columns: minmax(260px, 0.64fr) minmax(0, 1.36fr);
gap: var(--space-4);
align-items: stretch;
margin-top: var(--space-3);
}
.about-code-example {
display: grid;
grid-template-rows: auto 1fr;
overflow: hidden;
background:
linear-gradient(135deg, rgba(139, 92, 246, 0.08), transparent 45%),
rgba(5, 7, 17, 0.32);
}
.about-code-example > p {
margin: 0;
padding: 8px var(--space-3);
border-bottom: 1px solid rgba(246, 196, 83, 0.14);
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
font-weight: 800;
line-height: 1.4;
}
.about-code-example pre {
border: 0;
border-radius: 0;
background: transparent;
padding: var(--space-3);
}
.about-contribute-illustration {
display: block;
width: min(100%, 260px);
max-height: 420px;
object-fit: contain;
filter: saturate(1.05) brightness(1.04) drop-shadow(0 26px 38px rgba(0, 0, 0, 0.36));
}
.about-section-heading .about-contribute-illustration {
width: min(100%, 300px);
max-height: 520px;
align-self: center;
margin-top: var(--space-6);
object-fit: contain;
opacity: 0.94;
filter: saturate(1.02) brightness(0.99) drop-shadow(0 22px 30px rgba(0, 0, 0, 0.32));
}
.about-contribute-content code {
color: var(--color-text-primary);
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
@ -1349,6 +1579,8 @@ span {
}
.about-prompt-box {
display: grid;
align-content: start;
padding: var(--space-4);
}
@ -1412,11 +1644,43 @@ span {
line-height: 1.5;
}
.about-tool-examples {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin: 10px 0 0;
padding: 0;
list-style: none;
}
.about-tool-examples li {
padding: 4px 8px;
border: 1px solid rgba(246, 196, 83, 0.18);
border-radius: var(--radius-pill);
background: rgba(246, 196, 83, 0.08);
color: var(--color-accent-gold);
font-size: var(--font-size-xs);
font-weight: 800;
}
.about-tools-library-button {
display: flex;
width: fit-content;
min-width: min(100%, 300px);
align-items: center;
justify-content: center;
justify-self: center;
margin-top: var(--space-2);
}
.about-storage-reminders {
display: grid;
gap: 12px;
margin-top: var(--space-4);
padding-left: 44px;
gap: var(--space-3);
margin-top: var(--space-2);
padding: var(--space-5);
border: 1px solid rgba(246, 196, 83, 0.16);
border-radius: var(--radius-md);
background: rgba(5, 7, 17, 0.24);
}
.about-storage-reminders .eyebrow {
@ -1426,52 +1690,53 @@ span {
.about-reminders-list {
display: grid;
gap: 0;
grid-template-columns: repeat(4, minmax(0, 260px));
justify-content: center;
gap: var(--space-4);
margin: 0;
padding: 2px 0 2px var(--space-5);
padding: 0;
list-style: none;
border-left: 1px solid rgba(246, 196, 83, 0.22);
}
.about-reminder-item {
display: grid;
grid-template-columns: 38px minmax(0, 1fr);
gap: 12px;
align-items: start;
padding: 12px 0;
border-bottom: 1px solid rgba(165, 180, 252, 0.1);
gap: 10px;
min-width: 0;
padding: var(--space-3);
border: 1px solid rgba(150, 165, 205, 0.1);
border-radius: var(--radius-sm);
background: rgba(16, 20, 38, 0.34);
}
.about-reminder-item:first-child {
padding-top: 0;
}
.about-reminder-item:last-child {
padding-bottom: 0;
border-bottom: 0;
.about-reminder-heading {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
}
.about-reminder-item .module-icon {
width: 34px;
height: 34px;
flex: 0 0 34px;
width: 30px;
height: 30px;
flex: 0 0 30px;
border: 1px solid rgba(246, 196, 83, 0.26);
border-radius: var(--radius-md);
border-radius: var(--radius-sm);
background: rgba(246, 196, 83, 0.1);
}
.about-reminder-item h4 {
margin: 0 0 6px;
margin: 0;
color: var(--color-text-primary);
font-size: var(--font-size-base);
font-size: var(--font-size-xs);
line-height: 1.25;
}
.about-reminder-item p {
max-width: none;
margin: 0;
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
line-height: 1.48;
font-size: var(--font-size-xs);
line-height: 1.45;
}
.home-stats {

View file

@ -42,6 +42,11 @@
-webkit-mask-image: url("/static/icons/info.svg");
}
.ui-icon-warning {
mask-image: url("/static/icons/warning.svg");
-webkit-mask-image: url("/static/icons/warning.svg");
}
.ui-icon-export {
mask-image: url("/static/icons/export.svg");
-webkit-mask-image: url("/static/icons/export.svg");

View file

@ -41,6 +41,10 @@
.about-section-heading {
position: static;
}
.about-reminders-list {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-height: 760px) and (min-width: 1025px) {
@ -86,7 +90,11 @@
.home-onboarding-layout,
.home-onboarding-cards,
.about-story-section,
.about-story-list,
.about-contribute-blocks,
.about-contribute-section,
.about-contribute-formats,
.about-reminders-list,
.about-tools-list,
.section-grid,
.info-grid {
@ -101,8 +109,42 @@
border-bottom: 0;
}
.about-storage-reminders {
padding-left: 0;
.about-story-list {
width: 100%;
}
.about-story-body {
grid-template-columns: 1fr;
}
.about-story-visual {
min-height: 176px;
}
.about-story-illustration {
width: min(86%, 220px);
}
.about-story-bullets {
grid-template-columns: 1fr;
}
.about-contribute-illustration {
width: min(100%, 220px);
max-height: 260px;
justify-self: center;
}
.about-contribute-section .about-section-heading {
grid-template-rows: auto;
}
.about-section-heading .about-contribute-illustration {
margin-top: var(--space-5);
}
.about-code-example pre {
padding-left: var(--space-4);
}
.hero,