@gouvfr/dsfr-roller
Version:
Le module `dsfr-roller` permet de publier le site de documentation du Système de Design de l’État - DSFR
60 lines (54 loc) • 1.79 kB
JavaScript
import { Node } from '../../../node.js'
import { log } from '@gouvfr/dsfr-forge';
class AccordionContainerDirective extends Node {
structure (data) {
if (!data.properties.id) {
log.warn('AccordionContainerDirective: missing "accordion id"');
return data;
}
const accordionId = data.properties.id;
const titleChildren = data.children.filter(child => child?.data?.directiveLabel)?.[0]?.children;
const contentChildren = data.children.filter(child => !child?.data?.directiveLabel);
const titleType = titleChildren[0].value.startsWith('#') ? 'heading' : 'paragraph';
const titleDepth = /^(#+)/.exec(titleChildren[0].value)?.[1]?.length;
if (titleType === 'heading') {
titleChildren[0].value = titleChildren[0].value.replace(/^(#+)\s*/, '');
}
return super.structure({
type: 'htmlContainer',
tagName: 'div',
classes: ['fr-accordion'],
children: [
{
type: titleType,
depth: titleDepth,
classes: ['fr-accordion__title'],
children: [
{
type: 'htmlContainer',
tagName: 'button',
classes: ['fr-accordion__btn'],
attributes: {
type: 'button',
'aria-expanded': data.properties['aria-expanded'] || false,
'aria-controls': accordionId
},
children: titleChildren
}
]
},
{
type: 'htmlContainer',
tagName: 'div',
attributes: {
id: accordionId
},
classes: ['fr-collapse'],
children: contentChildren
}
]
});
}
}
AccordionContainerDirective.NAME = 'fr-accordion';
export { AccordionContainerDirective };