/** * This page generates its content from the custom-element.json file as read by * the _data/api.11tydata.js script. */ module.exports = class Docs { data() { return { layout: 'page.11ty.cjs', title: ' ⌲ Docs', }; } render(data) { const manifest = data.api['11tydata'].customElements; const elements = manifest.modules.reduce( (els, module) => els.concat( module.declarations?.filter((dec) => dec.customElement) ?? [] ), [] ); return `

API

${elements .map( (element) => `

<${element.tagName}>

${element.description}
${renderTable( 'Attributes', ['name', 'description', 'type.text', 'default'], element.attributes )} ${renderTable( 'Properties', ['name', 'attribute', 'description', 'type.text', 'default'], element.members.filter((m) => m.kind === 'field') )} ${renderTable( 'Methods', ['name', 'parameters', 'description', 'return.type.text'], element.members .filter((m) => m.kind === 'method' && m.privacy !== 'private') .map((m) => ({ ...m, parameters: renderTable( '', ['name', 'description', 'type.text'], m.parameters ), })) )} ${renderTable('Events', ['name', 'description'], element.events)} ${renderTable( 'Slots', [['name', '(default)'], 'description'], element.slots )} ${renderTable( 'CSS Shadow Parts', ['name', 'description'], element.cssParts )} ${renderTable( 'CSS Custom Properties', ['name', 'description'], element.cssProperties )} ` ) .join('')} `; } }; /** * Reads a (possibly deep) path off of an object. */ const get = (obj, path) => { let fallback = ''; if (Array.isArray(path)) { [path, fallback] = path; } const parts = path.split('.'); while (obj && parts.length) { obj = obj[parts.shift()]; } return obj == null || obj === '' ? fallback : obj; }; /** * Renders a table of data, plucking the given properties from each item in * `data`. */ const renderTable = (name, properties, data) => { if (data === undefined || data.length === 0) { return ''; } return ` ${name ? `

${name}

` : ''} ${properties .map( (p) => `` ) .join('')} ${data .map( (i) => ` ${properties.map((p) => ``).join('')} ` ) .join('')}
${capitalize( (Array.isArray(p) ? p[0] : p).split('.')[0] )}
${get(i, p)}
`; }; const capitalize = (s) => s[0].toUpperCase() + s.substring(1);