Files
archicratie-edition/src/components/GlossaryPortalAside.astro
Archicratia 9f88112aca
All checks were successful
SMOKE / smoke (push) Successful in 13s
CI / build-and-anchors (push) Successful in 1m4s
CI / build-and-anchors (pull_request) Successful in 35s
feat(glossary): add step 21 smart navigation
2026-04-26 13:03:45 +02:00

286 lines
5.9 KiB
Plaintext

---
interface LinkItem {
href: string;
label: string;
}
interface Props {
ariaLabel: string;
title: string;
meta?: string;
backHref?: string;
backLabel?: string;
pageItems?: LinkItem[];
usefulLinks?: LinkItem[];
}
const {
ariaLabel,
title,
meta,
backHref = "/glossaire/",
backLabel = "← Retour au glossaire",
pageItems = [],
usefulLinks = [],
} = Astro.props;
---
<nav class="glossary-portal-aside" aria-label={ariaLabel}>
<div class="glossary-portal-aside__block">
<a class="glossary-portal-aside__back" href={backHref}>{backLabel}</a>
<div class="glossary-portal-aside__title">{title}</div>
{meta && <div class="glossary-portal-aside__meta">{meta}</div>}
</div>
{pageItems.length > 0 && (
<details class="glossary-portal-aside__block glossary-portal-aside__disclosure">
<summary class="glossary-portal-aside__summary">
<span class="glossary-portal-aside__heading">Dans cette page</span>
<span class="glossary-portal-aside__chevron" aria-hidden="true">▾</span>
</summary>
<div class="glossary-portal-aside__panel">
<ul class="glossary-portal-aside__list">
{pageItems.map((item) => (
<li><a href={item.href}>{item.label}</a></li>
))}
</ul>
</div>
</details>
)}
{usefulLinks.length > 0 && (
<details class="glossary-portal-aside__block glossary-portal-aside__disclosure">
<summary class="glossary-portal-aside__summary">
<span class="glossary-portal-aside__heading">Renvois utiles</span>
<span class="glossary-portal-aside__chevron" aria-hidden="true">▾</span>
</summary>
<div class="glossary-portal-aside__panel">
<ul class="glossary-portal-aside__list">
{usefulLinks.map((item) => (
<li><a href={item.href}>{item.label}</a></li>
))}
</ul>
</div>
</details>
)}
</nav>
<style>
.glossary-portal-aside{
display: flex;
flex-direction: column;
gap: 14px;
}
.glossary-portal-aside__block{
border: 1px solid rgba(127,127,127,0.22);
border-radius: 16px;
padding: 14px;
background: rgba(127,127,127,0.05);
}
.glossary-portal-aside__back{
display: inline-block;
margin-bottom: 10px;
font-size: 14px;
font-weight: 700;
line-height: 1.35;
text-decoration: none;
}
.glossary-portal-aside__title{
font-size: 16px;
font-weight: 800;
letter-spacing: .2px;
line-height: 1.3;
}
.glossary-portal-aside__meta{
margin-top: 8px;
font-size: 13px;
line-height: 1.4;
opacity: .8;
}
.glossary-portal-aside__heading{
margin: 0 0 11px;
font-size: 14px;
font-weight: 800;
line-height: 1.35;
opacity: .94;
}
.glossary-portal-aside__list{
list-style: none;
margin: 0;
padding: 0;
}
.glossary-portal-aside__list li{
margin: 7px 0;
}
.glossary-portal-aside__list a{
text-decoration: none;
font-size: 14px;
line-height: 1.4;
}
@media (max-width: 980px){
.glossary-portal-aside{
gap: 12px;
}
.glossary-portal-aside__block{
padding: 12px;
border-radius: 14px;
}
}
@media (max-width: 760px){
.glossary-portal-aside{
gap: 10px;
}
.glossary-portal-aside__block{
padding: 11px 12px;
border-radius: 14px;
}
.glossary-portal-aside__back{
margin-bottom: 8px;
font-size: 13px;
}
.glossary-portal-aside__title{
font-size: 15px;
line-height: 1.22;
}
.glossary-portal-aside__meta{
margin-top: 6px;
font-size: 12px;
line-height: 1.32;
}
.glossary-portal-aside__heading{
margin-bottom: 8px;
font-size: 13px;
line-height: 1.22;
}
.glossary-portal-aside__list li{
margin: 5px 0;
}
.glossary-portal-aside__list a{
font-size: 12.5px;
line-height: 1.3;
}
}
@media (orientation: landscape) and (max-width: 920px) and (max-height: 520px){
.glossary-portal-aside{
gap: 8px;
}
.glossary-portal-aside__block{
padding: 9px 10px;
border-radius: 12px;
}
.glossary-portal-aside__back{
margin-bottom: 6px;
font-size: 12px;
}
.glossary-portal-aside__title{
font-size: 14px;
line-height: 1.18;
}
.glossary-portal-aside__meta{
margin-top: 4px;
font-size: 11px;
line-height: 1.24;
}
.glossary-portal-aside__heading{
margin-bottom: 6px;
font-size: 12px;
line-height: 1.18;
}
.glossary-portal-aside__list li{
margin: 4px 0;
}
.glossary-portal-aside__list a{
font-size: 11.5px;
line-height: 1.22;
}
}
@media (prefers-color-scheme: dark){
.glossary-portal-aside__block{
background: rgba(255,255,255,0.04);
}
}
.glossary-portal-aside__disclosure{
padding: 0;
overflow: hidden;
}
.glossary-portal-aside__summary{
list-style: none;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 14px;
cursor: pointer;
user-select: none;
}
.glossary-portal-aside__summary::-webkit-details-marker{
display: none;
}
.glossary-portal-aside__summary .glossary-portal-aside__heading{
margin: 0;
}
.glossary-portal-aside__disclosure:not([open]) .glossary-portal-aside__panel{
display: none;
}
.glossary-portal-aside__chevron{
flex: 0 0 auto;
font-size: 14px;
line-height: 1;
opacity: .72;
transition: transform 160ms ease, opacity 160ms ease;
}
.glossary-portal-aside__disclosure[open] .glossary-portal-aside__chevron{
transform: rotate(180deg);
opacity: .96;
}
.glossary-portal-aside__panel{
padding: 0 14px 14px;
}
@media (max-width: 980px){
.glossary-portal-aside__summary{
padding: 12px;
}
.glossary-portal-aside__panel{
padding: 0 12px 12px;
}
}
</style>